Разделение логики и данных в браузерной игре


8

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

  • Есть два (пока) типа сущностей, которые могут участвовать в бою. Давайте просто назовем их игроками и неигровыми персонажами. Их данные уже написаны довольно хорошо.
  • Когда они участвуют в бою, эти объекты обертываются другим объектом в БД Combatant, который называется a , который дает им информацию о конкретном бою. Они могут участвовать в нескольких боях одновременно.
  • Я пытаюсь написать логику для боя, вводя в него бойцов.
  • Я хочу быть в состоянии высмеять все для тестирования.

Чтобы разделить логику и данные, я хочу иметь два интерфейса / базовых класса, один из которых ICombatantDataявляется другим ICombatantLogic. Два реализатора данных будут один для реальных объектов, хранящихся в базе данных, а другой для моих фиктивных объектов.

Сейчас я сталкиваюсь с неопределенностью при разработке логической стороны вещей. У меня может быть один исполнитель для каждого из игроков и NPC, но у меня есть проблема. Комбатант должен иметь возможность вернуть сущность, которую он оборачивает. Должен ли этот метод получения быть частью логики или данных? Я твердо считаю , что это должно быть в данных, так как логика часть используется для выполнения боевых и не будет доступна , если кто - то просто смотрит информацию о предстоящей борьбе. Но классы данных только отделяют макет от БД, а не игрока от NPC. Если я попытаюсь иметь два дочерних класса для реализации данных БД, по одному для каждого типа сущности, то как мне это спроектировать, сохраняя при этом мои макеты в цикле? Нужен ли какой-то третий интерфейс, подобный тому, IEntityProviderкоторый я внедряю в классы данных?

Кроме того, с некоторыми из идей, которые я рассматривал, я чувствую, что мне придется поставить чеки, чтобы убедиться, что вы не несоответствуете, например, сделать логику для NPC случайно обернуть данные для игрока. Имеет ли это хоть какой-то смысл? Это ситуация, которая была бы даже возможна, если архитектура правильна, или правильный дизайн полностью запрещает это, так что мне не нужно проверять это?

Если бы кто-то мог помочь мне просто составить схему класса или что-то для этого, это бы мне очень помогло. Спасибо.

редактировать

Также полезно отметить, что класс фиктивных данных на самом деле не нуждается в Entity, так как вместо этого я просто укажу все параметры, такие как боевая статистика. Так что, возможно, это повлияет на правильный дизайн.


Я предполагаю, Combatant.entityчто не используется во время боя и поэтому не должно существовать. Возможно, вам нужен другой класс, например, EntityVsEntityCombatкоторый оборачивает боевую логику, содержит Entity <--> Combatantотображения и обновления Entityсостояний после окончания боя? Может быть, немного больше информации о вашей текущей архитектуре может помочь.
Великий

Ответы:


1

Часть того, как я подходил к этому в прошлом, заключается в том, что вместо того, чтобы иметь совершенно отдельные представления для игроков и неигровых персонажей, требуя, чтобы они оба реализовали общий интерфейс, способствуя сближению представлений между ними в максимально возможной степени, насколько я могу, как подклассифицируя их из общей Characterмодели, в которую я вкладываю столько, сколько имеет смысл обобщать. Это помогает избежать проблем с выполнением операций NPC на игроках и т. Д., Делая операции более общеприменимыми, поскольку у представлений менее естественная тенденция расходиться, чем если бы они были полностью независимыми реализациями. Базовое использование полиморфизма помогает обрабатывать случаи, которые должны расходиться (например, если вы сделали вашCombatantLogicОтвечая за то, что происходит, когда кто-то умирает, вы должны будете выполнить проверку типов, чтобы убедиться, что вы использовали правильную логику; так что не делайте так, чтобы игроки и неигровые персонажи применяли отдельные подходящие die()методы.

Я согласен, что ваша Entityчасть данных. Однако, основываясь на том, что я говорил, я бы на самом деле склонялся к тому, чтобы исключить или ограничить вашу роль CombatantDataв пользу того, чтобы боевая логика извлекала значения непосредственно из Entity, возможно, CombatantDataтолько хранения дорогих вычисленных значений, специфичных для отдельного боя. Тогда ваши тестовые макеты будут больше ориентированы на создание поддельных Entityмоделей, чем на заполнение CombatantData. ( CombatantDataДублирование большого количества информации Entityбеспокоит меня так же, как и денормализованная база данных. Однако, если вы верите в Закон Деметры, а я страстно этого не делаю, вы не захотите делать то, что я Я предлагаю. Конечно, если вы верите в закон Деметры, я не уверен, что выCombatantDataдолжен даже предоставить доступ к Entity.)


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

@ Тессерекс: Ах, хорошо. Если это состояние не сохраняется между боями, то это разумно. Не обращайте внимания на эту часть. :) Имеет ли смысл то, что я говорю?
хаос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.