2020-10-26

设计原则学习心得

1——————设计原则
我们这里提到的设计原则其实是面向对象的设计原则,英文名叫SOLID(说实话第一次看到SOLID的这个词我不忍想到达索公司当年开发的Solid work 和 西门子开发的solid edge)。在设计和开发软件的时候运用这些原则可以创建出易于维护和开发的程序。这些原则被称为“敏捷”软件开发过程的一部分。说实话,在这几天的学习当中,我确实在实际项目中里领略到了这些原则带来的敏捷和高效,通过使用这些原则,程序中代码的不再像过去那样冗杂,而且极大地缓解了内存的压力。不过,要在实际开发中正确选择,并且使用这些原则,并非易事。

2——————原则类型
面向对象开发的类型,在这次学习过程中,主要涉及7类。它们分别是“单一职责原则”、“开闭原则”、“聚合/组合复用原则”、“迪米特法则”、“依赖倒置原则”、“里氏替换原则” 以及 “接口隔离原则”。有趣的是这七种原则之间并非互相独立的。相反,其中的一种原则会是另外一个加强或者基础。开发者如果违反了其中一个原则,那么开发者极有可能同时违反了多个原则。“开闭原则”通常被认为是面向对象可复用设计的基石,同时呢,其它原则则被认为是实现“开闭原则”的手段或工具。此外有的人还把这七个原则分为设计目标原则和设计方法原则两大类。其中设计目标原则包括了开闭,你是替换和迪米特。而设计方法原则包括了单一职责、接口隔离、依赖倒置、组合/聚合复用。

3——————单一职责
单一职责的定义是软件模块应该只有一个被修改的理由,简而言之就是一个模块只完成一个与其相关职责的业务。同时,为了评估职责的大小,“粒度”这个词被提出用来表示职责大小。粒度越大,职责越大,模块独立越重要。单一职责可以被视为使封装工作达到最佳状态的时间方式。如果出现更改理由,通常是需要修改代码。如果出现了多个需要修改模块内容的原因,那么每个类都可能引入影响其他类的更改。那么当这些更改出现在模块中,可能会破坏与其他更改原因相关的功能。另外一个方面,每个更改的理由都会增加新的依赖关系,那么代码这个时候就不会那么健壮,并且更加难以修改。举个例子:假如有一个关于汽车的类,其中不仅包含汽车的各种成员私有属性和get/set方法,同时还包括许多增、删、改、查等操作。这种情况下,汽车类不仅会封装成员属性和成员方法,还要把额外的数据库操作也一起封装。这种紧密耦合的代码会让类的维护和测试的难度加大。那么这时候通过运用单一职责,把这个关于汽车的类一分为二,一个负责封装属性和方法,另外一个负责封装数据库的操作,就能将问题轻松解决。

4——————开闭原则
开闭原则主要思想是对模块、类和函数应该对扩展开放,对修改关闭。其中的核心思想是“抽象”,即把有多方需求的相同代码提取出来,以提高代码的重用性。而把需求的不同代码视作功能的扩展。开闭原则的引用有助于开发复杂而又文件的软件。构建一个复杂的结构,在完成它的一部分的情况下,不应该去修改它,而是在它的基础上继续建设。同样的,一袋我们开发并通过测试了一个模块。如果想要修改它,那么不仅要测试正在改变的功能,还要测试它负责整个功能。整个过程会涉及大量的额外资源,这些资源如果从一开始没有进行准确的姑娘,会有带来额外风险的可能。所以运用开闭原则,在尝试在完成后保持模块不变,并通过继承和多态扩展来添加新功能。

5——————里氏替换原则
里氏替换原则被誉为继承复用的基石。只有从行为角度看可完全替代的子类才能替换其父类。由于继承带来了侵入性,增加了耦合性并且降低了代码的灵活度,所以里氏替换原则可以很好地避开以上这些问题。首先,里氏替换原则要求子类必须重写父类的抽象方法,但是不能重写父类已经实现的非抽象方法。然后,子类在不影响父类的情况下,可以扩展自己的特性。另外当子类覆盖或实现父类的方法时,方法的形参要比其父类的设置得更宽松。最后当子类方法实现父类抽象方法时,方法的返回值要比父类的更严格。

6——————接口隔离原则
接口隔离原则要求“客户端不应该依赖于它说不需要的接口” 简而言之便是在项目开发中让实现类使用专门的接口比用统一的接口便于项目的组织和项目的分工,这有效地让开发者避免面对自己用不到的接口的尴尬局面。在实际应用中,接口隔离原则减少了代码耦合,是软件更加健壮,并且易于维护和扩展。接口隔离原则如果被破坏,那么客户端会被迫以来他们不需要的接口,这样代码会变得紧密耦合,那么为其添加新功能会变得不可能。

7——————依赖倒置原则
该原则有三层含义:第一:高层模块不应该依赖于底层模块,二者都应该依赖抽象。第二:抽象不应该依赖于细节。第三:细节应该依赖于抽象。 通常,每一个逻辑的实现都是由原子逻辑组成的,而不可分割的原子逻辑就是低层模块(通常为接口,抽象类),原子逻辑的组装就是高层模块。而抽象就是指接口和或抽象类,两者都不能被直接实例化。细节就是实现类,实现接口或继承抽象类而产生的类就是细节,可以被直接实例化。下面是依赖倒置原则在Java语言中的表现:第一:模块之间的依赖是通过抽象来完成。实现类之间不能出现直接的依赖关系,但是其依赖关系可以通过接口和抽象类来产生。第二:接口和抽象类并不依赖实现类。第三:实现类依赖于接口和实现类。在依赖倒置的原则下,耦合降低,极大地提高了维护和扩展性。

8——————迪米特法则
该原则的核心目的是降低类与类之间的耦合。迪米特法则又叫做最少知识原则:表示其中一个对象在迪米特法则的作用下保持了对其他对象最少的了解。同时不管被依赖的类有多复杂,都应该将其逻辑进行封装,除了提供必要的public方法,不对外泄露任何类的内部信息。迪米特法则还有个名字叫“只与直接的朋友通信 ”, 即 “每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间 是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返 回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变 量的形式出现在类的内部。” – 摘自CSDN论坛。

9——————聚合/组合复用原则
在面向对象的设计中,如果直接继承基类,会破坏封装,因为继承将基类的实现细节暴露给子类;如果基类的实现发生改变,则子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性。于是就提出了组合/聚合复用原则,也就是在实际开发设计中,尽量使用合成/聚合,不要使用类继承。即在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的。通常 合成/聚合复用原则经常又叫做合成复用原则。该原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。组合/聚合可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。 由于组合或聚合关系可以将已有的对象(也可称为成员对象)纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能,这样做可以使得成员对象的内部实现细节对于新对象不可见,所以这种复用又称为“黑箱”复用,相对继承关系而言,其耦合度相对较低,成员对象的变化对新对象的影响不大,可以在新对象中根据实际需要有选择性地调用成员对象的操作;合成复用可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的其他对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值