`
kingcean
  • 浏览: 24152 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

(转帖)面向对象原则

阅读更多
1.       单一职责原则(SRP)

单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。也就是说,不要把变化原因各不相同的职责放在一起,因为不同的变化会影响到不相干的职责。再通俗一点地说就是,不该你管的事情你不要管,管好自己的事情就可以了,多管闲事害了自己也害了别人。

在软件设计中,如果一个类承担的职责过多,就等于吧这些职责耦合在一起,而一个职责的变化可能会削弱和抑制这个类完成其他职责的能力。这耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如果多于一个的动机去改变一个类,那么这个类就具有多余一个的职责,就应该要考虑类的职责分离。

2.       开放-封闭原则(The Open-Closed Principle 简称OCP)

开放-封闭原则,或叫开-闭原则,是说软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。不修改的意思就是是“你可以随便增加新的类,但是不要修改原来的类”。从这个角度去理解就好多了,其实这里还是一个隔离变化的问题。

这个原则的两个特征:一个是对于扩展是开放的;另一个是对于更改是封闭的。

我们在设计开发任何系统时,都不可能指望系统一开始就需求确定,就不再变化(要这样就太幸福了,哈哈),这是不现实的也是不科学的想法。既然需求是有一定变化的,那么如何在面对需求变化时,设计的程序可以相对容易的修改,不至于说,新需求一来,就要把整个程序推倒重来(这样会让程序员疯了不可,哈哈,你不想疯吧)。怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出的新版本呢?开放-封闭原则就是我们的答案。

在程序设计时,我们要时刻考虑尽量把类设计的足够好,写好了就不要去修改,如果有新的需求来了,我们增加一些类来完成新的需求,原来的代码能不动就不动。

绝对的对修改关闭是不可能的,无论模块是多么的封闭,都会存在一些无法对之封闭的变化,既然不能完全封闭,设计人员必须对他设计的模块应该对那种变化封闭做出抉择、他必须事先猜测出最有可能发生变化的变化种类,然后构建抽象来隔离那些变化。

开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所生成的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的部分都做出抽象,然后,对于应用程序中的每部分都刻意定进行抽象同样不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要。

3.       依赖倒转原则(DIP Dependency Inversion Principle)

依赖倒转原则:抽象不应该依赖于细节。细节应该依赖于抽象;高层不应该依赖于底层,两者都应该依赖于抽象。说白了就是要针对接口编程,不要针对实现编程。抽象的东西才是最稳定的,也就是说,我们依赖的是它的稳定。

依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写是考虑的都是如何针对抽象编程而不是针对细节编程,即程序中的所有的依赖关系都是终止与抽象类或者接口,那就是面向对象的设计,反之就是过程化设计了。

4.       里氏代换原则

里氏代换原则(LSP):子类型必须能够替换掉他的父类型。说白了就是一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而他察觉不出父类对象和子类对象的区别,也就是说,在软件里面,把父类都替换成他的子类,程序行为没有变化。

有了里氏替换原则,才是继承服用成为可能,只有当子类可以替换掉父类时,软件的功能不受到影响,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

有了里氏代换原则,才能使开放-封闭原则成为可能,正是由于子类型的可替换性才使得父类型的模块在无需修改的情况下扩展。

5.       接口隔离原则(ISP)

接口隔离原则(ISP):不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。

6.    迪米特法则(LoD)

迪米特法则(Law of Demeter或简写LoD)又叫最少知识原则(Least Knowledge Principle或简写为LKP):如果两个类不彼此之间直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。

         迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限。

         迪米特法则其根本思想强调的是类之间的松耦合。类之间的耦合越弱,越利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。

7.    合成/聚合复用原则(Composite/Aggregate Reuse Principle或CARP)

合成/聚合复用原则(Composite/Aggregate Reuse Principle或CARP):经常又叫做合成复用原则(Composite Reuse Principle或CRP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。我白了就是要尽量使用合成/聚合,尽量不要使用继承。

转自:http://blog.csdn.net/gtuu0123/article/details/4283921
分享到:
评论

相关推荐

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    贴吧转帖工具

    【贴吧转帖工具】是一种专为百度贴吧用户设计的便捷工具,主要用于提高用户在贴吧中的互动效率。通过这款工具,用户可以实现一键转帖和一键8经验签到的功能,极大地简化了传统操作流程,节省了用户的时间,提升了...

    编辑人员转帖去水印工具

    本篇文章将详细探讨“编辑人员转帖去水印工具”,并介绍如何使用名为Teorex Inpaint的1.0.0.2版本的软件来实现这一目标。 首先,我们要理解什么是水印。水印通常是指在图像或视频中添加的半透明标记,它可以是文字...

    转帖经典---JAVA设计模式

    这些模式为程序员提供了一种标准化的方式,以便在面向对象编程中有效地组织和构建代码,提高代码的可读性、可维护性和复用性。在Java中,设计模式分为三类:创建型模式、结构型模式和行为型模式。 创建型模式关注于...

    discuz X2转帖工具、采集工具

    X2转帖工具、采集工具”是针对这个平台设计的辅助软件,主要用于帮助论坛管理员或用户批量发布帖子和采集内容,提高论坛内容更新的效率。 一、批量发帖功能 1. 自动化发布:此工具可以自动化地创建和发布帖子,...

    [转帖]世界编程大赛第一名写的程序

    这样的程序不仅体现了编写者的创新思维和技术实力,也常常成为学习者研究和模仿的对象。 在IT行业,特别是软件开发和算法设计领域,掌握高级编程技能是至关重要的。编程大赛通常由诸如ACM(美国计算机协会)、...

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容可自定义,从而实现伪原创) 4.cookie记录替换和新增关键词(避免每次...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    "转帖工具插件 for PHPwind 7.5 正式版" 是专门为 PHPwind 7.5 版本设计的一个功能插件,旨在提供便捷的帖子转移功能,帮助管理员或者用户将内容从一个地方轻松移动到另一个地方,而无需直接编辑论坛的原始文件。...

    转帖图片提取工具 v1.0.zip

    转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    《一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0》 本文将深入探讨“一键转帖功能插件”在帝国CMS 6.0系统中的应用与实现,该插件适用于GBK及UTF-8编码环境,旨在提升网站内容的分享与传播效率。我们将从安装...

    Html2UBBMaxcj_Softii论坛专用转帖工具

    HTML2UBBMaxcj 是一款专为Softii论坛设计的转帖工具,它主要用于将HTML格式的帖子内容转换成UBB代码,以便在论坛中更好地显示和分享。UBB(Universal BBCode)是一种轻量级的标记语言,常用于网络论坛,与HTML类似,...

    一键转帖功能插件 for 帝国CMS v1.0.rar

    "一键转帖功能插件 for 帝国CMS v1.0.rar" 是一个专为帝国CMS设计的扩展工具,其主要目标是简化用户在网站上分享内容的过程,提高用户体验。这个插件允许用户轻松地将网站上的文章或信息复制并转发到其他平台,如...

    【转帖】Flex 开发入门

    ActionScript 支持面向对象编程,允许开发者创建复杂的逻辑和交互性。ActionScript 3.0是Flex中最常使用的版本,它具有性能优化和类库支持,使得开发更加高效。 2. **MXML**: MXML 是Flex中的标记语言,用于描述...

    超级无敌转帖手

    看到论坛里帖子由精美的图片想转过来,或者批量提取地址时很好用

    高三政治教学总结(转帖)教学工作总结.doc

    高三政治教学总结(转帖)教学工作总结.doc

    J2ME全方位开发讲解基础汇总[转帖]

    J2ME全方位开发讲解基础汇总[转帖] 一、J2ME中需要的Java基础知识 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成...

    轻松转帖之突破网页复制限制宣贯.pdf

    UBB转帖王是一种插件,它能够帮助用户快速去除复制下来的网页内容中的无用空格、文字干扰码、水印和空行等,优化复制内容,便于分享和阅读。 【其他浏览器解决方案】 除了火狐,其他浏览器如搜狗、遨游和世界之窗也...

    H42131-转帖《关于用净值计算法计算收益》.doc

    H42131-转帖《关于用净值计算法计算收益》.doc

Global site tag (gtag.js) - Google Analytics