浅谈面向对象和设计的基本原则

最近开始反观OO以及设计的原则,发现之前理解的确实比较浅显,翻了一些书,然后做一下比较吧。

 ​面向对象编程(OO)的核心是啥?

看了一些文章之后,应该是四个关键字,抽象、封装、继承、多态,后面三个环环相扣。没有封装就谈不上继承,没有继承也就没有了多态。

 ​1、封转的目的是将代码切分成多个模块,每个模块之间的关联性降到最低,这里其实就是模块内部高内聚,模块之间低耦合,降低相互依赖的复杂度,使其更加易于维护。模块一次,在OO中,大家更加喜欢较多类,通常情况下,一个应用系统包含多个模块,模块包含多个类。封装是以数据位核心,将相关的数据放在一起,将会用到这些数据的函数和数据放在一起。为了和非OO做出区分,OO中将Function叫做Method,将Call叫做Invoke。能见度的问题,封装的目的是要“降低相互依赖的程度”,就涉及到能见度的问题“一个类、方法、属性该不该暴漏给别的模块”,最好的效果就是“别人不需要知道的,就不让他知道”,这就是所谓的“信息隐藏”。设计能见度不是一件容易的事情,往往需要多多思考,太宽和太紧都会导致一定的问题。

 ​2、继承的类叫做“基类”、“父类”、“超类”等,继承者成为“衍生类”、“次类”、”子类“,继承的目的是要达到代码复用或者接口复用,而继承的手段是“扩展”和“修改”。继承所做的扩充和修改,并不会影响到超类,两者在记忆体内是独立的。继承所导致的接口复用,是在为了OO的下一个阶段(多态)中做准备,接口复用、搭配方法的修改就形成了多态。许多类之间的继承多系,可以绘制成一张关系图,可以使“超类在上,子类在下”、“超类在左,子类在右”这就形成了一张类阶图,由于大多数是单一继承而不是多重继承,所以类阶图会是一个树状的机构。继承在一定程度上破换了封装,造成次类和超类相互依赖程度提高。

 ​3、一个对象,为何能够有各种形态,因为继承而来,对象可以扮演所有祖先类的角色,所谓的多态,就是“不管形式类是什么,一定会执行到实际类”。

 

一般设计的原则有哪些?

1、约定优于配置

在很多框架设计中,由于相同的行为用户需要不断的重复配置,会让人很烦,于是,既然大家都按照这种方法来,那干脆我们约定这么搞算了,例如放在特定的位置我们就认识是特定类型的数据,例如特定关键结尾的我们归为一类。

2、KISS

keep it simple and stupid,kiss原则在很多场景下用到,不仅仅是软件设计领域,其实把一件事情变复杂很简单,把一个复杂的事情变简单很难。

3、CQS命令查询分离

当一个方法返回一个值来回应一个问题的时候,他就具有查询的性质;当一个方法要改变对象的状态的时候,他就具有命令的性质;为了接口的单一性和安全性,一般设计的时候都要遵守CQS原则。

4、好莱坞原则

最简单的描述“不要找我,有事情我会找你的”,由容器来控制程序之间的关系,而非写在代码中,这也就是所谓的控制反转。

5、高内聚、低耦合

内聚指一个模块内各个元素彼此结合的紧密程度,耦合至不同组件之间相互依赖的程度。

6、OO中的原则有哪些?

单一职责

    ​这个原则非常简单,也比较容易理解,就是职责单一,纯粹理论上讲,这个原则非常优秀,但是具体在衡量的时候,就很难说了。对于单一职责,最好做到接口要单一职责,类的设计尽量做到只有一个原因引起变化。

里氏替换

    ​在面向对象的设计中,继承是不可避免的,而里氏替换为良好的继承定义了一个规范。​子类必须完全实现父类的方法;子类可以有自己的个性;覆盖或者实现父类的方法时,输入参数可以被放大,输出结果可以被缩小。

依赖倒置

    ​三层含义,高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象;本质就是通过抽象(接口或者抽象类)使各个模块实现彼此独立。每个类尽量都有接口或者抽象类,变量的表面类型尽量是接口或者抽象类,任何类都不应该从具体类派生,尽量不要复写基类的方法。

接口隔离

    ​一个接口只服务于一个子模块或者业务逻辑;已经被污染了的接口,尽量去修改,若变更的风险较大,则采用适配器的模式进行转化处理;了解环境,拒绝盲从,每个项目或产品都有特定的环境因素,别看到大师这样做你就照抄。

​迪米特原则

    ​最小知识原则,一个类应该对其他对象有最少的了解,通俗的讲,一个类应该对自己需要耦合或者调用的类知道的最少。核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用才可以提高,但是这种原则的情况下,产生了大量的中转或者跳转,导致系统复杂性提高,采用这个原则的时候,需要反复权衡,既要结构清晰也要做到高内聚低耦合。

​开放封闭

    ​这是一个非常虚的原则,最简单的描述就是对扩展开放,对修改关闭,如何做到开放封闭原则呢?封装变化(也就是说提出预计有的变化或者不稳定的点,把变化保护起来);制定项目章程(项目来说约定优于配置);通过元数据来控制模块行为(何为元数据,就是描述环境和数据的数据)。

 

    ​软件设计最大的难题就是应对需求的变化,但是纷繁复杂的需求变化又是不可预料的。

 

参考文章和书籍:

蔡学镛:思考面向对象

《设计模式之禅》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值