枚举类型是否适合表示对象状态?

4
在我的当前项目中,首席开发者禁止我使用任何枚举。他认为枚举只会引起问题,我只有在强制情况下才能使用它,例如与需要枚举的外部应用程序/库进行通信时。
他告诉我应该针对每一个状态都有一个对象。例如,我们有一个名为Soldier的游戏对象。因此,我必须拥有以下对象: - RunningSoldier - SittingSoldier - StandingSoldier 他的做法正确吗?我不这么认为。我的唯一理由是我不想编写这么多类。
谢谢!

3
他解释为什么他认为枚举类型是“问题”了吗? - Selman Genç
听起来他是状态设计模式的坚定信仰者。我认为枚举是一组有意义的值,而不一定是对象状态的表示。在你的例子中,使用不同的类作为不同类型的士兵可能会带来好处,因为这些士兵可能有其他方面依赖于它们当前的状态,这正是状态模式的合理性所在。 - o_weisman
通常情况下,枚举类型的类型不够明确。建议使用代数数据类型来替代。 - Mauricio Scheffer
这个问题与SO不相关,且基于观点。是否为不同状态引入不同的类取决于你打算如何与你的对象交互。 - CodeCaster
1
我认为这没有什么区别。只要我所需的是单个值,我通常会从“枚举”开始。一旦状态有其他相关数据(如成本、持续时间等),那么我就会转换为类。在Visual Studio中,这种重构是微不足道的。争论它的时间和创建类直到需要它们的时间都是浪费。 - Origin
显示剩余3条评论
1个回答

7
对于您的情况,枚举不是很好。因为我认为“RunningSoldier”将具有不同于其他类型士兵的属性/方法。如果您为状态设置了枚举,则在每个方法中都会有if / else / switch条件。因此,您的方法将变得复杂且难以维护。所以最好使用具有基本士兵类(面向对象编程概念)的不同类。
更新:
如果您需要添加另一种士兵类型,则添加一个类比枚举更容易。对于枚举,您必须遍历所有方法(移动,跳跃,开火等)。但对于类情况,很容易添加新类并实现这些方法。简单易行。
可能在某些其他情况下,枚举比分离的类更好。例如货币类型或单位的枚举。我在代码中有一个方法,它接受两个枚举并从一个值转换。
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();
}

士兵只是一个例子。枚举更适用的情况有哪些? - apukineimakiapudjuh
1
当然有。例如,当您打开文件时,可以在那里给出特定的枚举(标志)。另一个例子是货币类型或单位的枚举。 - fhnaseer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接