Files
nonograms/SOLID_EXPLANATION.md
2026-02-08 01:06:19 +01:00

2.5 KiB

Dokumentacja Architektury SOLID + Vue 3

Ten projekt został przepisany zgodnie z zasadami SOLID i najlepszymi praktykami Vue 3.

Implementacja Zasad SOLID

S - Single Responsibility Principle (Zasada Jednej Odpowiedzialności)

Każdy komponent i plik ma jedną, ściśle określoną rolę:

  • components/Cell.vue: Odpowiada TYLKO za wyświetlanie pojedynczej komórki i emitowanie zdarzeń kliknięcia. Nie wie nic o logice gry.
  • components/Hints.vue: Odpowiada TYLKO za wyświetlanie liczb (podpowiedzi).
  • composables/useNonogram.js: Zawiera logikę interakcji (kliknięcia, efekty).
  • stores/puzzle.js: Zarządza stanem aplikacji (grid, level, timer).

O - Open/Closed Principle (Zasada Otwarte/Zamknięte)

System jest otwarty na rozszerzenia, ale zamknięty na modyfikacje:

  • Nowe poziomy: Można dodać nowe zagadki w stores/puzzle.js (obiekt PUZZLES) bez zmieniania logiki renderowania siatki czy sprawdzania wygranej.
  • Theme/Styl: Style są oparte na zmiennych CSS (main.css), co pozwala na łatwą zmianę motywu bez ingerencji w komponenty.

L - Liskov Substitution Principle (Zasada Podstawienia Liskov)

W kontekście Vue, komponenty są wymienne i przewidywalne:

  • Komponenty Cell i Hints przyjmują proste propsy (state, hints) i nie polegają na "magicznych" globalnych stanach wewnątrz swojej struktury renderowania (poza wstrzykiwanym storem w kontenerach wyższego rzędu).

I - Interface Segregation Principle (Zasada Segregacji Interfejsów)

Komponenty otrzymują tylko te dane, których potrzebują:

  • Cell.vue otrzymuje tylko state, r, c. Nie dostaje całego obiektu puzzle ani store.
  • Hints.vue otrzymuje tylko tablicę liczb, a nie całą logikę gry.

D - Dependency Inversion Principle (Zasada Odwrócenia Zależności)

Wysokopoziomowe moduły nie zależą od niskopoziomowych szczegółów:

  • Pinia Store: Logika gry jest wstrzykiwana przez usePuzzleStore. Komponenty UI (Controls, GameBoard) zależą od abstrakcji store'a, a nie od konkretnej implementacji logiki wewnątrz komponentu.
  • Composables: Logika (useHints, useTimer) jest wydzielona do reużywalnych funkcji, co uniezależnia ją od cyklu życia konkretnego komponentu Vue.

Struktura Projektu

  • src/components/: Komponenty "głupie" (prezentacyjne) oraz kontenery.
  • src/composables/: Logika biznesowa (Hooki).
  • src/stores/: Globalny stan aplikacji (Pinia).
  • src/styles/: Globalne style i zmienne.

Uruchomienie

  1. npm install
  2. npm run dev