关于重构大型JavaScript方法的建议

关于重构大型JavaScript方法的建议,javascript,refactoring,legacy-code,Javascript,Refactoring,Legacy Code,在这种情况下,该网站是一个只能在IE6上查看的内部网站。目标是让它在IE9中可见。有几种仅适用于IE的适当脚本,例如使用点符号访问文档元素,即resulttable.style.display=“block”,等等。。。上述内容对于手头的问题可能有点多余,但它可以提供一些见解 在整个网站上,有大量的JavaScript方法,这些方法非常大,很难调试。为了给你一个想法,这里有100多个JS文件,平均每个大约1000行 下面是一个实际的方法,省略了所有名称/逻辑。所有返回值都取决于以前的逻辑: fu

在这种情况下,该网站是一个只能在IE6上查看的内部网站。目标是让它在IE9中可见。有几种仅适用于IE的适当脚本,例如使用点符号访问文档元素,即
resulttable.style.display=“block”,等等。。。上述内容对于手头的问题可能有点多余,但它可以提供一些见解

在整个网站上,有大量的JavaScript方法,这些方法非常大,很难调试。为了给你一个想法,这里有100多个JS文件,平均每个大约1000行

下面是一个实际的方法,省略了所有名称/逻辑。所有返回值都取决于以前的逻辑:

function someMethod() {
if (stuff) {
    // operations
    if (stuff) {
        // operations
        for (loop) {
            // operations
            if (stuff) {
                // operations
                if (stuff) {
                    // operations
                    for (loop) {
                        if (stuff) {
                            // operations
                        }
                    }
                    // operations
                }
                else {
                    // operations
                    if (stuff) {
                        // operations
                    } else {
                        // operations
                    }
                }
                // operations
            }
        }

        // operations

        if (stuff) {
            // operations
            if (stuff) {
                // operations
                if (stuff) {
                    // operations
                    for (stuff) {
                        // operations
                        if (stuff) {
                            // operations
                        } else {
                            // operations
                        }
                    }
                    if (stuff) {
                        // operations
                        if (stuff) {
                            // operations
                            for (loop) {
                                // operations
                            }
                            // operations
                            for (loop) {
                                if (stuff) {
                                // operations
                                }
                            }
                        }
                        // operations
                        if (stuff) {
                            // operations
                        }
                        return something;
                    }
                    else {
                        // operations
                        return something;
                    }
                }
                else {
                    // operations
                    if (stuff) {
                        // operations
                        return something;
                    }
                    else {
                        // operations
                        if (stuff) {
                            // operations
                        }
                        // operations
                        return something;
                    }
                }
            }
        }
        return something;
    }
    else {
        // operations
        return something;
    }
}
return something;
}
在处理遗留网站时,您有什么建议可以将JavaScript方法分解为更易于管理的部分


免责声明:我的JS技能水平一般。现在我们想避开JQuery

您可以简单地将someMethod()分解为单独的函数,在这些函数中可以重复逻辑

此外,不必研究您拥有的特定逻辑,也不必寻找最适合逻辑的模式,一些可能有帮助的通用模式如下

模块模式,例如

var MyModule = function() {
    function privateFn() {
    }
    function publicFn() {
    }
    function doWork(args) {
    }

    return {
        publicFn: publicFn,
        doWork: doWork,
    };
}();
MyModule.doWork({ param1: 'test', param2: true});
原型继承可以像c#/Java中的类一样使用,例如

var MyClass = function(args) {
    this.prop1 = 'test'
    this.prop2 = args.param1;
};
MyClass.prototype.doWork = function(args) {
};
var myInstance = new MyClass({ param1: 'test' });
myInstance.doWork({ param1: true });
您可以使用名称空间组织这些内容,例如

if (window.MyNamespace === undefined) window.MyNamespace = {};
MyNamespace.MyModule = function () { ... };
MyNamespace.MyClass = function () { ... };
MyNameSpace.MyModule.doWork();

可以在这里找到可能有帮助的其他模式

jQuery将为您提供大量的ifs(我假设这些ifs与您所说的每个浏览器特性相关),因此我认为学习它并将其用于重构代码应该是非常好的。我建议您使用一个工具。看看我的答案provided@davidbuzatto-这些是大型逻辑流语句;与浏览器特性无关。也许这篇文章没有传达这一点,但目前的网站是为IE6设计的,没有其他浏览器。我真的不认为这是特定于javascript的。如果一个方法太大,请将其拆分为几个逻辑方法以使其更具可读性。首先,我将开始为每个js文件创建名称空间,并仅使用该文件的函数填充这些名称空间。类似于:var MyNamespace={};MyNamespace.myFunction1=函数(){};等等有了这个,我将开始重构每个函数,提取整个系统通用的块,并将它们插入到Utils名称空间中,例如,以及特定于我正在工作的名称空间的块。在提取之后,我将开始重构每个函数,不使用任何专有功能。最后,我将对结果进行更多模块化;我没有完全意识到在基于类的结构中使用JS。在
模块模式的第一个示例中,包含了
privateFn
;这是一个真正的私有方法,只能在
MyModule
中访问吗?我不确定我是否看到它与
publicFn
有什么不同。它们的访问方式如何不同?顺便说一句,js模式的链接很棒!模块模式创建范围在包装函数内的函数。此方法的返回仅包括要公开的函数,因此MyModule对象无法提供其他函数。例如,见