这个反模式叫什么(使用父作用域传递状态)?

时间:2016-11-04 15:03:16

标签: oop design-patterns

我试图向同事描述我的代码是如何构建的,我正在寻找他实施的反模式的名称(它违反的软件原则的奖励积分)。我正在使用JS进行演示,但这不是JS特定的。

function x() {

    var a, b, c;

    var doWork = function(){
        a = 1;
        b = 2;
        addAB();
        return c;
    };

    var addAB = function(){
        c = a + b;
    };

    var result = doWork();
}

他使用父作用域将信息传入和传出函数/方法。它使得理解代码变得非常困难。

2 个答案:

答案 0 :(得分:1)

我不知道它的正式名称,但是,您所描述的问题是创建具有副作用的函数。

您不希望任何修改其自身范围之外的任何函数。拥有可被任何其他函数修改的共享成员(在本例中为a, b, & c)可能会导致未知和/或不一致的状态和/或行为。

答案 1 :(得分:-1)

我相信您的问题并不适用于JavaScript(以及许多其他编程语言)。您的代码和您的团队成员正在使用closures

  

闭包是指独立(自由)变量的函数   (在本地使用但在封闭范围内定义的变量)。   换句话说,这些功能记得'其中的环境   他们被创造了。

在JavaScript和许多其他可以创建闭包的语言中,访问父作用域的引用非常常见,它为代码提供了更多的强大功能,而不是痛苦。显然,错误使用的工具会产生疼痛,但我应该分析你的伙伴'代码,以确保它不是你只是反对闭包

总之,闭包不是反模式。他们是一种语言功能。

例如,您的代码可能是DOM事件处理等实际用例:

var text = "";

document.getElementById("someButton").addEventListener(function() {
     text = document.getElementById("someInput").value;
});

一些开发人员在构造函数中实现了类似私有函数的东西:

function A() {
   this.text = "";
   var that = this;

   function fillText() {
       that.text = "hello world";
   }

   fillText();
}

var a = new A();
console.log(a.text); // "hello world"