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
- Bibliotekssystem: böcker, låntagare och bibliotek.
- RPG-strid: spelare, fiender och föremål.
- Receptplanerare: recept, ingredienser och inköpslistor.
Arbetsgång
Bygg i fem steg
- Designa klassdiagrammet.
- Skapa grundstrukturen.
- Lägg till logik och relationer.
- Testa objekt och metodanrop.
- 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?
Libraryinnehåller böcker.Libraryregistrerar medlemmar.Memberkan 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
Bookensam. - Testa sedan
Membermed en bok. - Testa sedan
Library. - Bygg ihop allt i
main.pysist.
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
- Välj projektidé.
- Rita klassdiagram.
- Lista attribut och metoder.
- Skapa minst tre samverkande klasser.
- 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.