Cześć,
w innym temacie oddałem do oceny mój pierwszy projekt w Pythonie - grę w Snake'a: https://4programmers.net/Forum/Oceny_i_recenzje/344882-snake_moj_pierwszy_projekt_w_pythonie?p=1714308
Gdyby ktoś nie chciał czytać tematu z moim Wężem, podaję bezpośredni link do repozytorium: https://github.com/bearek/snake
Mimo moich wielu lat doświadczenia programistycznego, nadal nie mam wyczucia w projektowaniu klas. Nigdy nie wiem ile zależności lub elastyczności to zbyt dużo.
Gra w Snake'a to idealny przykład na trening tworzenia klas. Aktualnie moja gra nie ma klasy reprezentującej samą postać węża. Chciałbym taką napisać, żeby odseparować elegancko węża od reszty kodu. Ale nie wiem co wąż "powinien", a czego "nie powinien". Mam na myśli przede wszystkim relację wąż-plansza. Planszę mam zaprogramowaną jako siatkę o wymiarach X×Y (a jakże). Mam kilka pomysłów na to, jak określić tę relację:
- Brak informacji o siatce w klasie Węża. Wąż byłby zaprogramowany jako lista kierunków, bez informacji o położeniu na siatce. Jakby nie patrzeć, to oddaje naturę węża - wąż się wije w określonych kierunkach i tyle.
- Informacja o szerokości i wysokości siatki, by móc przechowywać punkty węża w klasie Snake. Wtedy wąż mógłby wiedzieć np. żeby się zawinąć po przejściu krawędzi ekranu, a także wiedziałby, kiedy gryzie sam siebie. W przypadku pomysłu 1. również wykryłbym pętlę, w której wąż sam się dziabnął, ale już np. śmierci w wyniku zbyt długiego węża, który po zawinięciu się doszedł aż do własnego ogona - nie.
- Użycia planszy jako dependency i na tej podstawie obliczanie logiki węża.
Nie mam wyczucia które rozwiązanie jest uznawane za "najczystsze" i czy w ogóle któreś.
Czy jest jakiś zestaw pytań, które mogę sobie zadać, by jak najlepiej zaprojektować klasy? Czy może te trzy powyższe rozwiązania są równie dobre? Chciałbym wyrobić w sobie intuicję projektowania klas. Z góry dzięki za podpowiedzi :)