`

重构36计(1-6)

阅读更多
重构,其实很简单,它的目的就是让程序变得更容易被理解,更具有可维护性,结构更合理。重构应该是我们平时写代码过程中必不可少的一部分,比如给函数起了一个更好的名字、把大函数拆分成几个小函数等都属于重构。重构的经典书籍包括Martin Flower的《重构-改善既有代码的设计》、Joshua Kerievsky的《重构与模式》,本系列的所谓36计是我多年来使用最为频繁的重构策略和编码准则,有自己总结的,也有书上提到过的,希望对大家能有所帮助。
第一计:参数列表对象化
  公有函数的参数应尽可能保持不变,因为很多地方都会调用它,修改参数后需要修改它的调用处,另外,它的参数列表不宜过长,数量尽量保持在5个以内,长参数列表会增加该函数的调用难度。对于参数较多或者参数经常变化的公有函数,较好的办法是引入参数对象,即该函数的参数只有一个,它就是参数对象,具体的参数都在该对象中声明,为函数引入参数对象有以下几个好处:
1、保持函数接口的不变性,修改函数参数只需修改参数对象中的成员变量。
2、调用方便,调用方不用再关心参数的顺序。
以下代码片段是一个添加用户函数的声明:[/size]
public long insertUser(String name,int age,String email,String address,String phone,String birthDay)

[size=medium]每当添加或删除用户的字段后都要修改insertUser的参数列表,调用者也需要修改,而且参数较多时,不容易记忆。
以下是引入参数对象后的形式:
public class UserParam{
  public String name;
  public int age;
  public String email;
  public String address;
  public String phone;
  public String birthDay;
}

public long insertUser(UserParam user);


第二计:条件运算符赋值代替if else赋值
  对于根据条件为变量赋值的情况,可以有两种方式,一种是通过if-else:
int value;
if(condition)
  value = 1;
else
  value = 2;

另一种是通过条件运算符:
int value = condition ? 1 : 2;

第二种方式明显要比第一种方式好,但是很多人却钟爱第一种方式,可能是if-else习惯了。

第三计:节约使用系统资源
即使在写代码时,我们也应该养成“节俭”的习惯,不要随便浪费系统提供的资源,对于那些较占用空间、影响性能的对象,应该直到真正要用的时候才创建或者初始化,因此在提供这些对象的函数实现中,尽量采用如下形式:
// 管理数据库连接的类
public class DataBaseConnectionHolder{
  private Connection conn;

  public Connection getConnection(){
     if(conn == null){
       conn = new Connection();
       conn.init(); 
      }
     return conn;
   }
}

另外,我们可以通过引入缓存机制(如对象池)来充分利用系统资源

第四计:为接口引入抽象版本
  在声明一个新的接口时,不能保证该接口不会被修改,有可能会经常修改它,每一次修改接口都要修改相应的实现类,如果某个接口是公共库的一部分,那么修改接口的代价是较大的,用到该接口的所有程序都需要重新修改、编译...,通过为接口引入抽象版本可以解决这个问题,例如为下面的接口增加一个抽象类:
public interface Widget{
  public void draw();
  public void layout();
  public void invalidate();
  public void show();
}
 
public abstract class AbstractWidget implements Widget{
  public abstract void draw();
  public void layout(){};
  public void invalidate(){};
  public void show(){};
}

这样Widget的实现类可以直接从AbstractWidget继承,如果要修改Widget接口,则只需要修改AbstractWidget即可,对于其他实现类没有影响。

第五计:消灭魔法数
  编程新手一般都会直接将表示类型或状态的数字直接写在处理逻辑中,代码的作者能明白该数字所表示的含义,但其他人读到这段代码时就很有可能看不懂了。即使代码的作者再过一段时间来看这部分代码,也可能会忘记该数字的含义,而且,当我们要修改魔法数的值时,过程是很繁琐的,很有可能会有所遗漏,所以,最好的办法是彻底消灭程序中的所有魔法数,通过常量定义、枚举等方式来避免魔法数的出现。

第六计:使用断言、异常确保实现的正确性
  使用断言的目的是告知其他程序员代码中某处必须要遵守的规矩,它是debug版本中的一种确保程序实现正确性的手段,在正式发布的版本中,断言是不起作用的。在java中,启用断言需要增加一个编译选项,不过可以通过抛出异常来达到相同目的,使用异常比断言要危险,因为在程序的正式发布版本中会引起崩溃,不过有时候崩溃总比程序的诡异行为更好,例如:
// 表示集合的类
public class Collection{
  // 添加元素到集合中
  public void addElement(Element e){};
 
  // 获取指定位置的元素
  public void getElement(int index){}; 
}

// 表示只读集合的类
public class ReadOnlyCollection extends Collection{
  // 添加元素到集合中
  public void addElement(Element e){
    throw new UnsupportedOperationException("只读集合,不允许添加元素");
  }
  
  // 获取指定位置的元素
  public void getElement(int index){};
}

调用ReadOnlyColletion派生类必须遵守规矩:不能调用addElement,否则抛出异常干掉程序!

ref:http://blog.csdn.net/m13666368773/article/details/7472201
分享到:
评论

相关推荐

    重构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

    **6. 制动** - **定义:**制动技术是指电机停止或减速的过程。 - **类型:**包括动态制动、再生制动等。 **7. 刷式直流电机(BDC)** - **定义:**一种传统的直流电机,通过电刷和换向器实现电流的连续供应。 - **...

    iphone3开发基础教程

    第1章 欢迎来到iPhone的世界 1 1.1 关于本书 1 1.2 必要条件 1 1.3 必备知识 3 1.4 编写iPhone应用程序有何不同 4 1.4.1 只有一个正在运行的应用程序 4 1.4.2 只有一个窗口 4 1.4.3 受限访问 5 1.4.4 有限的响应时间...

Global site tag (gtag.js) - Google Analytics