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


12

В качестве быстрого веселого проекта я попытался написать пасьянс. Но когда я начал писать системы правил, я чувствовал себя грязным , потому что мой код был совершенно неструктурированным и нерасширяемым , главным образом потому, что моя игровая логика была полным спагетти-кодом.

Я сталкивался с этой проблемой раньше и всегда чувствовал себя неловко при написании этой части моей программы, поэтому мне было интересно, есть ли проверенные и проверенные лучшие практики, когда дело доходит до определения правил в игре ?


1
Максимизировать инкапсуляцию и минимизировать сцепление
Джон Макдональд

Ответы:


2

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

Вы можете использовать шаблон Model View Controller: это перемещает (ограничивает) вашу проблему к «как реализовать поведение на контроллере», поведение, которое всегда следует правилам.

Если мы не говорим об очень простых правилах, то как вы их организовываете, создает проблему выразительности . Вы всегда сталкиваетесь с противоречивыми требованиями простоты (структурированности) и выразительности (напишите забавные правила).

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

Сказав это, вы можете найти полезным реализовать контроллер с использованием шаблона «Стратегия» и / или шаблона «Состояние» для составления сложного поведения с точки зрения более простого переключаемого поведения. Цепочки поставок-resposibility модель может помочь вам выразить правила в то время как государственный аппарат следует использовать осторожно , потому что его «состояние» частично перекрывает смысл в модели «государственного».

Использование шаблона Command в контроллере может быть полезным как для уменьшения ответственности контроллера (команда знает, как обращаться с моделью), так и для упрощения добавления функций отмены / возврата в контроллере.

В любом случае, вы должны попытаться использовать шаблоны проектирования в качестве ориентира: они полезны, чтобы не изобретать колесо, особенно квадратное колесо, но решение не каждой проблемы состоит из множества (круглых) колес, соединенных вместе.


2

Я не уверен в том, чтобы быть лучшим или даже хорошим, но я обычно использую паттерн Observer . Это работало достаточно хорошо для меня.


1
Вы можете сделать пример?
Густаво Масиэль

Вы можете создать наблюдателя для каждого правила, а затем прикрепить их к состоянию игры. После каждого хода игровое состояние призывает всех наблюдателей проверить, применяется ли какое-либо из этих правил.
Ali1S232

0

Если вы не выполняли эту работу много раз, вы всегда будете получать код спагетти. На самом деле, на данный момент, вы только начали: у вас есть черновик предварительной спецификации. Ознакомьтесь с некоторыми другими советами здесь и сделайте некоторые серьезные переписывания. А потом еще немного переписать, а потом ... Лично я никогда не уверен, приду ли я своему коду в отличной форме или мне просто надоело переписывать его, но, похоже , я все-таки понял это правильно.

Решать проблему с двух сторон. Постарайтесь , чтобы получить общий дизайн , чтобы понять и выбрать мелкие детали , которые занимаются простыми делами и сделать их право. Затем попробуйте проложить путь с обоих концов к середине. А затем работайте от середины спины к обоим концам. Затем сверху вниз, затем снизу вверх. Затем повторите весь процесс.

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

Важно сделать все как можно лучше. Плохой код будет преследовать вас до того дня, когда вы его выбросите. С программным обеспечением немного дополнительной полировки всегда окупается. (Если никто не заканчивает тем, что использовал код ....)

Подводя итог: ознакомьтесь с реальными советами, данными в других ответах, затем переписывайте свой код, пока не получите то, что вам нравится.


Таким образом, ваш ответ в основном «прочитайте другие ответы и сделайте чистый код, или вы пожалеете» ...
kaoD

@kaoD: да. Но также: ваша первая попытка кодирования, вероятно, будет нежелательной. (Если это не так, значит, вы недостаточно усердно работаете.) Чтобы собрать его, потребуется много тяжелой работы, а также немного исследований и размышлений. Это нормально при написании вовлеченной программы. Все усилия, затраченные таким образом, сэкономят время, усилия и горе в долгосрочной перспективе (если программа все еще существует в долгосрочной перспективе). А также: ООП очень помогает, если вы можете освоить его. (Лучшее, что я могу сделать, не видя код.)
RalphChapin

4
Вы понимаете, что на самом деле вы НЕ отвечаете на вопрос?
kaoD

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

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