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


    设计模式(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"); }
    }
     
  • 相关阅读:
    修改SharePoint 2013中item Created by 信息
    用powershell批量新增user profile
    如何发一封回复的时候收件人和发件人不同的邮件
    SharePoint 2013配置 Workflow Manager
    正则表达式
    go
    HTML5
    js-example
    css3
    jquery-example
  • 原文地址:https://www.cnblogs.com/gongxianjin/p/16417050.html
Copyright © 2020-2023  润新知