这个冗余的Readonly前缀

时间:2015-04-01 09:58:02

标签: c# oop design-patterns

internal abstract class ReadonlyCoefs
{
    public const Boolean Allowed = true;
    public const Boolean Disallowed = false;

    public abstract Boolean GetCoef();
}

internal class Coefs : ReadonlyCoefs
{
    public override Boolean GetCoef()  { ... }
    public void SetCoef()  { ... }
}

现在,假设我想在某个地方使用它

if (variable == ReadonlyCoefs.Allowed)
    ...

我不认为我想拥有Readonly前缀。

在这种情况下,我可以添加实例方法IsAllowed和SetAllowed,SetDisallowed,但是如果有很多consts,那么如何处理这种情况呢?

1 个答案:

答案 0 :(得分:0)

不,至少就目前而言,没有办法做你想做的事。在C#6中,将能够使用using指令导入类的静态成员:

using static SomeNamespace.ReadonlyCoefs;

这样就可以在不指定类型名称的情况下访问ReadonlyCoefs的静态成员。

那就是说,鉴于你目前的设计,我同意汉斯你应该使用enum

enum CoefPermission
{
    Allowed,
    Disallowed,
}

internal abstract class ReadonlyCoefs
{
    public abstract CoefPermission GetCoef();
}

然后:

if (variable == CoefPermission.Allowed) ...

这也应该与C#6中的using static功能兼容。您可以拥有using static SomeNamespace.CoefPermission;,然后代码可以显示if (variable == Allowed) ...

现在,所说的所有,我对你当前的设计持怀疑态度。也许这对非bool值有意义(特别是如果你切换到基于enum的方法)。但你没有表现出类似的东西。你所拥有的只有bool值,恕我直言制作常量枚举这些将是愚蠢的。相反,为什么不只是有这样的东西:

internal abstract class ReadonlyCoefs
{
    public abstract Boolean IsCoefAllowed();
}

internal class Coefs : ReadonlyCoefs
{
    public override Boolean IsCoefAllowed()  { ... }
    public void SetIsCoefAllowed()  { ... }
}

然后:

if (variable) ...

如果你给变量一个好名字,那就更好了:

if (isCoefAllowed) ...
恕我直言,这更具可读性和可维护性。