java - 如何从代码中重构全局变量

标签 java refactoring global

围绕全局变量及其滥用的讨论似乎带有某种教条色彩。我在这里不是要质疑“全局变量不好”的概念,因为对我来说为什么它们不好是有道理的。但是我想知道人们是否有一些有趣的代码片段可以准确地演示如何从代码中有效地重构更高范围的变量和对象。在这个问题中,我正在寻找通用但有用的解决方案的示例或模式,以解决“我需要在此处使用全局变量,因为它很简单”的问题。

这是一个假设的,也许是人为的例子。我正在使用全局变量来跟踪发送给函数的参数。然后,如果在链的下游发生故障,我可以返回并使用全局变量中的参数再次调用该函数。

public var myGlobalState:Object = new Object();

public function addPerson (name:String, person:Object, personCount:int, retryCount:int):void
{
     myGlobalState = null; // Clear out old values

     myGlobalState = new Object();
     myGlobalState.name = name;
     myGlobalState.person = person;
     myGlobalState.personCount = personCount;
     myGlobalState.retryCount = retryCount;

     person.userId = personCount + 1;
     person.name = name;

     savePerson(person);
}

public function savePerson (person:Object):void
{
    // Some code that attempts to save the person object properties to a database...
    // The process returns a status code for SUCCESS of FAILURE.

    // CODE TO SAVE TO DATABASE ....

    // Return status code...

    if (status == "fail")
    {
        // Retry at least once by calling the addPerson function again

        if (myGlobalState.retryCount < 3)
        {
            addPerson (myGlobalState.name, person, myGlobalState.personCount, myGlobalState.retryCount);
        }
    }
}

最佳答案

我没有代码片段,但我有一个真实世界的例子。 线性校准常数(质谱场) 应用程序是全局的,并且有复杂的代码 存储和恢复全局校准常数 不同的光谱。这两个值的使用被全部传播 在程序上,很难更改或检查 未校准质量和校准质量之间的转换 使用这两个常量的值在所有情况下都是正确的。

我通过封装两个校准常量进行了重构 在一个负责在两者之间进行转换的类中 未校准和校准质量值。做的功能 还引入了转换,因此它集中在一个 放在程序中而不是散布在整个程序中 程序。这种封装,后面很容易引入 一种新型校准(非线性)。

类不是访问两个全局变量 代表频谱的将改为拥有并使用 新校准类的实例,每个实例都有 它自己的一组校准常数。

关于java - 如何从代码中重构全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1378703/

相关文章:

java - SOAP 响应编码所有字符串中的 '?' 个字符,而不是俄语 .Net 代理、Java 服务器(?)

c# - 以编程方式创建和执行合并复制

swift - Alamofire 访问附加数据到全局变量

c++ - (C++ 查询)全局访问实例化对象

java - 十进制格式类问题

Java 在不使用数学 pow 的情况下将字符串二进制转换为整数

java - 解析地理 native 查询时出现间歇性 Mongo/JPA IllegalArgumentException

java - 确定javafx中的点击按钮

javascript - 可以在react-redux中编写props来覆盖connect()吗?

python - 名称错误 : global name 'sock' is not defined