Шаблони проектування систем правил?


12

Як швидкий веселий проект, я спробував написати гру пасьянсу. Але коли я почав писати системи правил, я почувався брудним , тому що мій код відчував себе зовсім неструктурованим і незрозумілим , головним чином тому, що моя логіка гри була повним кодом спагетті.

Я раніше стикався з цією проблемою, і завжди відчуваю ніяковість при написанні цієї частини своєї програми, тому мені було цікаво, чи є якісь перевірені найкращі практики, коли справа стосується визначення правил у грі ?


1
Максимізуйте інкапсуляцію та мінімізуйте з’єднання
Джон Макдональд,

Відповіді:


2

Я не думаю, що існує унікальне рішення, оскільки багато конкретних проблем пов'язані з цією проблемою.

Ви можете використовувати модель Model View Controller: це переміщує (обмежує) вашу проблему до "як реалізувати поведінку на контролері", поведінку, яка завжди дотримується правил.

Якщо ми не говоримо про дуже прості правила, спосіб їх упорядкування не викликає проблем виразності . Ви завжди стикаєтесь із суперечливими вимогами бути простими (структурованими) та бути виразними (писати забавні правила).

Використання MVC спрощує вашу роботу, оскільки модель формалізує стан, тобто контекст, в якому застосовуються правила.

Сказав, що вам може бути корисним реалізувати контролер за допомогою шаблону стратегії та / або шаблону стану , щоб скласти складну поведінку з точки зору більш простої поведінки, що змінюється. Модель ланцюга реагування може допомогти вам висловити правила, тоді як державна машина повинна бути використана обережно, оскільки її "стан" частково перекриває значення моделі "стан".

Використання шаблону команд у контролері може бути корисним як для зменшення відповідальності контролера (Команда знає, як поводитися з моделлю), так і полегшує додавання функцій скасування / повторення в контролері.

У будь-якому випадку, ви повинні спробувати використовувати схеми дизайну як орієнтир: вони корисні, щоб не винаходити колесо, особливо квадратне колесо, але не кожне рішення проблеми складається з купки (круглих) коліс, зведених разом.


2

Я не впевнений, що найкращий чи навіть хороший, але зазвичай я використовую шаблон спостерігача . Це працювало досить добре для мене.


1
Ви можете зробити приклад?
Gustavo Maciel

ви можете створити спостерігача за кожним правилом, а потім приєднати їх до ігрового стану. після кожного повороту ігровий стан закликає всіх спостерігачів перевірити, чи застосовується якесь із цих правил.
Ali1S232

0

Якщо ви не робили цю роботу багато разів раніше, ви завжди будете мати код спагетті. Насправді, ви вже тільки почали: у вас є чорновий проект попередньої специфікації. Ознайомтеся з деякими іншими порадами тут і зробіть серйозні переписування. А потім ще кілька переписувань, а потім .... Особисто я ніколи не впевнений, чи зможу я отримати свій код у дійсно чудовій формі або просто нудьгую від його переписування, але я, мабуть, все зрозумію.

Вирішіть проблему з двох кінців. Спробуйте домогтися загального дизайну, щоб мати сенс і вибирайте невеликі деталі, які справляються з простими справами та роблять їх правильними. Потім спробуйте пропрацювати свій шлях з обох кінців до середини. А потім працюйте з середньої спини до обох кінців. Потім зверху вниз, потім знизу вгору. Потім повторіть весь процес.

По суті, у вас є колекція занять. Розглянемо клас А. Якщо клас A побудований добре, його класи, які використовують його, автоматично працюватимуть краще, якими б хорошими чи поганими вони не були. Якщо види використання класу А класи добре, ті які використовуються класи будуть робити більше, однак , добре чи погано вони є. Тож організуйте свої заняття якнайкраще, тоді переконайтесь, що кожен є найкращим класом, який він може бути.

Важливо, щоб це було максимально правильно. Поганий код буде переслідувати вас до дня, коли ви його викинете. За допомогою програмного забезпечення трохи додаткового полірування завжди окупається. (Якщо ніхто не закінчує використання коду ....)

Підводячи підсумок: перегляньте фактичну пораду, надану в інших відповідях, а потім перепишіть свій код, поки не отримаєте щось, що вам подобається.


Тож ваша відповідь в основному "читайте інші відповіді і чистіть код, або ви пошкодуєте" ...
якD

@kaoD: Так. Але також: ваша перша спроба кодування, ймовірно, буде непотрібною. (Якщо це не так, ви не наполягаєте на собі досить сильно.) Щоб зібрати це разом, знадобиться багато наполегливої ​​роботи, а також трохи досліджень та багато роздумів. Це нормально при написанні програми. Усі витрачені таким чином зусилля заощадять час, зусилля та скорботу в довгостроковій перспективі (якщо програма все-таки є в довгостроковій перспективі). А також: OOP допомагає великим часом, якщо ви можете розвісити його. (Найкраще, що я можу зробити, не побачивши код.)
RalphChapin

4
Ви усвідомлюєте, що насправді НЕ відповідаєте на питання?
якDD

Насправді, незалежно від того, чи був технічний пост Ральфа відповіддю чи ні, я думаю, що відповідь Ральфа говорила в першу чергу за мотивом ОП. Я вважаю, що це має велике значення для кодера, який не зрозумів, що рідко ви розробляєте код найкраще з першої спроби. Крім того, він запропонував підхід до боротьби з ним, який, здавалося, народився з досвіду Ральфа.
Стів H

@SteveH Я думаю, що його відповідь застосовна майже до будь-якого процесу розробки програмного забезпечення. Ви можете скопіювати і вставити його в будь-якому місці, і це підходить.
якДо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.