oop - 是否有常用的 OO 模式来保存 "constant variables"?

标签 oop dependency-injection inversion-of-control

我正在做一点pinball-game project出于爱好,正在寻找一种封装常量变量的模式。

我有一个模型,其中有一些值在该模型的生命周期中保持不变,例如最大速度/最大重力等。在整个 GUI 和其他区域中,需要这些值才能正确验证输入。目前,它们要么作为对公共(public)静态最终的引用,要么只是简单的硬编码。我想将这些“常量变量”封装在一个对象中,该对象可以注入(inject)模型中,并由 View / Controller 检索。

澄清一下,“常量变量”的值不一定是在编译时定义的,它们可能来自文件中的读取;用户输入等。在编译时就知道需要哪些。一种可能更容易解释的方法是,无论这种封装是什么,它提供的值都是不可变的

我正在寻找一种方法来实现这一目标:

  • 具有编译时类型安全性(即不在运行时将字符串映射到变量)
  • 避免任何静态内容(包括无法扩展的枚举)

我知道我可以定义一个具有以下方法的接口(interface):

 public int getMaximumSpeed();
 public int getMaximumGravity();

...并将其实例注入(inject)模型中,并使其以某种方式可访问。然而,这会产生大量样板代码,编写/测试等非常乏味(我这样做是为了好玩:-))。

我正在寻找一种更好的方法来做到这一点,最好是具有成为共享词汇一部分的好处的方法,就像设计模式一样。

有更好的方法吗?

附注我对此进行了更多思考,我能找到的最好的权衡是:

public class Variables {
   enum Variable {
       MaxSpeed(100),
       MaxGravity(10)

       Variable(Object variableValue) {
          // assign value to field, provide getter etc.
       }
   }

   public Object getVariable(Variable v) { // look up enum and get member }

} // end of MyVariables

然后我可以做类似的事情:

Model m = new Model(new Variables());

优点:变量的查找受到保护,必须成为枚举的成员才能进行编译,只需很少的额外代码即可添加变量
缺点:枚举无法扩展、脆弱(需要重新编译才能添加变量)、变量值必须从 Object 转换(在本例中转换为 Integer),这又不是类型安全的,尽管泛型可能是一个选择......不知何故

最佳答案

您在寻找 Singleton或者,一个变体,Monostate ?如果没有,该模式如何满足您的需求?

当然,这是强制性免责声明 Anything Global Is Evil .

更新:我做了一些查找,因为我一直有类似的辩论/问题。我偶然发现了一个list经典全局/范围解决方案的“替代方案”。我想我会分享。

关于oop - 是否有常用的 OO 模式来保存 "constant variables"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/529823/

相关文章:

c++ - 如何从 C++ 中以 '|' 字符分隔的字段中提取数据?

c# - 你如何调和 IDisposable 和 IoC?

wpf - 使用 viewmodellocator 时将模型传递给 viewmodel

c# - 我的第一个 C# 应用程序和第一个空对象异常

JavaScript 面向对象 : Implementation of Logging

java - 对象的原始成员是在堆上还是在栈上?

android - Dagger 2 注入(inject)后返回null

c# - 另一种通过在构造函数中注入(inject)基类来实例化派生类的基类部分的方法?

java - 实现依赖注入(inject)困惑

delphi - Delphi 是否有使用 [Dependency] 等属性的 DI 框架?