嵌套枚举样式和约定
Nested Enum Style and Convention
我有一个控制 class 操作方式的枚举。此枚举仅适用于 class,因此感觉它应该嵌套。但是,class 需要枚举的一个实例作为成员,理想情况下,它的名称应与枚举相同。当然,这是不可能的。
我最关心的是提供一个清晰明了的 API。我看到的两个选项是:
嵌套枚举并将实例成员或枚举本身命名为 'less than perfect'
将枚举放在 class 之外,这会有点但不会真正污染命名空间,并且可能会降低可发现性。 (现在写这篇文章,让我印象深刻的是发现能力可能不是问题,因为只有一个使用点,属性)。
是否有针对此类情况的公认惯例?这是说明用例的片段:
public class MultiModeActionFacadeObject : IAction
{
public enum ActionMode // enum only applies to this class
{
Fast,
Accurate,
Intermediate
}
private readonly IAction _accurate, _fast, _intermediate;
internal MultiModeActionFacadeObject(IAction fastAction, IAction accurateAction, IAction intermediateAction)
{
_fast = fastAction;
_accurate = accurateAction;
_intermediate = intermediateAction;
}
// preference would be to call this member ActionMode, but obviously members can't share names
// although I believe this could be accomodated, outside of static members, by some changes to
// qualification requirements. That's not the concern here though.
public ActionMode Mode { get; set; }
public void DoWork(object onThis)
{
switch (Mode)
{
case ActionMode.Fast:
_fast.DoWork(onThis);
break;
case ActionMode.Accurate:
_accurate.DoWork(onThis);
break;
case ActionMode.Intermediate:
_intermediate.DoWork(onThis);
break;
}
}
}
将枚举放在 class 之外似乎更为常见。将其保留在内部意味着每次设置模式时最终都需要指定 ClassName.Enum:
var mma = new MultiModeActionFacadeObject(fastAction, accurateAction, intermediateAction)
{
Mode =
MultiModeActionFacadeObject.ActionMode.Accurate
};
此外,由于任何一种方式都有效,我认为这不是确定的 "answer"。我本来想对您的原始问题添加评论,但这需要 50 多个代表 :)
我有一个控制 class 操作方式的枚举。此枚举仅适用于 class,因此感觉它应该嵌套。但是,class 需要枚举的一个实例作为成员,理想情况下,它的名称应与枚举相同。当然,这是不可能的。
我最关心的是提供一个清晰明了的 API。我看到的两个选项是:
嵌套枚举并将实例成员或枚举本身命名为 'less than perfect'
将枚举放在 class 之外,这会有点但不会真正污染命名空间,并且可能会降低可发现性。 (现在写这篇文章,让我印象深刻的是发现能力可能不是问题,因为只有一个使用点,属性)。
是否有针对此类情况的公认惯例?这是说明用例的片段:
public class MultiModeActionFacadeObject : IAction
{
public enum ActionMode // enum only applies to this class
{
Fast,
Accurate,
Intermediate
}
private readonly IAction _accurate, _fast, _intermediate;
internal MultiModeActionFacadeObject(IAction fastAction, IAction accurateAction, IAction intermediateAction)
{
_fast = fastAction;
_accurate = accurateAction;
_intermediate = intermediateAction;
}
// preference would be to call this member ActionMode, but obviously members can't share names
// although I believe this could be accomodated, outside of static members, by some changes to
// qualification requirements. That's not the concern here though.
public ActionMode Mode { get; set; }
public void DoWork(object onThis)
{
switch (Mode)
{
case ActionMode.Fast:
_fast.DoWork(onThis);
break;
case ActionMode.Accurate:
_accurate.DoWork(onThis);
break;
case ActionMode.Intermediate:
_intermediate.DoWork(onThis);
break;
}
}
}
将枚举放在 class 之外似乎更为常见。将其保留在内部意味着每次设置模式时最终都需要指定 ClassName.Enum:
var mma = new MultiModeActionFacadeObject(fastAction, accurateAction, intermediateAction)
{
Mode =
MultiModeActionFacadeObject.ActionMode.Accurate
};
此外,由于任何一种方式都有效,我认为这不是确定的 "answer"。我本来想对您的原始问题添加评论,但这需要 50 多个代表 :)