使用位域来提高代码的可读性

本文关键字:代码 可读性 高代码 位域 | 更新日期: 2023-09-27 17:53:36

我正在开发一个用。net编写的传统web应用程序。在应用程序开始时,它检查登录的用户类型,并根据用户类型决定显示哪些UI元素。

现在实现的方式是一系列if语句来处理每种用户类型的情况,然后是一个函数调用,根据用户类型将各种UI元素设置为可见或不可见。问题是函数调用有点混乱。大约有500行以下内容:

setTabsVisible(true, true, true, true, true, true, true, true, true, true, false, false);
if (!locked)
{
    setActionButtonsVisibile(true, false, true, "Submit", "");
    script += setTabsReadOnly(false, false, false, false, false, false, true, false, false, false, true, true);
    script += setSubTabsReadOnly(true, true, false, true, true, true, false, false, true, true, false, true);
}
script += setSubTabsVisible(false, false, false, false, false, false, true, false, false, true, true);

所有的真、真、假、真等等乍一看都不是很好读。要查看正在打开或关闭的功能,您必须将鼠标悬停在函数上并将布尔值与参数列表相匹配。

所以我在想一个更好的解决方案可能是一个位域,它是由按位或在一起的常量构建的。这样的话,函数调用可能看起来更像这样:

setTabsReadOnly(notesTab | documentsTab | signoffTab | etc);

然而,c#似乎不支持位域。有没有更好的解决方案?或者它是否值得改变?

使用位域来提高代码的可读性

[Flags]
public enum MyFlags : short
{
    Foo = 0x1,
    Bar = 0x2,
    Baz = 0x4
}
public static class Program
{
    public static void Main()
    {
        CheckFlags(MyFlags.Bar | MyFlags.Baz);
    }
    public static void CheckFlags(MyFlags flags)
    {
        if (flags.HasFlag(MyFlags.Foo))
            Console.WriteLine("Item has Foo flag set");
        if (flags.HasFlag(MyFlags.Bar))
            Console.WriteLine("Item has Bar flag set");
        if (flags.HasFlag(MyFlags.Baz))
            Console.WriteLine("Item has Baz flag set");
    }
}
你应该像上面的例子那样使用标志枚举来简化你的代码。有关枚举的更多信息,请查看此参考。在你的例子中,你可以输入:
public static void setTabsReadOnly(YourEnum flags)
{
    // Your Code
} 
setTabsReadOnly(YourEnum.NotesTab | YourEnum.DocumentsTab | YourEnum.SignoffTab);

听起来您需要创建一个Flags Enum。您可以修改您的方法,使其仅具有枚举的参数,然后使用您想要应用的枚举类型调用该方法:

public void MyMethod(MyEnumeration myEnum) { ... }
...
MyMethod(MyEnumeration.First | MyEnumeration.Second | MyEnumeration.Third);

MSDN:

示例

您可以使用枚举类型来定义位标志,这使得枚举类型的实例能够存储枚举列表中定义的值的任何组合。

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}
http://msdn.microsoft.com/en-us/library/cc138362.aspx

然而,c#似乎不支持位域。有没有更好的解决方案?

Flags枚举基本上是一个位域。

表示枚举可以作为位域处理;也就是一组标志。

[FlagsAttribute] 
enum MultiHue : short
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4
};
// Black and Red:
MultiHue mh = MultiHue.Black & MultiHue.Red;

您需要使用带有Flags属性的Enum

[Flags]
enum TabOptions
{
    notesTab = 0x01,
    documentsTab = 0x02,
    signoffTab = 0x04
}

然后可以按照描述的方式将枚举值组合在一起。

void setTabsReadOnly(TabOptions options)
{
   //do stuff
} 

setTabsReadOnly(notesTab | documentsTab | signoffTab)