Presentationer Slide 1/1

Kap 3.8

Objektorienterat projekt

Nu sätter vi ihop flera klasser till ett mindre projekt.

Mål

Efter lektionen ska du kunna...

  • planera ett objektorienterat program
  • använda flera samverkande klasser
  • rita ett klassdiagram
  • strukturera kod i flera delar
  • testa klasser innan helheten byggs ihop

Projekt

Vad ska byggas?

Ett mindre Pythonprojekt.

Minst tre klasser som samarbetar.

Tydlig struktur, UML-diagram och fungerande kod.

Projektidéer

Välj ett område

  1. Bibliotekssystem: böcker, låntagare och bibliotek.
  2. RPG-strid: spelare, fiender och föremål.
  3. Receptplanerare: recept, ingredienser och inköpslistor.

Arbetsgång

Bygg i fem steg

  1. Designa klassdiagrammet.
  2. Skapa grundstrukturen.
  3. Lägg till logik och relationer.
  4. Testa objekt och metodanrop.
  5. Dokumentera hur programmet fungerar.

Planering

Frågor innan kod

  • Vilka objekt finns i problemet?
  • Vilka attribut behöver varje objekt?
  • Vilka metoder ska varje klass ha?
  • Vilka klasser känner till varandra?
  • Finns det arv, eller bara association?

Exempel

Bibliotekssystem

En bok kan lånas och lämnas tillbaka.

En medlem kan låna böcker.

Biblioteket håller reda på böcker och medlemmar.

UML

Bibliotekssystem

classDiagram
    Library --> Book : contains
    Library --> Member : registers
    Member --> Book : borrows

    class Book {
        -string title
        -string author
        -bool available
        +borrow() bool
        +return_book() void
        +get_title() string
        +__str__() string
    }

    class Member {
        -string name
        -list borrowed_books
        +borrow_book(book) void
        +return_book(book) void
        +list_books() void
        +get_name() string
    }

    class Library {
        -list books
        -list members
        +add_book(title, author) void
        +register_member(name) void
        +find_book(title) Book
        +find_member(name) Member
        +list_books() void
    }

Relationer

Vad visar diagrammet?

  • Library innehåller böcker.
  • Library registrerar medlemmar.
  • Member kan låna böcker.
  • Relationerna är associationer, inte arv.

Filer

Projektstruktur

library-project/
    book.py
    member.py
    library.py
    main.py
    README.md

Varje viktig klass kan ligga i en egen fil.

Book

Ansvar

  • Spara titel och författare.
  • Hålla reda på om boken är tillgänglig.
  • Lånas ut med borrow().
  • Lämnas tillbaka med return_book().

Book

Kod

class Book:
    def __init__(self, title, author):
        self._title = title
        self._author = author
        self._available = True

    def borrow(self):
        if self._available:
            self._available = False
            return True
        return False

    def return_book(self):
        self._available = True

Member

Ansvar

  • Spara medlemmens namn.
  • Spara lånade böcker i en lista.
  • Låna bok genom att anropa book.borrow().
  • Lämna tillbaka bok genom att anropa book.return_book().

Member

Kod

class Member:
    def __init__(self, name):
        self._name = name
        self._borrowed_books = []

    def borrow_book(self, book):
        if book.borrow():
            self._borrowed_books.append(book)
            print(f"{self._name} lånade {book.get_title()}.")
        else:
            print(f"{book.get_title()} är redan utlånad.")

Library

Ansvar

  • Spara alla böcker.
  • Spara alla medlemmar.
  • Lägga till böcker och medlemmar.
  • Hitta bok eller medlem med sökning.

Library

Kod

class Library:
    def __init__(self):
        self._books = []
        self._members = []

    def add_book(self, title, author):
        book = Book(title, author)
        self._books.append(book)

    def register_member(self, name):
        member = Member(name)
        self._members.append(member)

main.py

Sätt ihop projektet

lib = Library()

lib.add_book("1984", "George Orwell")
lib.register_member("Oskar")

book1 = lib.find_book("1984")
member = lib.find_member("Oskar")

if book1 and member:
    member.borrow_book(book1)

Testa

Testa i små delar

  • Testa först Book ensam.
  • Testa sedan Member med en bok.
  • Testa sedan Library.
  • Bygg ihop allt i main.py sist.

Alternativ

RPG-strid

classDiagram
    Player --> Character : inherits
    Enemy --> Character : inherits
    Player --> Item : uses

    class Character
    Character : name
    Character : hp
    Character : attack
    Character : is_alive()
    Character : take_damage(amount)
    Character : deal_damage(target)

    class Player
    Player : inventory
    Player : use_item(item)

    class Enemy
    Enemy : name
    Enemy : hp

    class Item
    Item : name
    Item : effect
    Item : use(target)

Alternativ

Receptplanerare

classDiagram
    MealPlanner --> Recipe : stores
    Recipe --> Ingredient : contains

    class Ingredient {
        -string name
        -float amount
        -string unit
        +__str__() string
    }

    class Recipe {
        -string name
        -list ingredients
        +add_ingredient(name, amount, unit) void
        +list_ingredients() void
    }

    class MealPlanner {
        -list recipes
        +add_recipe(recipe) void
        +list_all_recipes() void
        +generate_shopping_list() void
    }

Öva

Planera ditt projekt

  1. Välj projektidé.
  2. Rita klassdiagram.
  3. Lista attribut och metoder.
  4. Skapa minst tre samverkande klasser.
  5. Presentera kodstruktur och ansvar.

Sammanfattning

Kom ihåg

  • Ett OOP-projekt består av flera samverkande klasser.
  • UML hjälper dig planera innan du kodar.
  • Varje klass ska ha ett tydligt ansvar.
  • Testa varje klass innan helheten byggs ihop.
  • Dokumentera hur projektet körs.