【问题标题】:Avoiding magic strings and numbers避免魔术字符串和数字
【发布时间】:2012-06-21 10:16:15
【问题描述】:

我正在开发一个应用程序,在过去几年中由不同的程序员编辑过,我偶然发现了使用字符串文字访问 MenuItems 的问题。

例如:在很多地方都有类似的代码

mainMenu.MenuItems[1].MenuItems[0].Visible=true;

mainMenu.MenuItems["View"].MenuItems["FullScreen"].Visible=true;
  1. 如何更改用于标识 MenuItem 的字符串并捕获所有用于访问的位置?菜单和菜单项被声明为公共的,并在整个大型应用程序中使用

  2. 阻止使用这些魔法索引的正确方法是什么。我预见到每次添加新项目或更改名称时都会出现问题。

附:我已经开始使用枚举字典方法,其中每个 menuItem 都与一个键配对。但这仍然不会强迫其他开发人员使用我的实现,也不是问题 2 的最优雅的解决方案

【问题讨论】:

  • 您不能强制魔术字符串不被其他开发人员使用,但您可以在开发人员会议上强调这种行为的负面影响,并在开发人员文档中突出显示应该避免这种行为。有许多有效的方法可以将这一点传达给整个团队。您甚至可以尝试将其纳入公司开发者指南!

标签: c# enums menuitem magic-numbers


【解决方案1】:

在 WinForms 设计器中为每个菜单项命名(我假设),然后通过该名称引用它。

然后在你的代码中使用它:

menuExit.Visible = false;

如果菜单项是通过编程方式添加的,请执行以下操作:

class MyForm : Form
{
    private MenuItem menuExit;

    ...

        myMenu.Items.Add(menuExit = new MenuItem(...));

    ...
}

然后仍然通过menuExit 名称访问它。避免幻数和字符串的关键是直接引用您想要引用的任何内容。作为奖励,您现在可以使用 F2 安全地重命名此变量。

【讨论】:

  • 抱歉,它们都是使用 new MenuItem("string"); 以编程方式添加的;
  • 谢谢,现在如何捕捉所有使用字符串文字的地方?
  • @John 嗯...尝试在MenuItems 上“查找符号”? (将光标放在 MenuItems 上并按 Shift+F12)。
【解决方案2】:

Romkyns 的答案是这个场景的正确答案,但是如果您确实需要在代码中使用字符串文字,我总是将它们保存在公共静态类中,例如:

public static class Constants
{
    public static class Menu 
    {
        public static readonly string FirstMenuName = "Menu 1";
        ...
    }

    public static class OtherCateogry
    {
        ...
    }
}

然后您可以通过Constants.Menu.FirstMenuName 访问它们。

至于明确阻止其他开发人员在整个代码中使用文字 - 你可能不得不求助于校正棒(坚固的金属尺子);)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多