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

app : TicTacToeApproot = Tkstate = GameStatebuttons = list[Button]status_var = StringVarscore_var = StringVar
app przechowuje widżety i LINK do stanu, a nie odwrotnie.

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/columnrender() - 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
Otwórz praktykę →