Советы о том, как сбалансировать архитектуру Полиморфизм / Наследование / ТипДанных с образцом Прототип / Мухи в сложной карточной игре? - PullRequest
0 голосов
/ 29 января 2019

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

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

С другой стороны,быть разными категориями карточек (типов), которые, как правило, имеют больше общего друг с другом, чем с карточками, поэтому мне кажется, что я определенно должен подкласс Card, потому что в противном случае я бы получил перечисления типа (SPELL, WEAPON, VEHICLE ...)и уродливые операторы switch, заменяющие то, с чем обычно имеют дело наследование и полиморфизм.

У меня изначально были проблемы с представлением, как получить доступ к определенному поведению подклассов, которые живут в коллекциях суперклассов, но теперь я понимаю, как я могу решить эту проблему, используяшаблон посетителя- пока все хорошо.

Моя проблема сейчас в том, что этот архитектурный подход, кажется, конфликтует с другими вещами, которые я запланировал, и которые я считаю необходимыми или, по крайней мере, очень полезными: Гибрид прототипа-мухи:создали «циклопедию» прототипов карт, которые можно скопировать.Карты состоят из общей статической части и уникальной динамической части: enter image description here

Естественно, я хотел бы создать подстанции идентифицирующих компонентов следующим образом: enter image description here

Кажется, что это невозможно сделать удовлетворительным образом, независимо от того, как я к нему подхожу.Существует много решений, но все они кажутся мне слабыми компромиссами:

  • Выполнение так, как я описал, означает, что подклассы должны сохранять несколько ссылок на свои компоненты;базовый класс и один подкласс один для каждого.Это также приводит к ужасной ситуации, когда атрибуты типа распределены по нескольким классам компонентов, все они зависят друг от друга.
  • Использование интерфейсов вместо наследования приводит к нагрузкам дублирования кода.
  • Подклассы толькокомпоненты, но не сама карта, скрывает информацию о типе во внутренностях карт, а также требует уродливых размышлений для доступа к признакам подкласса.
  • Реализация эквивалента данных типа информации о типе вместо подклассов, чтобы обойти ограничивающие правила иерархий наследования Kotlinкажется хакерским и лишает поддержки IDE.

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

Я знаю, что вам, вероятно, потребуется более полная информация о том, что я планирую сделать, чтобы дать мне конкретные ответы, но, поскольку это слишком сложно, и я тоже не знаю, где это происходит, я удовлетворенгрубые идеи в тОн чувствует, что «подумайте об этом» или «что бы вы ни делали, держитесь подальше от этого» или общего совета о том, как справиться с таким «дизайнерским кризисом», когда вещи кажутся такими сложными, что вы не знаете, как начать.

Конечно, я готов разработать или детализировать части моего описания, если это станет необходимым.

1 Ответ

0 голосов
/ 29 января 2019

Просто подумайте здесь.

А как насчет создания класса BaseCard с низкоуровневыми общими частями Card, а затем класса для каждой категории, который наследуется от BaseCard, с именем, подобным Category, где вы храните общие категории каждой категории,а затем классы CardofSomeType, наследуемые от соответствующей категории.Таким образом, в CardofSomeType вы наследуете что-либо релевантное от любого класса, и вы просто добавляете новые Card (s) ofSomeType (s) для расширения вашего набора.

О том, какие данные являются специфическими для экземпляра или совместно используются в классе, это ортогональнок этому и детали реализации каждого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...