Я пытаюсь разработать карточную игру с Kotlin, но я чувствую, что сложные архитектурные решения, которые я должен принять, останавливают мой процесс.Я хотел бы создать прочную и гибкую основу для потенциально десятков разных карт с разными эффектами, разных типов (например, заклинание, транспортное средство, оружие ...).
Интуитивно я чувствую, что хочу дать каждому разную Card
его собственный подкласс был бы нелепым по нескольким причинам, таким как потеря гибкости (не может (без сумасшедших хаков) динамически создавать новые виды карт) и эскалация сложности.
С другой стороны,быть разными категориями карточек (типов), которые, как правило, имеют больше общего друг с другом, чем с карточками, поэтому мне кажется, что я определенно должен подкласс Card
, потому что в противном случае я бы получил перечисления типа (SPELL, WEAPON, VEHICLE ...)и уродливые операторы switch, заменяющие то, с чем обычно имеют дело наследование и полиморфизм.
У меня изначально были проблемы с представлением, как получить доступ к определенному поведению подклассов, которые живут в коллекциях суперклассов, но теперь я понимаю, как я могу решить эту проблему, используяшаблон посетителя- пока все хорошо.
Моя проблема сейчас в том, что этот архитектурный подход, кажется, конфликтует с другими вещами, которые я запланировал, и которые я считаю необходимыми или, по крайней мере, очень полезными: Гибрид прототипа-мухи:создали «циклопедию» прототипов карт, которые можно скопировать.Карты состоят из общей статической части и уникальной динамической части:
Естественно, я хотел бы создать подстанции идентифицирующих компонентов следующим образом:
Кажется, что это невозможно сделать удовлетворительным образом, независимо от того, как я к нему подхожу.Существует много решений, но все они кажутся мне слабыми компромиссами:
- Выполнение так, как я описал, означает, что подклассы должны сохранять несколько ссылок на свои компоненты;базовый класс и один подкласс один для каждого.Это также приводит к ужасной ситуации, когда атрибуты типа распределены по нескольким классам компонентов, все они зависят друг от друга.
- Использование интерфейсов вместо наследования приводит к нагрузкам дублирования кода.
- Подклассы толькокомпоненты, но не сама карта, скрывает информацию о типе во внутренностях карт, а также требует уродливых размышлений для доступа к признакам подкласса.
- Реализация эквивалента данных типа информации о типе вместо подклассов, чтобы обойти ограничивающие правила иерархий наследования Kotlinкажется хакерским и лишает поддержки IDE.
Я уверен, что за последние две недели я рассмотрел еще больше подходов, но это все, что я могу вспомнить прямо сейчас.
Я знаю, что вам, вероятно, потребуется более полная информация о том, что я планирую сделать, чтобы дать мне конкретные ответы, но, поскольку это слишком сложно, и я тоже не знаю, где это происходит, я удовлетворенгрубые идеи в тОн чувствует, что «подумайте об этом» или «что бы вы ни делали, держитесь подальше от этого» или общего совета о том, как справиться с таким «дизайнерским кризисом», когда вещи кажутся такими сложными, что вы не знаете, как начать.
Конечно, я готов разработать или детализировать части моего описания, если это станет необходимым.