Являются ли enum хорошими для указания состояния объекта?

1

Ведущий разработчик в моем текущем проекте запрещает мне использовать любые перечисления. Он утверждает, что перечисления - это просто проблемы. Я могу использовать его только в том случае, если я вынужден - когда общаюсь с внешними приложениями/библиотеками, которые требуют перечисления. Он говорит, что у меня должен быть объект для каждого государства. Например, у нас есть игра с объектом Soldier. Поэтому у меня должны быть объекты: - RunningSoldier - SittingSoldier - StandingSoldier

Он прав? Я этого не чувствую. У меня есть только такие аргументы, как я не хочу писать так много классов.

Благодарю!

  • 3
    объяснил ли он, почему считает, что перечисления - это проблемы ?
  • 0
    Похоже, он преданный сторонник государственного образца дизайна. Я вижу перечисления как набор значимых значений и не обязательно представление состояния объекта. В случае вашего примера могут быть полезны различные классы, поскольку у разных типов солдат могут быть другие аспекты, которые зависят от их текущего состояния, которое является в точности рациональным для государства.
Показать ещё 6 комментариев
Теги:
enums

1 ответ

5
Лучший ответ

Для вашего случая перечисления плохие. Потому что я думаю, что RunningSoldier будет иметь разные свойства/методы, чем другие солдаты. Если у вас будет перечисление для состояния, то в каждом из ваших методов вы будете иметь условие if/else/switch. Таким образом, ваши методы будут большими и сложными для поддержания. Поэтому лучше иметь разные классы с базовым классом Солдата (концепции ООП).

Обновить:

Если вам нужно добавить другой тип для солдата, то добавление класса будет проще, чем перечисление. Что касается перечисления, вы должны пройти все методы (перемещение, прыжок, огонь и т.д.). Но для класса легко добавить новый класс и реализовать эти методы. Легко и приятно.

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

public static double ConvertUnits(this double original, SimplifiedUnits sourceUnits, SimplifiedUnits targetUnits)
{
    if (sourceUnits == targetUnits || sourceUnits == SimplifiedUnits.Unknown)
    return original;
    if (sourceUnits == SimplifiedUnits.Feet && targetUnits == SimplifiedUnits.Meters)
    return original * GeometryConstants.MetersPerFoot;
    if (sourceUnits == SimplifiedUnits.Meters && targetUnits == SimplifiedUnits.Feet)
    return original / GeometryConstants.MetersPerFoot;
        throw new NotSupportedException();
}
  • 0
    Солдат был просто примером. Есть ли ситуации, когда перечисления лучше?
  • 0
    конечно есть. Например, вы открываете файл, вы можете указать в нем определенный enum (флаг). Другим примером является enum для CurrencyType или Units.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню