Završni projekat se gradi malim, korisnim koracima.
Do sada si vežbao pojedinačne Python i OOP ideje. U završnom projektu spojićeš ih u jednu lokalnu aplikaciju: Task Manager za organizovanje manjih zadataka.
task_manager/
├── main.py
├── models/
│ ├── __init__.py
│ └── task.py
└── services/
├── __init__.py
└── task_manager.pymodels sadrži objekte podataka. services sadrži kod koji koordinira te objekte. main.py pokreće malu demonstraciju. Naredni koncepti će dodati operacije nad zadacima, JSON čuvanje i testove bez promene ovih odgovornosti.
Task predstavlja jedan podatak. TaskManager upravlja kolekcijom Task objekata i kasnije će nuditi operacije nad njom. Ovo razdvajanje sprečava da jedna klasa pokušava da radi sve.
Stabilan dogovor projekta: Svaki Task imaće tekstualni task_id, naslov i stanje završenosti. Svaki TaskManager imaće sopstvenu listu tasks. Koncept 29 dodaje upravljanje zadacima, koncept 30 čuva podatke kao JSON, a koncept 31 proverava pravila testovima.
class Task:
"""Represent one task in the local project."""
def __init__(self, task_id: str, title: str) -> None:
self.task_id = task_id
self.title = title
self.completed = False
class TaskManager:
"""Keep this manager instance's tasks together."""
def __init__(self) -> None:
self.tasks: list[Task] = []
def add_task(self, task: Task) -> None:
self.tasks.append(task)Konstruktor svakom TaskManageru daje novu praznu listu. Lista je instancni atribut, pa dodavanje zadatka jednom menadžeru ne dodaje ga drugom. Oznake tipova i kratki docstringovi čine nameravane uloge čitljivijim, ali ne dodaju automatsku validaciju.
from models.task import Task
from services.task_manager import TaskManagerTačka u importu prati foldere projekta. Prazni fajlovi __init__.py jasno označavaju ove foldere kao klasične Python pakete, što je pogodno za početnički projekat.
from models.task import Task
from services.task_manager import TaskManager
first_manager = TaskManager()
second_manager = TaskManager()
first_manager.add_task(Task("task-1", "Read the project plan"))
print(len(first_manager.tasks))
print(len(second_manager.tasks))Izlaz je 1, a zatim 0. Prvi menadžer je dobio jedan Task; drugi menadžer počinje nezavisno, bez zadataka.
Kako će projekat rasti
- Koncept 28 — Napravi osnovuNapravi foldere, Task, TaskManager, importe i malu demonstraciju koja može da se pokrene.
- Koncept 29 — Upravljaj zadacimaNadogradi add_task() jasnim funkcionalnostima za prikaz zadataka, pronalaženje zadatka, promenu njegovog statusa i brisanje.
- Koncept 30 — Sačuvaj lokalnoDodaj mali modul za JSON čuvanje kako bi se podaci o zadacima čuvali i učitavali iz lokalnog fajla.
- Koncept 31 — Zaštiti pravilaKoristi unittest da proveriš klase, ponašanje menadžera i lokalno čuvanje podataka.
Česte greške u strukturi projekta
- Jedna zajednička lista klaseNe piši tasks = [] direktno u TaskManager za ovaj projekat. Stavi self.tasks = [] u __init__ kako bi svaki menadžer počinjao odvojeno.
- Stavljanje svake odgovornosti u main.pyČuvaj podatke u Task, a ponašanje kolekcije u TaskManager. main.py treba da pokaže kako delovi rade zajedno.
- Prerano pravljenje budućih funkcionalnostiJoš ne dodaj JSON fajlove ni ceo komandni meni. Najpre napravi i pokreni ovu malu osnovu.
