`

重构36计(31-36)

阅读更多
第三十一计:置空不用的对象
在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计-其实很简单

    以上是重构的其中十计,重构的目的是提升代码质量,使其更易读、易维护。通过持续不断地进行重构,我们可以逐步优化代码,减少潜在的错误,同时提高开发效率。记住,重构并不总是意味着大规模的改动,有时候一个小的...

    代码重构36计(摘抄)

    【代码重构36计】是关于提升代码质量与可维护性的策略集合,主要针对C++编程语言。重构的核心目标是使程序更容易理解、更便于维护,并优化其结构。以下是其中的五项重构策略: 1. **参数列表对象化**: 当函数的...

    重构36计.docx

    重构是软件开发中的一种重要实践,旨在改善代码的结构,提高可读性和可维护性,同时保持原有功能。以下是对给定文档中提及的重构策略的详细解释: ### 参数列表对象化 当一个函数或方法的参数过多时,可以考虑创建...

    藏经阁-研发效能提升和敏捷实施36计.pdf

    "藏经阁-研发效能提升和敏捷实施36计.pdf" 本文档主要介绍了阿里巴巴的研发效能提升和敏捷实施36计,旨在提高研发效率和敏捷性。下面是本文档的知识点总结: 一、流动效率和研发效率提升 * 流动效率:响应能力、...

    提高PHP代码质量36计

    ### 提高PHP代码质量36计之精要 在软件工程领域,代码质量的重要性不言而喻,尤其对于广泛使用的编程语言PHP而言,提升代码质量不仅能够增强程序的稳定性、可维护性和安全性,还能显著提高开发效率。以下,我们将...

    提高php代码质量 36计 转载开源中国社区

    提高PHP代码质量的36计,是一份针对PHP开发者提升代码质量和编程效率的指南,尤其适合初学者和希望精进技能的中级开发者。本文将详细解读其中的几个关键点,帮助开发者理解并实践这些规范。 ### 1. 避免使用相对...

    java 三十六计

    重构,其实很简单,它的目的就是让程序变得更容易被理解,更具有可维护性,结构更合理

    TI_MotorControlCompendium_2010

    **31. 磁场削弱(Field Weakening)** - **定义:**在高速运行时降低电机磁场强度的技术。 - **目的:**允许电机在超过额定转速的情况下运行。 **32. 磁通** - **定义:**磁场穿过某一面积的总和。 - **单位:**...

    iphone3开发基础教程

    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...

Global site tag (gtag.js) - Google Analytics