代码重构

提炼函数
避免出现超大函数,独立出来的函数有助于代码复用,独立出来的函数更容易被覆写,独立出来的函数如果拥有一个良好的命名,他本身就起到了注释的作用
//例如:

var getUserInfo=funcion(){
    ajax("http://***.com/userInfo",function(data){
        console.log(‘userId:‘+data.userId);
        console.log(‘userName:‘+data.userName);
    });
}

//改写:
var getUserInfo=funcion(){
    ajax("http://***.com/userInfo",printDetails(data));
}
function printDetails(data){
        console.log(‘userId:‘+data.userId);
        console.log(‘userName:‘+data.userName);
};

合并重复的条件片段

//一个页面跳转的伪代码

var page=function(currPage){
    if(currPage<0){
        currPage=0;
        jump(currPage);
    }else if(currPage>=totalPage){
        currPage=totalPage;
        jump(currPage);
    }else{
        jump(currPage);
    }
}

//改写
var page=function(currPage){
    if(currPage<0){
        currPage=0;
    }else if(currPage>=totalPage){
        currPage=totalPage;
    }
    jump(currPage);
}

把条件分支语句提炼成函数

var getPrice=function(price){
    var date=new Date();

    if(date.getMonth()>=6&&date.getMonth()<=9){
        return price*0.8;
    }

    return price;
};

//改写:
var isSummer=function(){
    var date=new Date();
    return date.getMonth()>=6&&date.getMonth()<=9;
};
var getPrice=function(price){

    if(isSummer()){
        return price*0.8;
    }
    return price;
};

合理使用循环
//一个创建XHR对象的代码,为了简化,只实现IE9以下

var createXHR=function(){
    var XHR;
    try{
        XHR=new ActiceXObject(‘MSXML2.XMLHttp.6.0‘);
    }catch(e){
        try{
            XHR=new ActiceXObject(‘MSXML2.XMLHttp.3.0‘);
        }catch(e){
            XHR=new ActiceXObject(‘MSXML2.XMLHttp‘);
        }
    }
    return XHR;
}

//改写:
var createXHR=function(){
    var versions=[‘MSXML2.XMLHttp.6.0‘,‘MSXML2.XMLHttp.3.0‘,‘MSXML2.XMLHttp‘];
    for(var i=0,version;version=versions[i++];){
        try{
            return new ActiceXObject(version);
        }catch(e){

        }
    }
}

提前让函数退出代替嵌套条件分支

//一段遵守“一个函数只有一个出口”的伪代码

var del=function(obj){
    var ret;
    if(!obj.isReadOnly{   //不为只读的才能被删除
        if(obj.isFolder){  //如果是文件夹
            ret = deletFolder(obj);
        }else if(obj.isFile){
            ret=deletFile(obj);  //如果是文件
        }
    }
    return ret;
}

var del=function(obj){

    if(!obj.isReadOnly{      //不为只读的才能被删除
        return;
    }
    if(obj.isFolder){        //如果是文件夹
        return deletFolder(obj);
    }
    if(obj.isFile){
        return deletFile(obj);  //如果是文件
    }
}

传递对象参数代替过长的参数列表
//例:

var setUserInfo=function(id,name,age,sex,qq,phone){
    console.log("id"+id);
    console.log("name"+name);
    console.log("age"+age);
    console.log("sex"+sex);
    console.log("qq"+qq);
    console.log("phone"+phone);
}
setUserInfo(1231,‘nike‘,18,‘male‘,‘35498797‘,‘13200400580‘);

//改写

var setUserInfo=function(data){
    console.log("id"+data.id);
    console.log("name"+data.name);
    console.log("age"+data.age);
    console.log("sex"+data.sex);
    console.log("qq"+data.qq);
    console.log("phone"+data.phone);
}

setUserInfo(
    {
        id:1231,
        name:‘nike‘,
        age:18,
        sex:‘male‘,
        qq:‘35498797‘,
        phone:‘13200400580‘
    }
);

少使用三目运算符
三目运算符常被用来if-else,两者的性能是差不多的,在实际开发中,即使一段代码循环一百万次,使用三目运算符和使用if-else的时间开销是在同一级别上的,相比损失的代码可读性和可维护性,三目运算符节省的代码量也可以忽略不计,让JS文件加载更快的方法有很多,如压缩,缓存,使用CDN等。如果条件分支逻辑简单清晰,这无碍我们使用三目运算符:var global=typeof window!=="undefined"?window:this;但如果条件分支逻辑非常复杂,最好使用if-else,这样阅读更加容易,后期修改也更加容易例如:

if(!aup||!bup){
    return a===doc?-1:
        b=doc?1:
        aup?-1:
        bup?1:
        sortInput?
        (indexOf.call(sortInput,a)-indexOf.call(sortInput,b)):
        0;
}

合理使用链式调用

————方法调用结束后返回对象自身

var User=function(){
    this.name=null;
    this.id=null;
};
User.prototype.setId=function(id){
    this.id=id;
    return this;
}
User.prototype.setName=function(name){
    this.name=name;
    return this;
}
var user=new User();
user.setName("nike").setId("132");

//或者
//
var User={
    id:null,
    name:null,
    setName:function(name){
        this.name=name;
        return this;
    },
    setId=function(id){
        this.id=id;
        return this;
    }
}
User.setName("nike").setId("132");

使用链式调用的方式并不会造成太多阅读上的困难,也确实能省下一些字符串和中间变量,但节省下来的字符数量同样是微不足道的,链式调用带来的坏处就是在调试的时候非常不方便,如果我们知道一条链中有错误出现,必须得先把这条链拆开才能加上一些调试log或者增加断电。这样才能定位错误出现的地方。所以还是使用普通调用比较好

 

var user=new User();
user.setId("134");
user.setName("nike");

用return退出多重循环

var func=function(){
    var flag=false;

    for(var i=0;i<10;i++){
        for(var j=0;j<10;j++){
            if(i*j>30){
                flag=true;
                break;
            }
        }
    if(flag===true)break;
    }
}

var func=function(){
    var flag=false;

    for(var i=0;i<10;i++){
        for(var j=0;j<10;j++){
            if(i*j>30)return;
        }
    }
}

当然用return直接退出方法会带来一个问题,如果在循环之后还有一些将被执行的代码呢?如果我们提前退出了整个方法,这些代码就不会被执行

var func=function(){
    var flag=false;

    for(var i=0;i<10;i++){
        for(var j=0;j<10;j++){
            if(i*j>30)return;
        }
    }
    console.log(".....");
}

为了解决这个问题我们可以把循环后面的代码放到return 后面,如果代码较多,就应该把它们提炼成一个单独的函数:

var print=function(){
    console.log(".....");
}

var func=function(){
    var flag=false;

    for(var i=0;i<10;i++){
        for(var j=0;j<10;j++){
            if(i*j>30)return print();
        }
    }
}
时间: 2024-12-13 08:02:21

代码重构的相关文章

Windows程序代码重构

代码重构:在程序功能实现之后,对代码进行一定规模的整理,使之符合"高内聚.低耦合"的软件设计原则,便于维护和使用. ①用函数封装消息处理代码--对Windows程序窗口函数中的每一个case程序段进行封装以形成一个消息处理函数,而在case中调用这个函数. ②利用数组或链表实现消息映射表进一步实现代码的隔离--因为窗口函数switch-case结构实质上实现的就是一个根据消息标识来查找消息处理代码的功能,故可以用消息映射表和一段查表程序来替代它,表中的每一项可以使用一个函数指针来指向消

Job Service代码重构遐想

最近有大概半个月的时间可以重构下代码,刚好可以重新整理下Job Service相关的代码.前段时间由于忙于完成Job Service所有功能以及完成对Auto Job的支持以正常上线,使得有些地方的代码写得不是特别优雅.主要集中在以下一些地方: DAG状态的转移 目前DAG状态分为3层,分别为ApplicationStatus.TaskStatus.InstanceStatus.每个层次都有以下几种状态,Waiting.Running.Finished.Stopped.Failed.并且DAG有

第九课、计算器界面代码重构

一.重构的概念 1.重构是以改善代码质量为目的代码重写 (1).使其软件的设计和架构更加合理 (2).提高软件的扩展性和维护性 2.代码实现和代码重构的不同 (1).代码实现:按照设计编程实现,重在实现功能 (2).代码重构:以提高代码质量为目的软件架构优化 (3).区别 A.代码实现时不考虑架构的好坏,只考虑功能的实现 B.代码重构时不影响已实现的功能,只考虑架构的改善 3.软件开发的过程 (1).从工程的角度对软件开发中的活动进行定义和管理 4.什么样的代码需要重构 (1).当发现项目中重复

step 1 代码重构

代码重构 代码重构介绍 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ?                     新建方法 ?                     把要抽取的代码,直接复制到新方法中 ?                     根据需求调整参数 2  调整旧代码 ?                     注释原代码,给自己一个后悔的

转有关代码重构

转自:http://blog.csdn.net/weiky626/article/details/1602691 开发人员可能听到过"bad smell"这个词,这个词用在软件编码中是什么意思呢? 代码还有smell吗?当然没有,正如计算机病毒,bug等词一样,这只是个形象的说法.这个词在这里的意思是代码实现了需求,但是代码却不精炼,冗余,结构混乱,难读懂,难维护,难扩展等等.与之相对应的一个词是"refactor",即代码重构.我们在看些外国人写的程序时可以发现,

代码重构实例之数据聚集

敏捷开发强调,要经常重构代码.在开发过程中,往往是开发和重构交替进行.短暂的重构,可以使得后续的开发维护更加容易.我觉得,代码重构可以分为逻辑重构和数据结构重构.数据结构的重构往往需要对代码进行多处改动:但是,数据结构的重构也可以为后续的开发维护带来更大的便利.这里就是一个数据结构重构的例子. 这是以前的一次代码重构经历,今天想起了,就记下来,帮助自己记忆.当然,既然是重构,总得承认自己写的第一版丑陋的代码. 为了方便描述,采用javascript来进行说明. 故事是这样的.刚开始,任务是画一些

妮子的iOS 代码重构1

昨天面试,被问了个代码重构,直接愣住了... 回来稍微看了下,对代码重构有了一点了解...就是让自己的代码有更好的结构,更简洁易读吧,是提高代码质量的一种方法吧!Xcode提供了几个代码重构功能,有Rename(重命名).Extract.Create Superclass.Move Up.Move Down.Encapsulate. 使用:在代码区右击——Refactor,调出重构功能.Rename用于对类名.方法名.属性名等重命名,Extract用于将自己写的一段代码变成一个方法,Create

CSS代码重构

CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高CSS代码性能主要有两个点:1.提高页面的加载性能提高页面的加载性能,简单说就是减小CSS文件的大小,提高页面的加载速度,尽可以的利用http缓存2.提高CSS代码性能不同的CSS代码,浏览器对其解析的速度也是不一样的,如何提高浏览器解析CSS代码的速度也是我们要考虑的 提高代码的可维护性 提高CS

CSS代码重构与优化之路

写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多,如果没有及时对CSS代码进行维护,CSS代码不断会越来越多.CSS代码交错复杂,像一张庞大的蜘蛛网分布在网站的各个位置,你不知道修改这行代码会有什么影响,所以如果有修改或增加新功能时,开发人员往往不敢去删除旧的冗余的代码,而保险地增加新代码,最终的坏处就是项目中的CSS会越来越多,最终陷入无底洞. CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS

代码重构的时机与要点

代码重构的结果至关重要 对于程序员来说,重构的意义似乎不需多说,大家公认的干净的代码是更好的. 在非程序员主导的项目中,做重构则需要对结果有更多的负责,一旦重构带来更多的bug以及进度的delay,重构本身就会被怀疑,牛逼和逗比只在一线之间. 重构的时机 最好的时机就是task收尾阶段:子task结束就清理子task的代码,大task结束就清理大task的代码. 有这么几个原因: - 测试资源:一部分代码一旦经过QA测试之后,本身的成本就上升了(程序员+QA的投入),如果重构发生在QA测试之后,