[size=x-large]前言:[/size]
[size=medium]重构是一个在不改变代码的外部行为的情况下,修改源代码的过程。不修改错误,也不新增功能,它单单是提高代码可读性,改变代码内部结构和设计(又包括分析业务、功能逻辑,划分角色单位等等)的一个过程,已达到在将来代码更加容易维护的目的。
重构的内容:
1.命名:要做到见名知义.写代码我们要养成一个好习惯,让大家看到代码时知道我们想干什么.
2.对于复杂的函数:要抽成几个函数,要做到每个函数只干一件事.这样可以避免在一个地方用到了之前用过的代码,而这段代码却嵌在之前的函数中.降低了耦合度(不同模块之间互连程度)也减少了代码行数.
在开发的过程中,我们都遇到过这样一个问题,在另一个地方用到了之前用过的一段代码实现,但是这段代码却嵌在之前的函数之中,遇到这样的问题你怎么办呢?有些人是重新写一遍代码,也可能就直接把原来的那一段代码直接黏贴过来,其实,这两种方式又有什么区别呢?他们的结果都是真真正正的在我们的代码中又多了一段晦涩难懂的重复代码。我们在重构的过程中就要把这段重复代码拎出来成为单独的模块,每个函数只干一件事,降低了耦合度也减少了代码行数。
3.对于MVC:model实现所有与数据结构相关的增查方法;view有自己的逻辑,controller只向view提供指示性标志变量和数据源,不对任何数据操作的方法做实现,只通过调用有model的属性或方法实现逻辑控制。也就是说controller处理了所有的业务逻辑,model承担了所有业务逻辑所有的数据的增删改查,view实现了所有的系统和用户之间的业务交互。
4.繁琐的判断和循环:应该少用if...else(至少应该少用else)或者for,使我们的逻辑更简单,代码的维护性更强.
下面列出了重构的具体要求,但是这些要求比较机械化,我们不能为了满足这些要求去重构,而是重构后要满足这些要求.[/size]
[size=x-large]重构遇到的问题和解决:[/size]
[size=medium]1.对于较多的if...else...可以用if...return来代替
2.对于if和for的相互嵌套,可以用underscore替代一部分
3.能在haml控制的东西就在haml页面控制,如控制活动开始或结束按钮的名字,我们可以用ng-switch而不是在controller中调用活动的状态
4._.chain(obj)
返回一个封装的对象. 在封装的对象上调用方法会返回封装的对象本身, 直道 value 方法调用为止.[/size]
[size=medium]5.用hash代替if:[url]http://stu-zhaoli.iteye.com/blog/2039042[/url][/size]
[size=x-large]重构要求[/size]
[size=medium]1.小步伐修改程序,每一小步的修改后,程序能正常运行,commit。
2.JS OOP (JavaScript权威指南,p 156~166)
3.重构后,每个函数只做一件事,函数不超过十五行
4.函数名符合命名规范,见名知意
5.函数内圈复杂度在容易理解的前提下降至最低。
6.将数据模型抽成model,model实现所有与数据结构相关的增查方法
7.view有自己的逻辑,controller只向view提供指示性标志变量和数据源。
8.controller 不实现任何功能方法,只通过调用功能方法实现逻辑控制。
9.对象、数组等用underscore 取代各种循环。
10.要学会用chain
11.对短信处理逻辑进行封装,设计。 OO或者DSL
因为每个人的代码风格和数据结构不同,以上规范只是作为重构以后对代码质量的要求,不要被序号牵制自己的重构顺序。[/size]
[size=x-large]参考文献:[/size]
[size=medium]1._.chain:[url]http://www.css88.com/doc/underscore/#chain[/url][/size]
[size=medium]重构是一个在不改变代码的外部行为的情况下,修改源代码的过程。不修改错误,也不新增功能,它单单是提高代码可读性,改变代码内部结构和设计(又包括分析业务、功能逻辑,划分角色单位等等)的一个过程,已达到在将来代码更加容易维护的目的。
重构的内容:
1.命名:要做到见名知义.写代码我们要养成一个好习惯,让大家看到代码时知道我们想干什么.
2.对于复杂的函数:要抽成几个函数,要做到每个函数只干一件事.这样可以避免在一个地方用到了之前用过的代码,而这段代码却嵌在之前的函数中.降低了耦合度(不同模块之间互连程度)也减少了代码行数.
在开发的过程中,我们都遇到过这样一个问题,在另一个地方用到了之前用过的一段代码实现,但是这段代码却嵌在之前的函数之中,遇到这样的问题你怎么办呢?有些人是重新写一遍代码,也可能就直接把原来的那一段代码直接黏贴过来,其实,这两种方式又有什么区别呢?他们的结果都是真真正正的在我们的代码中又多了一段晦涩难懂的重复代码。我们在重构的过程中就要把这段重复代码拎出来成为单独的模块,每个函数只干一件事,降低了耦合度也减少了代码行数。
3.对于MVC:model实现所有与数据结构相关的增查方法;view有自己的逻辑,controller只向view提供指示性标志变量和数据源,不对任何数据操作的方法做实现,只通过调用有model的属性或方法实现逻辑控制。也就是说controller处理了所有的业务逻辑,model承担了所有业务逻辑所有的数据的增删改查,view实现了所有的系统和用户之间的业务交互。
4.繁琐的判断和循环:应该少用if...else(至少应该少用else)或者for,使我们的逻辑更简单,代码的维护性更强.
下面列出了重构的具体要求,但是这些要求比较机械化,我们不能为了满足这些要求去重构,而是重构后要满足这些要求.[/size]
[size=x-large]重构遇到的问题和解决:[/size]
[size=medium]1.对于较多的if...else...可以用if...return来代替
2.对于if和for的相互嵌套,可以用underscore替代一部分
3.能在haml控制的东西就在haml页面控制,如控制活动开始或结束按钮的名字,我们可以用ng-switch而不是在controller中调用活动的状态
4._.chain(obj)
返回一个封装的对象. 在封装的对象上调用方法会返回封装的对象本身, 直道 value 方法调用为止.[/size]
_.chain(BidMessages.get_bid_messages())
.filter(function(bid_message){
return bid_message.activity_name == localStorage.enter_into_it && bid_message.bid_id == localStorage.enter_into_bid
})
.groupBy(function(bid_message){
return parseInt(bid_message.price)
})
.map(function(value,key){
return {"price":key,"count":value.length}
})
.find(function(bid_message){
return bid_message.count == 1
})
.value();
[size=medium]5.用hash代替if:[url]http://stu-zhaoli.iteye.com/blog/2039042[/url][/size]
[size=x-large]重构要求[/size]
[size=medium]1.小步伐修改程序,每一小步的修改后,程序能正常运行,commit。
2.JS OOP (JavaScript权威指南,p 156~166)
3.重构后,每个函数只做一件事,函数不超过十五行
4.函数名符合命名规范,见名知意
5.函数内圈复杂度在容易理解的前提下降至最低。
6.将数据模型抽成model,model实现所有与数据结构相关的增查方法
7.view有自己的逻辑,controller只向view提供指示性标志变量和数据源。
8.controller 不实现任何功能方法,只通过调用功能方法实现逻辑控制。
9.对象、数组等用underscore 取代各种循环。
10.要学会用chain
11.对短信处理逻辑进行封装,设计。 OO或者DSL
因为每个人的代码风格和数据结构不同,以上规范只是作为重构以后对代码质量的要求,不要被序号牵制自己的重构顺序。[/size]
[size=x-large]参考文献:[/size]
[size=medium]1._.chain:[url]http://www.css88.com/doc/underscore/#chain[/url][/size]