NEWS 新闻资讯
系统重构注意事项36条之33-36
文章来源:本站原创作者:Deepfisher发布时间:2012年4月29日浏览次数:1009
第三十三点:简化类关系
假如类之间的关系较为复杂,那么很有可能是面向对象的设计没设计好。一般说来,两个类之间有双向调用关系则说明它们在职责上的分配上不够清晰,例如,一个类(A)频繁地调用另一个类(B)的函数,而且A还把成员变量作为参数传递给B,那么大部分情况下就应该把那个函数定义在A中,从而切断两者之间的关系。另外,系统中有很多类对某些类的状态变化或者事件感兴趣,例如添加一个新用户、网络状态的变化等,对于这样的需求,最好通过各种消息机制来达到它们之间的解耦,如观察者模式、发布订阅模式等。
第三十四点:用多态替换相似条件式
当一个类中有些函数的处理逻辑很相似,都是根据某个状态值或者某个类型值而采取不同的行为,那么这个类就需要被拆分成多个类了,例如有一个表示形状的类:
public class Shape{ private int type; public void draw(){ if(type == 0) // 如果是矩形 drawRect(); else if(type == 1) // 如果是圆形 drawCircle(); else if(type == 2) // 如果是直线 drawLine(); } public boolean isPointIn(float x, float y){ if(type == 0) // 如果是矩形 return isPointInRect(x,y); else if(type == 1) // 如果是圆形 return isPointInCircle(x,y); else if(type == 2) // 如果是直线 return isPointInLine(); return false; } }
这两个成员函数内部包含相似的处理逻辑,都是根据type的值做相应的处理,对于这种情况,应该充分利用面向对象中的多态性,下面是拆分成多个类的形式:
public abstract class Shape{ public abstract void draw(); public abstract boolean isPointIn(x,y); } public class Circleextends Shape{ public void draw(){ drawCircle(); } public abstract boolean isPointIn(x,y){ isPointInCircle(x,y); } } public class Rect extends Shape{ public void draw(){ drawRec(); } public abstract boolean isPointIn(x,y){ isPointInRect(x,y); } } public class Line extends Shape{ public void draw(){ drawLine(); } public abstract boolean isPointIn(x,y){ isPointInLine(x,y); } }
第三十五点:合理分层,分离界面显示和业务处理逻辑
代码的低耦合是保障软件可维护性的关键因素之一,而分层是实现代码低耦合的常用手段,也可以实现人员的有效分工,例如在企业级的Web开发中,一般都会划分出以下几个层次:
1、数据访问层,完成数据库的增删改查,一般都使用ORM框架来实现,例如Hibernate、LINQ等。
2、业务服务层,完成所有的业务处理逻辑
3、请求控制层,处理客户端请求,将业务交给服务层处理,把处理结果以某种形式(HTML、JSON等)返回给客户端。
在本地应用程序的实现中也会有类似的分层,例如MFC中的文档-视图结构也是界面显示和业务处理逻辑的分离,所以在代码中,应该尽量避免界面对象和业务对象的交叉引用,尤其是对于有多种界面呈现方式的系统中。
第三十六点:判断参数有效性
函数参数有效性的判断是函数实现中很重要的一部分,尤其是作为类的对外接口的公有成员函数,例如判断参数中的对象是否为null、参数值是否合法等,这些工作应该在函数实现的最开始处完成,发现参数不合法时可以直接返回、抛出异常或者提供参数默认值,一定不要通过非代码的方法(比如调用约定)来保证参数的的有效性,断言也不能完全保证函数执行时用到的参数都是合法的,除非在程序发布时所有的公有函数都能被执行到,因此,参数有效性的判断是函数实现中必不可少的部分。
本文由北京网站建设公司新网众志(http://www.xwzznet.com)编辑发布,如需转载请注明出处。