Допустим, у меня есть класс Enemy, и конструктор будет выглядеть примерно так:
public Enemy(String name, float width, float height, Vector2 position,
float speed, int maxHp, int attackDamage, int defense... etc.){}
Это выглядит плохо, потому что конструктор имеет так много параметров, но когда я создаю экземпляр Enemy, мне нужно указать все эти вещи. Я также хочу, чтобы эти атрибуты были в классе Enemy, чтобы я мог перебирать их список и получать / устанавливать эти параметры. Я подумал, может быть, подкласс Enemy в EnemyB, EnemyA, в то время как жестко запрограммировал их maxHp и другие специфические атрибуты, но тогда я бы потерял доступ к их жестко закодированным атрибутам, если бы захотел перебрать список Enemy (состоящий из EnemyA, EnemyB и EnemyC ы).
Я просто пытаюсь научиться правильно кодировать. Если это имеет значение, я работаю в Java / C ++ / C #. Любая точка в правильном направлении приветствуется.
Ответы:
Решение состоит в том, чтобы объединить параметры в составные типы. Ширина и высота концептуально связаны - они определяют размеры врага и обычно будут необходимы вместе. Они могут быть заменены
Dimensions
типом или, возможно,Rectangle
типом, который также включает позицию. С другой стороны, может быть более целесообразно сгруппироватьposition
иspeed
вMovementData
тип, особенно если ускорение позже входит в картину. Из контекста я предполагаюmaxHp
, чтоattackDamage
иdefense
т. Д. Также принадлежат к одномуStats
типу. Таким образом, пересмотренная подпись может выглядеть примерно так:Мелкие детали того, где рисовать линии, будут зависеть от остальной части вашего кода и от того, какие данные обычно используются вместе.
источник
Enemy
это просто класс, который нацелен наPlayer
, но их общий базовый классCombatant
нуждается в статистике боя.Dimensions
/MovementData
как простые старые контейнеры данных) или методами (если он превращает их в абстрактные данные). типы / объекты). Например, если бы он еще не создалVector2
тип, он мог бы в итоге заняться векторной математикойEnemy
.Возможно, вы захотите взглянуть на шаблон Builder . По ссылке (с примерами шаблонов и альтернатив):
источник
Использование подклассов для предварительной установки некоторых значений нежелательно. Только подкласс, когда новый тип врага имеет другое поведение или новые атрибуты.
Шаблон завода обычно используются , чтобы абстрагироваться над точным используемым классом, но он также может быть использован , чтобы обеспечить шаблоны для создания объекта:
источник
Я бы зарезервировал подклассы для классов, которые представляют объект, который вы, возможно, захотите использовать независимо, например, класс символов, где все символы, а не только враги имеют имя, скорость, maxHp или класс для представления спрайтов, присутствующих на экране с шириной, высота, положение.
Я не вижу ничего плохого по своей сути в конструкторе с большим количеством входных параметров, но если вы хотите немного разбить его на части, у вас может быть один конструктор, который устанавливает большинство параметров, и другой (перегруженный) конструктор, который можно использовать установить конкретные и другие установить значения по умолчанию.
В зависимости от того, какой язык вы выберете, некоторые могут установить значения по умолчанию для входных параметров вашего конструктора, например:
источник
Пример кода для добавления к ответу Рори Хантера (на Java):
Теперь вы можете создавать новые экземпляры Enemy следующим образом:
источник