0

我有一个关于范围和封装的一般性问题。采取两种情况:

场景一:

// a global application level constant
public static const IS_DEMO_MODE:Boolean = false;   

... // somewhere deep in the codebase

private function _myFunction():void
{
    if (IS_DEMO_MODE == true) {
      // If Demo Mode do not allow this function to complete
      return;       
    }
    else {
       // Function behaves normally
       // Code ...
    }

}

场景二:

// a global application level constant
public static const IS_DEMO_MODE:Boolean = false;   

... // somewhere deep in the codebase

 // call the function and pass in the constant
_myFunction(IS_DEMO_MODE);


private function _myFunction(isDemoMode:Boolean):void
{
    if (isDemoMode == true) {
      // If Demo Mode do not allow this function to complete
      return;       
    }
    else {
       // Function behaves normally
       // Code ...
    }

}

从功能上讲,这两个代码片段做同样的事情。我试图了解编码风格的细微之处以及为什么一种方式可能优于另一种方式?从封装的角度来看,方案 2 似乎更好。但是场景 1 更加万无一失,因为条件中的布尔值仅来自一个地方,即全局常量。您不必担心在正确接收参数时可能会传入错误值的函数调用。但是场景 2 似乎值得,因为您删除了常量的依赖关系并且可以让函数表现得更加动态。对此有什么想法吗?我还有其他权衡吗?

同样的概念和问题也适用于对象和类。但是为了简化代码示例,我只是根据函数来展示示例。

4

2 回答 2

1

在第二种方法中,您可以_myFunction在一个单独的模块中运行,而不依赖于全局模块——因此它更容易测试、更容易重用,并帮助您控制依赖关系图,这在大型代码库中通常会成为一个严重的问题。如果您插入可以轻松避免的依赖项,则只会使依赖关系图问题变得更糟,而且很少有潜在的好处可以为此付出代价。

事实上,为了获得这种优势,一个很好的依赖模式是显式地 INJECT 对象,否则会在模块之间创建(通常是不希望的和不希望的)依赖关系 - 请参阅此处开始。作为测试、松散耦合和重用的狂热者,我也逐渐成为依赖注入的狂热者,所以我不会梦想访问一个全局常量,而将它作为参数传递是一个明显的替代方案……;- )。

于 2009-09-11T04:06:08.113 回答
1

如果您希望将相同的编译单元链接到两个版本(尤其是作为全局固定路径中的共享库),或者如果您在同一进程中运行多个实例,则首选 2。否则,如果您处于从源代码重建所有内容都没有障碍的情况下,那么#1 会更好。

有些事情确实是全球性的。全局常量一点也不危险。

于 2009-09-11T00:59:20.090 回答