Projektowanie wzorców dla systemów reguł?

12

Jako szybki, zabawny projekt spróbowałem napisać grę w pasjansa. Ale kiedy pisałem system reguł, czułem się brudny , ponieważ mój kod wydawał się zupełnie nieustrukturyzowany i nierozerwalny , głównie dlatego, że moja logika gry była kompletnym kodem spaghetti.

Zetknąłem się z tym problemem już wcześniej i zawsze czuję się niezręcznie, pisząc tę ​​część mojego programu, więc zastanawiałem się, czy są jakieś sprawdzone najlepsze praktyki, jeśli chodzi o definiowanie reguł w grze ?

Dasuraga
źródło
1
Maksymalizuj enkapsulację i minimalizuj sprzężenie
John McDonald

Odpowiedzi:

2

Nie sądzę, aby istniało unikalne rozwiązanie, ponieważ wiele problemów wynika z konkretnego problemu.

Możesz użyć wzorca kontrolera widoku modelu: to przenosi (ogranicza) twój problem do „jak zaimplementować zachowanie na kontrolerze”, zachowanie, które zawsze przestrzega zasad.

O ile nie mówimy o bardzo prostych zasadach, sposób ich organizacji stanowi problem z wyrazistością . Zawsze masz do czynienia ze sprzecznymi wymogami bycia prostym (ustrukturyzowanym) i ekspresyjnym (pisz zabawne reguły).

Korzystanie z MVC upraszcza pracę, ponieważ model formalizuje stan, tj. Kontekst, w którym reguły są egzekwowane.

Powiedział, że użyteczne może być wdrożenie kontrolera przy użyciu wzorca strategii i / lub wzorca stanu w celu skomponowania złożonego zachowania pod względem prostszych zachowań przełączalnych. Chain-of-resposibility wzór może pomóc wyrazić zasady natomiast maszyna państwa należy stosować ostrożnie, ponieważ jego „stan” częściowo pokrywa znaczenie modelki z „państwo”.

Użycie wzorca poleceń w kontrolerze może być przydatne zarówno w celu zmniejszenia odpowiedzialności kontrolera (polecenie wie, jak postępować z modelem), jak i ułatwienia dodawania funkcji cofania / ponawiania w kontrolerze.

W każdym razie powinieneś spróbować użyć wzorców projektowych jako wytycznych: są one przydatne, aby uniknąć ponownego wynalezienia koła, szczególnie koła kwadratowego, ale nie każde rozwiązanie problemu składa się z kilku (okrągłych) kół razem.

FxIII
źródło
2

Nie jestem pewien, czy będę najlepszy, czy nawet dobry, ale zwykle używam wzorca Observer . Działało mi to wystarczająco dobrze.

Ali1S232
źródło
1
Czy możesz podać przykład?
Gustavo Maciel
możesz utworzyć obserwatora dla każdej reguły, a następnie dołączyć ją do stanu gry. po każdej turze stan gry wzywa wszystkich obserwatorów, aby sprawdzić, czy którakolwiek z tych zasad jest stosowana.
Ali1S232,
0

Jeśli nie wykonałeś tej pracy wiele razy, zawsze skończysz z kodem spaghetti. W tym momencie dopiero co zacząłeś: masz wstępny szkic wstępnej specyfikacji. Zapoznaj się z innymi poradami tutaj i poważnie przepisz. A potem jeszcze trochę przepisywania, a potem ... Osobiście nigdy nie jestem pewien, czy uda mi się naprawdę dobrze napisać mój kod, czy po prostu mam dość przepisywania go, ale wydaje mi się, że w końcu mam rację.

Rozwiąż problem z dwóch końców. Postaraj się, aby ogólny projekt miał sens i wybierz małe części, które wykonują proste prace domowe i poprawiają je. Następnie spróbuj przejechać przez oba końce w kierunku środka. Następnie przerabiaj od środka z powrotem do obu końców. Następnie od góry do dołu, a następnie od dołu do góry. Następnie powtórz cały proces.

Zasadniczo masz kolekcję zajęć. Zastanów się nad klasą A. Jeśli klasa A jest dobrze zbudowana, jej klasy, które z niej korzystają, będą automatycznie działać lepiej, niezależnie od tego, czy są dobre czy złe. Jeśli użyje klasy A Klasy dobrze, stosowanych klas zrobi więcej, jednak dobry czy zły one są. Więc zorganizuj swoje zajęcia najlepiej, jak potrafisz, a następnie upewnij się, że każda z nich jest najlepszą z możliwych.

Ważne jest, aby uzyskać jak najlepiej. Zły kod będzie cię prześladować do dnia, w którym go wyrzucisz. W przypadku oprogramowania odrobina dodatkowego polerowania zawsze się opłaca. (Chyba że nikt nie użyje kodu ....)

Podsumowując: sprawdź rzeczywiste porady podane w innych odpowiedziach, a następnie przepisz swój kod, aż uzyskasz coś, co lubisz.

RalphChapin
źródło
Więc twoja odpowiedź brzmi: „przeczytaj inne odpowiedzi i zrób czysty kod, inaczej pożałujesz” ...
kaoD
@kaoD: Tak. Ale także: Twoja pierwsza próba kodowania prawdopodobnie będzie śmieci. (Jeśli tak nie jest, nie naciskasz wystarczająco mocno). Złożenie go razem będzie wymagało ciężkiej pracy, a także badań i przemyśleń. Jest to normalne podczas pisania zaangażowanego programu. Cały wysiłek włożony w ten sposób pozwoli zaoszczędzić czas, wysiłek i smutek na dłuższą metę (jeśli program nadal będzie istniał na dłuższą metę). A także: OOP pomaga przez długi czas, jeśli możesz się zorientować. (Najlepsze, co mogę zrobić, nie widząc kodu.)
RalphChapin
4
Czy zdajesz sobie sprawę, że tak naprawdę NIE odpowiadasz na pytanie?
kaoD
Właściwie, niezależnie od tego, czy post Ralpha był technicznie odpowiedzią, czy nie, myślę, że odpowiedź Ralpha przemawiała w kierunku motywacji OP do zadawania pytania. Uważam, że ma to dużą wartość dla kodera, który nie zdał sobie sprawy, że rzadko zdarza się, aby projektować kod najlepiej za pierwszym razem. Zaproponował także podejście do radzenia sobie z tym, co wydawało się wynikać z doświadczenia Ralpha.
Steve H
@ SteveH Myślę, że jego odpowiedź dotyczy niemal każdego procesu inżynierii oprogramowania. Możesz skopiować i wkleić go w dowolnym miejscu i pasowałby.
kaoD