热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习面向对象的设计原则

现在是OO语言流行的时代,但是我们真的能深入运用OO的特性来进行软件开发,或是在开发一套纯的软件系统吗?我想绝大部分人不敢站出来肯定自己所参与开发的是一套纯正的具有OO血统的系统!

现在是OO语言流行的时代,但是我们真的能深入运用OO的特性来进行软件开发,或是在开发一套纯的软件系统吗?我想绝大部分人不敢站出来肯定自己所参与开发的是一套纯正的具有OO血统的系统!(不过,技术是为需求而用,有些地方可能确实一时之间难以利用OO思维去思考)。

但无论如何,我们如今的软件开发都强调OO,那么,作为OO基础的知识,我们真的能掌握了吗?其实掌握了的人,在现实的软件开发中,还是不能第一时间用OO考虑如何解决问题?可能都是我们作为程序员的思维一定局限吧,既是用一般的面向过程去考虑如何解决一个问题(或需求)。还记得从《设计模式解析》这本书上,作者提到,我们应该学会用模式去思考!这个不得不引起我们的沉思!我想我们作为一名程序员,不能过于浮躁,但现今的社会又有哪个能做到呢?算了吧,还是看看我们OOD中的最基本的原则吧!好好学习一番,算是给自己复习,净化自己的浮躁的心!

【引】在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。当然,在此,我们更不可忘掉OO中的三大特性吧,抽象、封装、多态。《Leaning Design Patterns by Looking at code》的作者就说过,85%的软件开发都是面向接口(即面向抽象)、多态编程!

  1. 我们先来看看在面向对象中有哪些设计原则,follow:

    关于类设计的


    • OCP开放封闭原则 (Open Close Principle),软件实体(类、模块、函数)在扩展性方面应该是开放的而在更改性方面应该是封闭的。在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程 设计方法的重要原则之一。
    • 通过一些例子来描述吧
    • 这是一个违背了OCP原则的例子,每当我们要添加一个图形的时候,都要修改代码,影响到已存在的功能。
      《学习面向对象的设计原则》
  • // Open-Close Principle – Bad example
  • class GraphicEditor {
    •     public void drawShape(Shape s) {
  •          if (s.m_type==1)
  •              drawRectangle(s);
  •         else if (s.m_type==2)
  •             drawCircle(s);
  •       }
  •       public void drawCircle(Circle r) {….}
  •       public void drawRectangle(Rectangle r) {….}
  • }
  • class Shape {
  •      int m_type;
  • }
  • class Rectangle extends Shape {
  •          Rectangle() {
  •                  super.m_type=1;
  •          }
  • }
  • class Circle extends Shape {
  •          Circle() {
  •          super.m_type=2;
  •           }
  • }

上面的几个缺点:
每增加一个图形,对于GraphicEditor都要重做一次单元测试
当一个新图形被添加时,都要求开发人员理解GraphicEditor里面的程序逻辑
添加一个新图形在我们不期望的方式来影响程序现有的缺点,即使新添的图形能运行良好。

看用OCP原则来重新设计上面的例子

《学习面向对象的设计原则》

// Open-Close Principle – Good example
class GraphicEditor {
public void drawShape(Shape s) {
s.draw();
}
}

class Shape {
abstract void draw();
}

class Rectangle extends Shape {
public void draw() {
// draw the rectangle
}
}

  1. SRP单一职责原则 (Single Responsiblity Principle),就一个类而言,应该仅有一个引起它变化的理由。
  2. LSPLiskov替换原则 ,子类应当可以替换父类并出现在父类能够出现的任何地方。
  3. DIP依赖倒置原则 (Dependency Inversion Principle),依赖关系应该尽量依赖接口与抽象类(即是依赖抽象),而不是依赖于具体类。
  4. ISP接口隔离原则 (Interface Segregation Principle),采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。

    对于另外六项原则,则都是关于包的设计原则。在这里,包是指一个二进制的可发布文件,如Jar文件、DLL文件等。不等同于Java语言中的package或C++的命名空间之类

关于包内聚性的:

  • REP,重用发布等价原则 ,重用的粒度就是发布的粒度。
  • CPP,共同封闭原则 ,包中的所有类对于同一类性质的变化应该是共同封闭的。
  • CRP,共同重用原则 ,一个包中的所有类应该是共同重用的。

关于包之间的耦合性原则的:

  • ADP,无环依赖原则,在包的依赖关系图中不允许存在环。
  • SDP,稳定依赖原则,朝着稳定的方向进行依赖。
  • SAP,稳定抽象原则,包的抽象程度应该和其稳定程度一致。

在以上的OOD原则中,开发中常见的应该是前面介绍到关于类设计的几个原则。在进行面向对象的软件开发过程中,当然,我们不可能时刻把这些原则挂在嘴边,重要的是时刻惦记着尽可能使用在开发过程中。但是,我们应该要时刻审视我们自己的代码是否符合基本的原则,在软件开发中,最重要的还是如何去建立“松耦合”。

代码和图片来源自【http://www.oodesign.com/ 】,还有其他的内容来自互联网,总之,感谢分享知识的人们!


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
到底是谁额额额
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有