枚举是否适合指示对象状态?
Are enum good to indicate object state?
我当前项目的首席开发人员禁止我使用任何枚举。他声称枚举只是问题。我只能在被迫时使用它 - 当与需要枚举的外部 applications/libraries 通信时。
他说我应该对每个州都有反对意见。例如,我们有一个对象为 Soldier 的游戏。所以我必须有对象:
- 奔跑的士兵
- 坐着的士兵
- 常备士兵
他说的对吗?我感觉不到。我只有我不想写那么多的论点类。
谢谢!
对于您的情况,枚举很糟糕。因为我认为 RunningSoldier 与其他类型的士兵会有不同的 properties/methods。如果你有一个状态枚举,那么在你的每个方法中你都会有一个 if/else/switch 条件。所以你的方法会很大而且更难维护。所以最好有不同的 classes 和一个基础士兵 class(OOP 概念)。
更新:
如果您需要为士兵添加其他类型,那么添加 class 会比枚举更容易。至于枚举,你必须经历所有的方法(移动、跳跃、开火等)。但是对于 class 的情况,很容易添加一个新的 class 并实现这些方法。漂亮又简单。
在某些其他情况下,枚举可能比单独的 class 更好。例如 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();
}
我当前项目的首席开发人员禁止我使用任何枚举。他声称枚举只是问题。我只能在被迫时使用它 - 当与需要枚举的外部 applications/libraries 通信时。 他说我应该对每个州都有反对意见。例如,我们有一个对象为 Soldier 的游戏。所以我必须有对象: - 奔跑的士兵 - 坐着的士兵 - 常备士兵
他说的对吗?我感觉不到。我只有我不想写那么多的论点类。
谢谢!
对于您的情况,枚举很糟糕。因为我认为 RunningSoldier 与其他类型的士兵会有不同的 properties/methods。如果你有一个状态枚举,那么在你的每个方法中你都会有一个 if/else/switch 条件。所以你的方法会很大而且更难维护。所以最好有不同的 classes 和一个基础士兵 class(OOP 概念)。
更新:
如果您需要为士兵添加其他类型,那么添加 class 会比枚举更容易。至于枚举,你必须经历所有的方法(移动、跳跃、开火等)。但是对于 class 的情况,很容易添加一个新的 class 并实现这些方法。漂亮又简单。
在某些其他情况下,枚举可能比单独的 class 更好。例如 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();
}