UML之轻松入门(3)-SRP做好厨子,让别人编程去吧

一个厨子可以做出一手好菜,也许他是新东方毕业的或者是祖传秘方。你让他做上一桌佳肴那是简单、快乐而又高效的,然而让他编程就会成为一种苦恼并且让人想不通的一件事。也许这个比喻不是很恰当,但是对于每个类来说,他们就像一个一个的actor,也许是厨子也许是司机,他们应该关注于自己的领域,这样会更加高效而且简明。源于这一思想,我们发现了SRP这个原则,即:单一职责原则。

There should never be more than one reason for a class to change 

既然是UML入门,我们也不能跑偏了主题。在讨论SRP原则的同时,我们用实例并用UML类图来表示。

虽然话说的容易,但是实际项目中还是会出现很多问题,例如如何进行责任划分(本来就是一个无法量化的概念)。在探讨一个类是否满足SRP原则时,我们可以思考这个类是否只因一个原因而改变,即其它的原因不能导致该类的修改。在j2ee MVC(Model View Controller) 开发模式中我们知道,Model层只负责业务逻辑,View只负责页面的显示而Cotroller只负责数据的传递。除了页面的改变这一个原因以外,其它任何的变化都不会引起View层代码的改变,这就是SRP原则。在java的面向对象思想中我们也可以找到SRP原则的影子,例如面向对象的三大特性:继承、封装和多态。下面我们就以实例来讨论如何在代码层实现SRP原则。

  1.利用接口满足SRP原则

首先我们定义一个Person类,其实就是那个厨子。但是上司让他不仅要做饭还要编程,因此,这个类用UML表示为

当然现在看起来这个类并不是很复杂,因为它并没有太多方法,我们在这只是演示。首先这个类的定义存在缺陷:我们并不是很清晰的知道这个类的职能是什么,它失去了作为厨子的特性。那么,我们可以通过接口来实现

现在我们仔细分析Cooker和Coder这两个接口的作用。在Cooker这个接口类中,我们可以定义所有有关厨艺的方法,不管是鲁菜、川菜还是粤菜都在里面。如果这个厨子比较上进,学习了湘菜,我们也只需要在Cooker中添加相应的方法就OK了,而且不会引起Coder类的任何变化,体现了封装性。

不过这个例子也可以这么来表示:

在这个例子中貌似这两种做法都可行。我们可以这样思考一下:如果这个厨子是新东方毕业的,每个从新东方毕业的学习都是大同小异。这样,我们就可以定义一个Cooker接口,只要是实现这个接口的人,就可以看作是新东方毕业的,都会川菜。如果采用第二种方式的话,那就要定义N个类,然后每个类中都需要写一个川菜的方法,这样显得多余而且没有效率。而且,万一有一天其中的一个厨子学会了开车,我们只需要再实现Drive接口就OK了,其实这也是java中继承和接口的区别,1.我们通过接口实际上定义了一个模板,接口中的方法大多数情况下是已知的,因此可以利用反射的方式,动态的对方法进行修改。2.使用接口,我们可以更好的实现多态,可以把接口当作参数传递。3.我们可以实现一般继承不能实现的多继承。具体有关接口的好处,可以参照http://blog.csdn.net/rocketboy911/article/details/1633414中的实际案例。

2.使用继承来实现SRP原则

在上一部分,我们讨论了继承和接口的区别,在这一部分我们又要来探讨使用继承来实现SRP原则,博主这人还真逗,自相矛盾了。其实不然,这里的继承是指父子类的继承,而非方法的继承。我们来回顾一下刚才的知识,整理一下思路:从新东方毕业的学生都会川菜,那么我们说在这里使用接口而非继承。如果我们把厨子和程序员放在一起,那么他们都是Person,这里我们要用继承而非接口。

在这里我们先忘掉那个倒霉的厨子,我们先定义一个Student类,它拥有read(),dance(),sing()三个方法:

但我们发现,虽然每个同学都会读书,但是并不是每个同学都会跳舞,而且有些还是五音不全。那我们说,这个类还是有问题,我们利用继承对这个类进行修改:

这样我们可以清楚看来:噢!是Lee会唱歌,而David会跳舞,同时他们都继承了Student的read()方法,成为了一个多才多艺的学生。而且以后如果要改变sing()的代码的时候,我们没必要像以前一样,修改整个Student的代码,我们只需要修改Lee的一部分就OK了。

3.有关SRP持久化

这个例子来源于UML for java program这本书。并没有太多的理解,先放在这里。

(上图左边单词拼写错误,摘自书中)

左边说明了Employee和持久化的依存关系,Persistable的改变会或多或少的改变Employee,这是我们不允许的。但是持久化的需求是永远存在的,因此我们可以使用右边的结构,分离开Employee和Persistable的关系,实现SRP原则

时间: 2024-08-09 22:02:52

UML之轻松入门(3)-SRP做好厨子,让别人编程去吧的相关文章

UML之轻松入门(4)-OCP做一个上进的厨子

在上一章节,我们讨论了面向对象设计(OOD)5大特性之一的SRP原则.这一节,我们来看另一重要的原则:OCP原则(开放-闭合原则). Software entity should be open for extension, but closed for modification  上节回顾: 1.UML之轻松入门(1)-类图(附:java Comparable接口与Comparator接口用法) http://blog.csdn.net/woyunowuyuda/article/details

UML之轻松入门(2)-掌握Junit,让我们的开发更高效

使用UML不仅可以形象化的表达我们的程序思想,而且可以帮助我们提高程序的质量.一个杂乱无章的程序让维护者望而生畏,其成本也可想而知.在面向程序设计(OOD)中有5条原则是帮助我们设计一个高效.简洁的程序:1.单一职责原则(SRP) 2.开放-闭合原则(OCP) 3.Liskov替换原则(LSP) 4.依存关系倒置原则(DIP) 5.接口隔离原则(ISP).然而这5个原则不是本节讨论的重点,我们将从一个更简单基础的部分入手-JUnit. 想象一下如果程序中每增加一个功能或修改一些代码,都需要整个程

UML之轻松入门(1)-类图

曾经看到过一篇blog,上面探讨了学习UML和学习设计模式的区别,同时提出了学习UML还不如学习设计模式的观点.自我感受是,UML和设计模式在本质上属于完全不同的两个方向.设计模式是一种被反复使用.多数人知晓的.代码设计经验的总结.它可以更容易让人理解而且保证了代码的可靠性,而UML则是一种模型化和可视化的一种语言.可以这么说,设计模式是一种方法,它让我们的代码更有层次感 .而UML则是一种表达,它让我们的代码更加形象化.通过UML我们不必太过关注代码,不必担心客户是否了解相关的语言知识,整体的

Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina等网页的小demo,如果对swift的语法不感兴趣的同学可以直接跳到第二部分来感受下Swift的魅力-(本文的demo源码已上传至github:https://github.com/iOSGeek0829/XSurfing) 一.Swift常用语法 Swift是Apple去年推出的一门新的语言,基于C和Objective-C,而没有C的一些兼容约束,它采用了安全的编程模式和添加现代的功能

UML建模快速入门00 Outline

Preface UML建模,其重要性不言而喻,本人虽然大学期间就早已知其大名,无奈因各种因素总是拿起又放下,未能持续研究,几经断断续续,一直未持续深入读完一本书.最近越发觉得逆向工程(由代码生成UML)在日常整理中的重要性及方便性,便又捡起书本,觉得应该好好看看,边看边画,对很多概念又有了较深入的理解,对以前模糊的概念更加明晰些了.说实在的,这次拿起书本来看,主要有两个原因:一是觉得UML建模确实应该作为码工具备的一个技能,二是为了提升下逼格. 为了记录个人历经的路程,后续将推出系列快速入门读书

JavaScript面向对象轻松入门之封装(demo by ES5、ES6、TypeScript)

本章默认大家已经看过作者的前一篇文章 <JavaScript面向对象轻松入门之抽象> 为什么要封装? 封装(Encapsulation)就是把对象的内部属性和方法隐藏起来,外部代码访问该对象只能通过特定的接口访问,这也是面向接口编程思想的一部分. 封装是面向对象编程里非常重要的一部分,让我们来看看没有封装的代码是什么样的: 1 function Dog(){ 2 this.hairColor = '白色';//string 3 this.breed = '贵宾';//string 4 this

C++ STL编程轻松入门

 图1.STL和c++标准模板库 作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现.本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情. 1. "什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事.因此,如果你在看完本节之后还是觉得似懂非懂,

MongoDB游记之轻松入门到进阶》代码下载

<MongoDB游记之轻松入门到进阶>代码下载,看看有没有用 http://pan.baidu.com/s/1boKG28R https://item.jd.com/12236244.html MongoDB作为最受欢迎的文档存储类型的NoSQL数据库,越来越多的公司在使用它.本书以符合初学者的思维方式,系统全面.层层递进地介绍了MongoDB数据库,通过本书的学习,读者能够胜任实际工作环境中MongoDB的相关开发管理工作. 本书共分四个部分23章,第一部分讲解了MongoDB的相关概念和原

UML建模快速入门03 基本结构建模 CLASS

2015/03/25 - 07:19 [声明]欢迎转载,但请保留文章原始出处:http://blog.csdn.net/yelangjueqi/article/details/44733433 1,入门 类是任何面向对象系统中最重要的模块.类是对一组具有相同属性.操作.关系和语义的对象的描述.一个类可以实现一个或多个接口. 类可以用来捕获正在开发的系统中的词汇.这些类可以包括作为问题域一部分的抽象,也可以包括构成实现的那些类.可以用来描述软件事物和硬件事物,甚至可以描述纯粹概念性的事物. UML