`
iamzhongyong
  • 浏览: 796461 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

最近开始反观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
0
分享到:
评论

相关推荐

    浅谈领域模型驱动中表的设计方法

     层次 职责 表现层 提供服务、显示信息 领域层(业务逻辑) 逻辑、系统中真正的核心 数据源层 与数据库、消息系统、事务管理器及其他软件包通信分层基本原则领域层和数据源层绝对不要依赖于表现层;...

    asp.net知识库

    与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable 与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow ASP.NET中大结果集的分页[翻译] .net 2.0 访问Oracle --与Sql Server的...

    传智播客扫地僧视频讲义源码

    03_用面向过程和面向对象方法求解圆形面积_类和对象的关系思考_传智扫地僧 04_类中不写成员函数易犯错误模型 05-易犯错误模型-为什么需要成员函数(补充资料)-传智扫地僧 06_课堂答疑类中写成员函数_调用的时才会执行...

    ASP.NET3.5从入门到精通

    第 3 章面向对象设计基础 3.1 什么是面向对象 3.1.1 传统的面向过程 3.1.2 面向对象的概念 8 第一篇 窗口与界面编程 3.1.3 面向组件的概念 3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 ...

    ASP.NET 3.5 开发大全word课件

    第3章 面向对象设计基础 3.1 什么是面向对象 3.1.1 传统的面向过程 3.1.2 面向对象的概念 3.1.3 面向组件的概念 3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 ...

    ASPNET35开发大全第一章

    第3章 面向对象设计基础 3.1 什么是面向对象 3.1.1 传统的面向过程 3.1.2 面向对象的概念 3.1.3 面向组件的概念 3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 ...

    ASP.NET 3.5 开发大全11-15

    第3章 面向对象设计基础 3.1 什么是面向对象 3.1.1 传统的面向过程 3.1.2 面向对象的概念 3.1.3 面向组件的概念 3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 ...

    ASP.NET 3.5 开发大全

    第3章 面向对象设计基础 3.1 什么是面向对象 3.1.1 传统的面向过程 3.1.2 面向对象的概念 3.1.3 面向组件的概念 3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 ...

    ASP.NET 3.5 开发大全1-5

    第3章 面向对象设计基础 3.1 什么是面向对象 3.1.1 传统的面向过程 3.1.2 面向对象的概念 3.1.3 面向组件的概念 3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 ...

Global site tag (gtag.js) - Google Analytics