面向对象软件设计原则

​ 写代码不只是写代码,写代码又是写代码。如何理解这句话呢?写代码不只是写代码,说的是写代码不仅局限于写代码,写代码就好比打仗,打仗前必须知道为什么打?如何打?怎样才能打赢?那么写代码之前也要去思考,需求是怎么?如何去设计和实现?怎么才能更好的实现?如何才能写出高质量的代码?高质量的代码必须满足可复用性,可扩展性,可维护性,可靠性,可读性等特征。写代码又是写代码,反映最后的设计是以代码的方式来落地的。

​ 经过设计和实现的代码才是严谨的,至少具有一定的下限;设计在系统开发中主要指系统设计,这在之前的架构设计中已经谈过,而在系统设计中需要面对对象软件设计,但是这也必须满足一定的设计原则,接下来就解析常用的设计原则:

  • 开闭原则(OCP)

    • 定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

    • 解读:用抽象构建框架,用实现扩展细节,不以改动原有类的方式来实现,而是以实现事先抽象的接口或者抽象类来实现。

    • 优点:在不改动原有代码的前提下给程序增加扩展功能,增加扩展性,降低程序维护成本,这是软件设计原则的总纲。

  • 单一职责原则(SRP)

    • 定义:一个类或者接口的职责要明确且唯一,即高内聚,低耦合。
    • 解读:将类按职责拆分为多个类,以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。
    • 优点:降低类的复杂度,提高类的可读性,可维护性。
  • 里氏替换原则(LSP)

    • 定义:子类实现父类中的抽象方法,则在调用上子类可以替代父类。
    • 解读:子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法;子类可以增加自己独有的方法;当子类的方法重载父类的方法时,传入的参数比父类的方法的入参更宽松,返回值要比父类的返回值更严格或者相等。
    • 优点:里氏替换原则是实现开闭原则的重要方式之一,提高了程序的健壮性,即类的扩展不会给已有系统引入错误。
  • 依赖倒置原则(DIP)

    • 定义:高层模块不应该依赖于底层模块,二者应该依赖于其抽象,抽象不应该依赖于细节,细节应该依赖于抽象。
    • 解读:通过面向接口编程来降低类间的耦合性,所以在项目中需要满足规则:1.每个类都尽量提供接口或者抽象类,或者两者都具备。2.变量的声明类型尽量是接口或者抽象类。3.任何类都不应该从具体类派生。4.使用继承时应遵循里氏替换原则。比如说需要对数据库中的数据进行增删查改等功能,而不管底层是什么数据库,这该如何实现?不同的数据库实现数据库的增删查改的接口,逻辑调用层只需要使用里氏替换调用对应的接口,而不管下层的数据库是Mysql还是openGauss或者又是达梦数据库。
    • 优点:降级类间的耦合性,提高系统的稳定性,减少代码并行开发引起的风险,提高代码的可读性和可维护性。
  • 接口隔离原则(ISP)

    • 定义:每个接口的职责都要明确单一,当我们实现复杂的类时,尽量实现多个接口,而不是把多个接口的功能放在一个接口中。

    • 解读:建立单一接口,不要建立在庞大臃肿的接口,尽量细化接口,接口的功能必须单一。

    • 优点:预防外来变更的扩散,提供系统的灵活性和可维护性,提供系统的内聚性,减少对外交互,降低系统的耦合性,减少项目过程中的代码冗余。

  • 迪米特原则(LOD)

    • 定义:对象之间应该尽量少的了解对方,又叫最少知道原则,尽量降低类和类之间的耦合。
    • 解读:从依赖者的角度来说,只依赖于应该依赖的对象,从被依赖者的角度来说,只暴露给应该暴露的方法,总之一句话,不让调用者知道自己过多的事情。
    • 优点:降低类之间的耦合度,提高类的可复用性和系统扩展,提高模块的相对独立性,
  • 合成复用原则

    • 定义:优先使用对象组合,其次考虑使用继承的关系来达到复用目的。
    • 解读:生命周期相同用组合(实心表示组合),生命周期不同用聚合(空心代表聚合),通过继承增加类之间的依赖性,当父类发生改变,子类也会发生变化;继承属于白箱操作,父类对子类来说是透明的,这就破坏类的封装性。
    • 优点:提高类的封装性,使复用的灵活性更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值