【问题标题】:Store hierarchical Const data存储分层常量数据
【发布时间】:2011-11-17 10:21:24
【问题描述】:

我经常想知道正确的方法:

例如,在我的程序中,我有大约 100 个常量(或枚举)用于某些计算。它们最好存放在一个地方。它们可以按层次分组,例如:

System3 / Rules / Rule7 / ParameterXY / MaxAverageValue

当然,我希望在编码时可以访问这些值,因此将它们存储在某种资源中并不是一个真正的选择。

据我所知,这可以通过以下方式完成:

  • 很长的常量名
  • 嵌套类
  • 命名空间

使用名称非常难看,而且维护起来也不是很好。我发现嵌套类是一种很好的方法,但是一些 stylecop/fxcop 规则禁止这样做,所以这在某种程度上一定是“坏的”。最后,我找到了建议的替代方案,使用名称空间,也不是很好。恕我直言,它会创建大量文件夹和文件,每个文件夹和文件几乎什么都不包含。而且我不喜欢在程序集反射器中弹出 50 个子命名空间。

那么..你是怎么做这种任务的?你有什么建议?

【问题讨论】:

  • 我建议命名空间。避免嵌套类和长常量名称。很难阅读
  • MVC 使用带有静态常量公共字段 IIRC 的生成类类
  • @StevenMuhr:你为什么说嵌套类很难阅读是出于兴趣?在我的脑海中,他们把我当作我想要的解决方案。意味着您可以将所有常量保存在一个文件中,并获得与命名空间相同的层次结构。
  • @Chris:在您的情况下,您将拥有一个包含许多嵌套类的庞大类。使用具有相同命名空间的单独独立类更具可读性和更易于维护。
  • @Chris: 欢迎回家 Chris :)

标签: c# .net namespaces constants


【解决方案1】:

很长的常量名

这有点恶心,但至少它是可以发现的。您的所有代码都将驻留在同一个位置,因此您可以轻松找到它。

我发现嵌套类是一种很好的方法,但是一些 stylecop/fxcop 规则禁止这样做,所以这在某种程度上一定是“坏的”

它不好的一个原因是自动代码生成/代码检查工具更难使用。另一个原因是使用 Intellisense 更难发现这些。

这是不好的最重要原因是因为嵌套类应该在面向对象的依赖意义上强关联,以便布局在逻辑上有意义。除了一些罕见的情况(例如Enumerator classes)之外,它没有任何意义。在您的情况下,这也没有意义,因为您的类根本没有任何行为或面向对象 - 它们只是常量的层次结构。

命名空间

对于你描述的问题,这是最好的处理方式。您可以在每个级别中获得最少的混乱,并且您可以在键入时获得 Intellisense,这样您就可以看到您在通过层次结构下降时缩小到什么范围。

恕我直言,它会创建大量文件夹和文件,每个文件夹和文件几乎什么都不包含

如果您确实需要一个庞大的常量池,并且将它们绑定到应用程序的其他部分没有意义,那么这是我会滥用一个文件一个文件的少数情况之一类和每个命名空间一个文件夹的规则。您甚至将它们填充到类中的唯一原因是因为 .Net 不支持全局变量。

另一个建议

您是否有这些常量所属的特定于域的对象?例如。有没有与System3 / Rules / Rule7 类相关的逻辑?这不是某种实际的业务规则,你应该用它自己的类来体现吗?

如果您可以安排您的代码以便拥有a thicker domain model,那么放置常量最合乎逻辑的位置是在体现相应域逻辑的类上。

如果拥有一个厚域没有意义,您拥有完全通用的规则处理,并且您依赖常量来提供您的业务引擎逻辑,那么您就有了一个数据驱动的应用程序。这意味着您应该将数据存储在配置文件中,而不是代码中。

【讨论】:

  • 感谢您的最后建议,这似乎确实可行。唯一的缺点是它使不知道代码的人更难找到特定的常量。但是有一个优雅的解决方案:资源或配置文件(甚至其他)和属性(获取这些值)而不是 consts。 :)
【解决方案2】:

每个常量在多个方法中重复使用的频率如何?你可以考虑重新组织你的常量。如果您仍然发现自己有大量常量,请尝试将它们放入具有只读属性的静态类中。

如果您只是需要一个好地方在一个地方查看它们,您还可以考虑将它们存储在 app.config 文件中,您可以通过 AppSettings 和 ConfigurationManager 类访问它们。

【讨论】:

    【解决方案3】:

    我这样做的方法是拥有一个名为 Constants 的密封文件。

    所以

    public sealed class Constants
    {
    
      //for e.g.
      //Sessions
      public const string APPSESSIONKEY = "AppType";
    
    }
    

    比我在我的项目的其余部分中使用它,这里的重要性在于你将它命名,因为它会帮助你记住它并在你需要它时有意义。

    通过在您的代码中调用它。

    Constants.AppSessionKey
    

    你也可以

    创建一个程序集,其唯一目的是为项目保存恒定值。然后每个其他大会都应该引用这个。遵循 DRY 和 KISS,因为添加引用很简单。这里的主要问题是重新编译。

    【讨论】:

      【解决方案4】:

      我们使用带有自定义 T4 模板的资源文件,该模板生成静态类层次结构,其中包含值的只读字符串字段。

      我们的资源文件中的键用“.”分隔。构建层次结构。

      我们可以将单独的资源文件编译成一个类层次结构。

      我知道不推荐使用嵌套类,但在我看来,对于这种情况,它是最好的解决方案。

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 1970-01-01
        • 2010-11-03
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        相关资源
        最近更新 更多