设计原则如何能让你的代码变得更好

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

Ø  使用设计模式的目的:为了代码复用,实现开闭原则,保证代码可读性、可靠性、可维护性等。 实现代码编写的工程化,是软件工程的基石脉络,如同大厦的结构一样。

Ø  那么怎么才能应用设计模式,实现代码复用呢?以开闭原则为目标,实现如下六大原则

http://image.huawei.com/tiny-lts/v1/images/4128225f2ae85b86a4bf_754x156.jpg@900-0-90-f.jpg

Ø  开闭原则

对象(类,模块,函数等等)应该对于扩展是开放,但是对于修改是封闭。遵循这种原则的代码在扩展时并不会改变老代码,因此代码审查、单元测试等质量重点针对扩展代码即可,提升开发效率和质量。

Ø  单一职责原则

一个对象,只有一个引起它变化的原因,即只有一个职责。多个职责耦合在一起,是脆弱的设计,影响复用性。

不好的代码:

int youngest = peopleLst[0] ? peopleLst[0].age : Infinity;
int totalSalary = 0;
for(people p : peopleLst){
    if(p.age < youngest){
        youngest = p.age;
    }
    totalSalary += p.salary;
}

好的代码:

代码问题:几行代码执行了两个职责,计算最小年龄、得到总工资,这两个职责没有任何关系,只是共用了一个循环

样例:

public static void main(String[] args) {
    int totalSalary = getTotalSalary(peopleLst);

    int youngest = getYoungest(peopleLst);
}

private int getTotalSalary(List<People> peopleLst){
    int totalSalary = 0;
    for(People p : peopleLst){
        totalSalary += p.salary;
    }
    return totalSalary;
}

private int getYoungest(List<People> peopleLst){
    int youngest = peopleLst[0] ? peopleLst[0].age : Infinity;
    for(people p : peopleLst){
        if(p.age < youngest){
            youngest = p.age;
        }
    }
    return youngest;
}

 

Ø  合成/聚合复用原则

就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,这样做可以使得成员对象的内部实现细节对于新对象不可见,成员对象的变化对新对象的影响不大,其耦合度相对较低,所以这种复用又称为“黑箱”复用。

 

不好代码:

public class Student {
    private String name;
    private int age;
    private int centralAthleticAssociation;
    private int bloodPressureHigh;
    private int bloodPressureLow;
    private int height;
}

好代码:

public class PhysicalExaminationReport {
    private int centralAthleticAssociation;
    private int bloodPressureHigh;
    private int bloodPressureLow;
    private int height;
}
public class Student {
    private String name;
    private int age;
    private PhysicalExaminationReport physicalExaminationReport;
}

 

Ø  里氏替换原则

只要有父类出现的地方,都可以用子类来替代,而且不会出现任何错误和异常。遵循这种原则,不会基于子类对父类的非抽象方法任意修改,避免对整个继承体系造成的破坏。

继承关系使用的基础,所以实际编码过程中继承关系会用得相对较少

 

Ø  接口隔离原则

使用多个专门的接口比使用单一的总接口要好。接口是我们设计时对外提供的契约,通过分散定义多个 接口,可以提高系统的灵活性和可维护性。

不好的代码:

http://image.huawei.com/tiny-lts/v1/images/c743c25f2ae85c069ac3_843x251.png@900-0-90-f.png

好的代码:

http://image.huawei.com/tiny-lts/v1/images/85e2d25f2ae85cfc3eb7_822x231.png@900-0-90-f.png

Ø  依赖倒转原则

针对接口编程,不要针对具体实现编程。降低了业务逻辑与算法间的耦合。

不好的代码:

http://image.huawei.com/tiny-lts/v1/images/9779625f24d426122a7c_614x137.png@900-0-90-f.png

好的代码:

http://image.huawei.com/tiny-lts/v1/images/a7f6a25f24d426b33e2e_862x361.png@900-0-90-f.png

 

Ø  迪米特法则

又叫作最少知识原则,一个对象应当尽可能少的与其他对象发生相互作用。有利于降低对象之间的耦合,使系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。

前面的代码案例中都遵守了这个原则。

 

要解决更多、更复杂的问题,设计模式请参考相关书书籍或者专题讨论。

 

 

 

 

里氏替换原则:

 
坏的例子:
class Person {
  public void speak(String msg) { ... }
}
class MutePerson {
  @Override public void speak(String msg) { throw new SpeakError("A mute person cannot speak"); }
}
 
posted @ 2022-06-27 18:02  易先讯  阅读(35)  评论(0编辑  收藏  举报