`
yunchow
  • 浏览: 317325 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

面向对象程序设计思想(精华)

阅读更多
面向对象语言具有封装,继承,多态的特征。那么在用面象对象语言进行程序设计的时候,我们应该要注意些什么,遵守哪些原则呢。 我们都知道在面向对象世界中拥有5大关系,6大原则,23种设计模式。那么他们是什么关系,到底有什么用呢。
 
我们定义类来封装对象,应该尽量的保证类职责的单一性,从而提高他的灵活性,重用性,扩展性和维护性。如果类职责R因为某种原因(比如说新需求)变成两个职责R1、R2,这时就发生了职责扩散。这个时候如果业务逻辑足够简单,我们可以修改原来的代码来满足新的职责;如果业务复杂但是类结构简单,我们可以新增方法来兼容。但是这时已经违反了单一职责原则,但这却是可以接受的,因为类依然具有一定程度的灵活性。当不满足这两种情况的时候,我们必须要重构设计来满足此原则。(单一职责原则)
 
类可以实现多个接口,类实现接口应该建立在最小的接口上,实现他必须的接口,不实现非必须的接口。在接口本身满足单一职责原则的情况下,各个接口必然是职责单一的。如果实现了非必须的接口,那么就会发生变更扩散。通俗上讲变更扩展是另一种形式的职责扩散。当类实现多个非必须接口往往会引入多个职责从而发生职责扩散。因此我们在设计上应该分散的定义多个接口满足单一职责原则,从而避免变更扩散,提高灵活性和可维护性。(接口隔离原则)
 
在面向对象编程中,继承给我们带来很大的灵活性和扩展性。但是庞大繁琐的继承结构往往会带来更多的复杂度以及难以维护。继承在面向对象编程中代表着 is a 的类的父子关系。子类就是父类,父类出现的地方都可以透明的替换成子类对象。多态是面象对象的另一特征,我们在继承时可以去重载父类的方法,因此他给我们带来了更大的灵活性和扩展性。在同时也给程序带来了巨大的破坏性和不确定性,使程序难以维护。因此在我们进行程序设计时要去维护正确的继承结构体系,从而维护系统架构的稳定性。继承时尽量去重载抽象方法,不去重载非抽象方法。在子类扩展新的方法。重载方法时保证前置条件更加宽松,后置条件更加严格。(里氏替换原则)
 
在程序设计时,我们往往创建多个具有不同职责的类,来提高系统的灵活性和扩展性。但是要实现一个复杂的业务逻辑就需要把这些类组合起来,形成更为复杂庞大的结构,他们间的交互关系错综复杂。UML中有五大关系:泛化(is a),关联(has a),聚合(has a),组合(contains a),依赖(use a)。在面向对象语言中继承和实现接口可以简单归结为泛化关系。关联,聚合,组合,依赖都是在讲对象间的交互关系;由此可见对象间的关系的组织是多么的重要。组合是一种强类型的聚合,聚合是单向的,聚合对象可以独立存在。但组合对象是一种整体性结构,不可独立存在,具有相同的生命周期。聚合是一种特殊的关联关系。关联不单是单向的,还可以是双向的叫双向关联,相互之间没有强制的约束关系,存在的形式可能是拥有一个成员变量的引用。当然这3种关系都是类范围内的关系,但是依赖关系却是方法范围内的。依赖体现为方法形参、返回值或静态调用。(五大关系)
 
在类与类之间相互交互时,应该使依赖的别的对象降到最少,因此叫最少知道原则。如果称形参、返回值、成员变量为直接朋友,其他依赖的对象叫间接朋友,那我们应该尽量依赖直接朋友不要去依赖间接朋友,保证只与直接朋友通信。如此一来类之间的耦合势必降到最低,类内达到较高聚合性。从而实现高耦合低内聚。(迪米特原则)
 
在软件设计时,按不同的职责创建大量具有不同职责的类,而将相关职责的类组合到一起形成模块,将相关的模块组合到一起形成子系统,再将子系统组合起来将形成系统。而同时可以使类、模块、子系统达到最大程序的重用。那么在对他们进行重新组合重用时,必须保证结构的稳定性,依赖的高度抽象性。软件设计的过程本质就是将现实世界抽象为计算机模型的过程。而抽象模型与具体模型相比往往更加稳定。因此我们要依赖抽象而不要去依赖具体。不管是类与类之间,还是模块与模块之间,他们不应该相互依赖,他们应该共同依赖抽象(接口),这实质上就是面向接口编程,从而也实现模块与模块间的低耦合,模块内的高内聚。(依赖倒置原则)
 
我们从类的角度理解了单一职责原则,从接口的角度理解了接口隔离原则,从继承角度理解了里氏替换原则,从UML角度理解了迪米特原则,从系统的角度理解了依赖倒置原则。如果将这五大原则联合起来考虑就不难发现他们实现了一个共同的目标就是实现软件的稳定性和扩展性:对修改关闭,对扩展开放。这就是开闭原则,他是前五种原则的总纲。(开闭原则)
 
简单总结,单一职责原则要求我们保证类的职责单一,避免职责扩展,提高类的灵活性与重用性。接口隔离原则要求我们分散定义接口,避免变更扩散,提高重用性与稳定性。里氏替换原则要求我们维护继承体系,在拥有软件扩展性的同时兼顾架构的稳定性。迪米特原则要求我们减少对别的对象的依赖,提高类内部的聚合性。依赖倒置原则要求我们面向接口编程,提高软件的扩展性和稳定性。开闭原则是总纲,是其他几个原则要实现的终级目标。
0
0
分享到:
评论
1 楼 a123159521 2014-11-13  
很经典, 结合代码的艺术就更有说服力了。

相关推荐

    CS 反恐精英 射击游戏实例 C#源码 用到面向对象思路编程

    CS 反恐精英 射击游戏实例 C#源码 用到面向对象思路编程 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软

    浓缩精华:软件工程思想

    软件工程思想,软件工程这本书的浓缩精华 第一章“软件工程基本观念”;...第六章“C++ 面向对象程序设计”; 第七章“测试与改错”; 第八章“维护与再生工程”。 附录“大学十年”可以充当饭后的水果。

    在实战中成长Windows Forms开发之路.pdf

    第二部分以项目开发的流程为基础,循序渐进地通过迭代与增量开发RSS阅读器,逐步展示了C#中的委托、事件、控件、类库、I/O等技术,以及面向对象的设计思想;在第三部分C#高级编程中,介绍了多线程、数据库访问、用户...

    javaPDF精讲.pdf

    每一种语言的程序设计思想大同小异,只是一些由语言特性的而带来的细微差别,比如Java中的Interface,你几乎在以前的学习中没有碰到过。以下我仔细给你说几点:  1。我们必须明确一个大方向,也就是说现在面向对象...

    java并发编程实战 pdf

    每一种语言的程序设计思想大同小异,只是一些由语言特性的而带来的细微差别,比如Java中的Interface,你几乎在以前的学习中没有碰到过。以下我仔细给你说几点:  1。我们必须明确一个大方向,也就是说现在面向对象...

    UML和模式应用(原书第3版)

    全书叙述清晰、用词精炼、构思巧妙,将面向对象分析设计的概念、过程、方法、原则和个人的实践建议娓娓道来,以实例为证,将软件的分析和设计的过程叙述得如逻辑推理一般,于细节处见真知。 本书是一本经典的面向...

    UML和模式应用 英文版本

    为什么, 因为分配职责是必须要执行的一项活动(无论是画UML还是进行程序设计, 都要为软件对象分配职责), 并且它对软件构件的健壮性, 可维护性和可重用性具有重要影响. 当然, OOA/D中还有其他重要的技能, 但强调职责...

    asp.net知识库

    Asp.net 2.0功能体验,总体设计思想 Asp.net 2.0 WebPart使用经验点滴 革新:.NET 2.0的自定义配置文件体系初探 关于如何在ASP.NET 2.0中定制Expression Builders 怎么在ASP.NET 2.0中使用Membership asp.net 2.0-...

    学编程的步骤.txt

    一句话,到现在为止,你只要理解结构化程序设计的思想也就够了! 4:有了以上的基础,就要开始学汇编了。汇编开始的时候是很难,那些各种各样的寄存器,分段的内存地址,是很难理解,可是这些知识理解了以后,后面...

    java面试题以及技巧

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题目与技巧1

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题及技巧4

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题及技巧3

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题以及技巧6

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

Global site tag (gtag.js) - Google Analytics