第三十一计:置空不用的对象
在C++中,销毁一个对象后,一定要把指针置为NULL,否则会出现野指针,最好写成下面这样,delete后立马置为NULL,
delete pObject;
pObject = NULL;
在Java中,当不再需要一个对象时,最好能把它置为null,这样有利于垃圾回收。
第三十二计:善于利用接口
1、 回调型接口
在C语言中,回调函数可以通过函数指针来实现,Java中没有指针的概念,可以利用接口来达到同样的目的,例如:
public interface Callback{
public void onChanged();
}
public void execute(Callback callback){
...
callback.onChanged();
...
}
2、标记型接口
这种类型的接口中不包含函数的声明,即接口是空的,主要用来让实现这个接口的类表明自身具有某种特性,起一个标记的作用,例如下面的接口:
public interface Millionaire{
}
public class Member extends User implements Millionaire{
...
}
public boolean check(User user){
if(user instanceOf Millionaire) // 这是百万富豪,直接让它pass
return true;
...
}
3、依赖注入型接口
这种接口一般用在工厂方法中,有选择性地为要创建的对象注入对象引用或者数据,例如:
public interface DataAware{
public void setData(Data data);
}
public interface DataBaseConnectionAware{
public void setConnection(Connection conn);
}
// 用户服务类
public class UserService extends Service implements DataAware,DataBaseConnectionAware{
public void setData(Data data);
public void setConnection(Connection conn);
}
// 创建服务对象
public Service createService(int type){
Service service = null;
if(type == USER){
service = new UserService();
if(service instanceOf DataAware) // 如果它想要数据,则注入数据对象
((DataAware)service).setData(data);
if(service instanceOf DataBaseConnectionAware) // 如果它想要数据库连接,则注入连接对象
((DataBaseConnectionAware)service).setConnection(conn);
return service;
}
第三十三计:简化类关系
如果类之间的关系比较复杂,那么很可能是面向对象的设计没有做好。一般来说,两个类之间有双向调用关系则说明它们在职责上的分配上不够清晰,例如,一个类(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、参数值是否合法等,这些工作应该在函数实现的最开始处完成,发现参数不合法时可以直接返回、抛出异常或者提供参数默认值,一定不要通过非代码的方法(比如调用约定)来保证参数的的有效性,断言也不能完全保证函数执行时用到的参数都是合法的,除非在程序发布时所有的公有函数都能被执行到,因此,参数有效性的判断是函数实现中必不可少的部分。
分享到:
相关推荐
以上是重构的其中十计,重构的目的是提升代码质量,使其更易读、易维护。通过持续不断地进行重构,我们可以逐步优化代码,减少潜在的错误,同时提高开发效率。记住,重构并不总是意味着大规模的改动,有时候一个小的...
【代码重构36计】是关于提升代码质量与可维护性的策略集合,主要针对C++编程语言。重构的核心目标是使程序更容易理解、更便于维护,并优化其结构。以下是其中的五项重构策略: 1. **参数列表对象化**: 当函数的...
重构是软件开发中的一种重要实践,旨在改善代码的结构,提高可读性和可维护性,同时保持原有功能。以下是对给定文档中提及的重构策略的详细解释: ### 参数列表对象化 当一个函数或方法的参数过多时,可以考虑创建...
"藏经阁-研发效能提升和敏捷实施36计.pdf" 本文档主要介绍了阿里巴巴的研发效能提升和敏捷实施36计,旨在提高研发效率和敏捷性。下面是本文档的知识点总结: 一、流动效率和研发效率提升 * 流动效率:响应能力、...
### 提高PHP代码质量36计之精要 在软件工程领域,代码质量的重要性不言而喻,尤其对于广泛使用的编程语言PHP而言,提升代码质量不仅能够增强程序的稳定性、可维护性和安全性,还能显著提高开发效率。以下,我们将...
提高PHP代码质量的36计,是一份针对PHP开发者提升代码质量和编程效率的指南,尤其适合初学者和希望精进技能的中级开发者。本文将详细解读其中的几个关键点,帮助开发者理解并实践这些规范。 ### 1. 避免使用相对...
重构,其实很简单,它的目的就是让程序变得更容易被理解,更具有可维护性,结构更合理
**31. 磁场削弱(Field Weakening)** - **定义:**在高速运行时降低电机磁场强度的技术。 - **目的:**允许电机在超过额定转速的情况下运行。 **32. 磁通** - **定义:**磁场穿过某一面积的总和。 - **单位:**...
3.6.2 连接所有元素 36 3.6.3 测试 39 3.7 小结 39 第4章 更丰富的用户界面 40 4.1 满是控件的屏幕 40 4.2 活动、静态和被动控件 42 4.3 创建应用程序 42 4.3.1 导入图像 42 4.3.2 实现图像视图和文本字段 43 4.3.3...