2011-11-17 47 views
5

我经常想知道这样做的正确方法:存储分层常量数据

例如,在我的节目,我有大约100常数(或枚举),它们在某些计算中使用。他们应该最好存放在一个地方。他们可以按层次分组,例如:

System3/Rules/Rule7/ParameterXY/MaxAverageValue 

当然,我希望在编码这些值来进行访问,因此将它们存储在某种的ressource的是不是一个真正的选择。

据我所知,这是可以做到的:

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

使用的名字是相当难看,它的不能很好地维护。我发现嵌套类是一个很好的方法,但是有些stylecop/fxcop规则禁止这样做,所以这在某种程度上必定是“不好的”。最后,我找到了使用名称空间的建议替代方法,但都不是非常好。 Imho会创建大量文件夹和文件,每个文件夹几乎不包含任何内容。我不喜欢在装配反射器中弹出50个子命名空间。

那么..你怎么做这种类型的任务?你会建议什么?

+1

我建议的命名空间。避免嵌套类和长常量名称。很难阅读 –

+0

MVC使用带有静态常量公共字段的生成类类IIRC – sehe

+0

@StevenMuhr:你为什么说嵌套类很难读出兴趣?在我头顶的时候,他们给我留下了我想要的解决方案。意味着您可以将所有常量保存在一个文件中,并且您可以使用与命名空间相同的层次结构。 – Chris

回答

4

很长的常量名

这有点严重,但至少它是发现。你所有的代码都会驻留在同一个地方,所以你不会发现问题。

我觉得嵌套类的一个很好的方式做到这一点,但一些了StyleCop/FxCop的规则禁止这一点,所以这一定是“坏”在某种程度上

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

最重要的原因,这是不好的,因为一个嵌套类应该在布局一个面向对象的依赖感强烈关联进行有意义的逻辑。在所有但极少数情况下(例如Enumerator classes),这是没有意义的。在你的情况下,它也没有意义,因为你的类没有任何行为或对象方向 - 它们只是常量的层次结构。

命名空间

对于您所描述的问题,这是处理它的最佳方式。你得到每个级别至少混乱,你会得到智能感知,同时输入,所以你可以看到你正在缩小,同时通过层次递减的。

恕我直言,它创建的文件夹和每个包含几乎没有

如果你真的需要常量的巨大的水池文件的质量,而且它没有意义将它们绑定到其他地区的应用程序,那么这是我滥用每个类一个文件和每个命名空间一个文件夹规则的罕见情况之一。你甚至将它们填充到类中的唯一原因是因为.Net不支持全局变量。

另一个建议

你有这些常量上,而不是属于特定域的对象?例如。有没有与System3/Rules/Rule7课有关的逻辑?这不是某种你应该用自己的课程来体现的实际商业规则吗?

如果您可以安排您的代码以便您拥有a thicker domain model,那么将您的常量放在最合乎逻辑的地方是包含相应域逻辑的类。

如果它没有任何意义有一个厚厚的域名,你有充分的通用规则处理,你是依靠常量来养活你的业务引擎逻辑,那么你有一个数据驱动的应用程序。这意味着您应该将数据存储在配置文件中,而不是代码中。

+0

感谢您的最后一个建议,这的确看起来要走。唯一的缺点是对于不知道代码找到特定常量的人来说更难。但有一个优雅的解决方案:资源或配置文件(甚至别的东西)和属性(获取这些值),而不是常量。 :) – Efrain

0

嗯,我这样做的方式是有一个密封的文件称为常量。

所以

public sealed class Constants 
{ 

    //for e.g. 
    //Sessions 
    public const string APPSESSIONKEY = "AppType"; 

} 

比我在我的项目的其他部分使用,这里的重要性是什么,你将它命名,因为它会帮助你记住它,使感觉,当你需要它。

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

Constants.AppSessionKey 

你也可以

创建大会,其唯一目的是为项目存放常数值。其他每个大会都应该参考这一个。继DRY和KISS后,因为添加引用非常简单。这里的主要问题是重新编译。

1

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

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

0

我们将资源文件与自定义T4模板一起使用,该模板生成具有值的只读字符串字段的静态类层次结构。

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

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

我知道,嵌套类是不推荐,但在我看来,像这样的情况是最好的解决方案。