最近开始反观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中的原则有哪些?
单一职责
这个原则非常简单,也比较容易理解,就是职责单一,纯粹理论上讲,这个原则非常优秀,但是具体在衡量的时候,就很难说了。对于单一职责,最好做到接口要单一职责,类的设计尽量做到只有一个原因引起变化。
里氏替换
在面向对象的设计中,继承是不可避免的,而里氏替换为良好的继承定义了一个规范。子类必须完全实现父类的方法;子类可以有自己的个性;覆盖或者实现父类的方法时,输入参数可以被放大,输出结果可以被缩小。
依赖倒置
三层含义,高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象;本质就是通过抽象(接口或者抽象类)使各个模块实现彼此独立。每个类尽量都有接口或者抽象类,变量的表面类型尽量是接口或者抽象类,任何类都不应该从具体类派生,尽量不要复写基类的方法。
接口隔离
一个接口只服务于一个子模块或者业务逻辑;已经被污染了的接口,尽量去修改,若变更的风险较大,则采用适配器的模式进行转化处理;了解环境,拒绝盲从,每个项目或产品都有特定的环境因素,别看到大师这样做你就照抄。
迪米特原则
最小知识原则,一个类应该对其他对象有最少的了解,通俗的讲,一个类应该对自己需要耦合或者调用的类知道的最少。核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用才可以提高,但是这种原则的情况下,产生了大量的中转或者跳转,导致系统复杂性提高,采用这个原则的时候,需要反复权衡,既要结构清晰也要做到高内聚低耦合。
开放封闭
这是一个非常虚的原则,最简单的描述就是对扩展开放,对修改关闭,如何做到开放封闭原则呢?封装变化(也就是说提出预计有的变化或者不稳定的点,把变化保护起来);制定项目章程(项目来说约定优于配置);通过元数据来控制模块行为(何为元数据,就是描述环境和数据的数据)。
软件设计最大的难题就是应对需求的变化,但是纷繁复杂的需求变化又是不可预料的。
参考文章和书籍:
蔡学镛:思考面向对象
《设计模式之禅》
相关推荐
封装是面向对象设计的一个基本原则,指的是将数据和操作数据的方法封装在一个单一的单元(类)中,对外部隐藏对象的内部细节。这种机制保护了数据的完整性和安全性,同时也简化了对象之间的交互。 #### 4. 继承...
根据提供的文件信息,本文将深入探讨面向对象建模语言UML的相关知识点,涵盖面向对象程序设计的基本概念、模型与建模的重要性及原则,以及UML的基本组成部分。 ### 一、面向对象程序设计 面向对象程序设计(Object...
进一步深入,课程会讲解类的继承、多态性和封装,这些都是面向对象编程的核心原则。学员会学习到接口、抽象类以及访问修饰符的用法,以实现更加灵活和可维护的设计。此外,异常处理、集合框架(如ArrayList、...
面向对象的设计侧重于数据和功能的封装,而结构化程序设计则更多关注算法的实现和程序的流程控制。在大型应用系统中,往往结合使用这两种方法:系统的总体框架通常由面向对象的方法构建,而具体功能的实现则可能更多...
其中,单一原则(Single Responsibility Principle, SRP)是面向对象设计的基本原则之一,它强调一个类或接口应该有且只有一个引起它变化的原因,也就是说,一个类应该只有一个职责。这个原则有助于提高代码的可读性...
实时数据库系统设计是IT领域中一个关键的子...这些设计原则和实现方法共同构成了一个能够实时响应和处理大量数据的高性能系统。在实际应用中,开发者需要不断优化和调整这些元素,以适应不断变化的业务需求和环境挑战。
面向对象的程序开发过程中,首先需要分析程序中涉及的数据,然后基于这些数据设计类,并在类中添加处理数据的方法(即算法)。最后,通过设置不同的访问级别实现封装。 #### 三、数据库的发展历程 数据库的起源...
### 浅谈SOAP知识点解析 #### 一、为什么需要SOAP? 随着信息技术的飞速发展,企业面临着日益复杂的信息化挑战。为了适应这种变化,现代企业信息系统往往由多个平台和技术构成,形成了复杂的多系统环境。这样的...
开放封闭原则(Open-Closed Principle,简称OCP)是软件设计模式中的一项基本准则,它在C#等面向对象编程语言中占据着重要的地位。这一原则由 Bertrand Meyer 在其著作《面向对象软件构造》中提出,核心思想是“软件...
开闭原则(Open-Closed Principle, OCP)是面向对象设计的基本原则之一,由Bertrand Meyer在其著作《Object-Oriented Software Construction》中提出。OCP主张软件实体(如类、模块、函数等)应当对扩展开放,对修改...
这种分离虽然在一定程度上提高了代码的可读性和可维护性,但往往导致对象过于简单,缺乏行为,从而不完全符合面向对象的原则。 "充血模型"则主张将业务逻辑和数据持久化功能融入领域对象中,使得每个数据库表对应的...
### 浅谈软件工程中数据流图的画法 #### 一、软件工程的重要性 软件工程作为信息产业的重要组成部分,其重要性不言而喻。随着信息技术的发展,软件产品的复杂性和规模不断扩大,软件工程学应运而生。该学科旨在...
C语言不仅是一种基础编程语言,而且对理解其他面向对象语言和网络编程技术有着至关重要的作用。C语言与《数据结构》等后续课程有着紧密联系,学好C语言可以为后续学习打下坚实的基础。在教学过程中,可以通过展示...
在面向对象编程中,继承是一种重要的机制,它允许创建一个新的类(子类),该类继承了现有类(父类)的特性。这种机制不仅可以减少代码重复,提高代码复用率,还能使程序结构更加清晰和易于维护。Python作为一种强大...
其主要目的是解决面向对象设计中常见的问题——如何实现对象间的解耦,使得一个对象的状态改变能够自动通知其他多个依赖对象,从而达到“高内聚、低耦合”的设计原则。这种模式特别适用于处理一对多的关系场景,即当...
它通过异常类的层次结构来实现错误的分类管理,并提供了一套面向对象的接口来支持异常的创建、抛出、捕获和处理。 2. 异常的分类 在Java中,异常主要分为Error和Exception两大类。Error类用于表示严重的系统错误和...