Rozdział 17 · Architektura
Architektura TicTacToeApp
app.root, a nie class TicTacToeApp(tk.Tk), jest tym samym składem co w rozdziale 16.
app HAS-A root — to nie jest dziedziczenie po Tk
Składanie a dziedziczenie
Możliwe, ale niekonieczne
class TicTacToeApp(tk.Tk):
def __init__(self):
super().__init__()
...
Jak w rozdziale 16
class TicTacToeApp:
def __init__(self, root):
self.root = root
...
Co używać dzisiaj: Dziedzictwo od
tk.Tk technicznie działa, ale nie jest konieczne i nie zgadza się ze sposobem konstrukcji załączników w rozdziale 16. app.root (kompozycja, „HAS-A”Graf obiektowy aplikacji
Domena kontra UI — podział odpowiedzialności
| Czysta logika domenowa (brak Tkinter) | UI- logika (wewnątrz TicTacToeApp) |
|---|---|
| find_winner(board) | on_cell_click / attempt_move – wywołuje domenę, a potem render |
| is_draw(board) | on_cell_enter / on_cell_leave - Zapowiedź |
| index → row/column | render() - Rysuje widżety Z modelu (state) |
| new_round() / new_match() – Cykl życia |
Sprawdzanie „czy mogę testować bez okna?”
Dobry test architektury: jeśli do sprawdzenia funkcji konieczne jest otwarcie okna Tkinter — to prawdopodobnie UI- logika. Jeśli można ją wywołać z normalną listą/łańcuchem i uzyskać wynik — to logika domeny i MOŻNA byłoby ją wyodrębnić jako osobny moduł.
Praktyka: Złóż graf obiektowy TicTacToeApp
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie