TellDontAsk的扩展

五年多来,Martin Fowler在他著名的TellDontAsk文章中指出了面向对象编程中的最大问题之一。 在他的著作中,他提醒程序员,他们应该信任自己的对象来为他们执行工作,而不是要求对象提供以后可以使用的数据。

我非常同意这一点,但是,当然,仅凭此原则并不能保证我们的代码是面向对象的。 我认为仅仅依靠一个对象来完成工作是不够的–需要做更多的设计工作,以确保该对象以后不会引起程序代码。

TellDont询问

汤姆和杰瑞–蓝猫布鲁斯,威廉·汉娜和约瑟夫·巴贝拉

让我们来看一个例子:

/*** All employees of a company.* You can hire more, fire some of them, give them a raise etc.\*/
public final class AllEmployees implements Employees {//constructor//other methods from Employees interface (hire, fire, raise etc)@Overridepublic List<Employee> filter(final Map<String, String> skills) {//return the List of those who have the specified skills.}}

上面的类将创建一个尊重福勒先生原则的适当对象:它将照顾员工,甚至会为我们筛选员工,而不会提出任何问题。 但是,这可能会导致周围的损坏,原因如下:执行过滤后,我们将剩下一个可以区分所有人的List

那些被筛选的员工永远都不会加薪吗? 他们将永远不会被解雇,还是我们永远不会雇用具有相同技能的人(相同的过滤器)? 当然,我们仍然会愿意加薪,解雇或雇用类似的人,但是我们现在已经不在上下文中了,我们手中只有一个愚蠢的List :为了使清单上的员工享有相同的权利,并且其余的义务一样,我们将需要编写过程代码(也许很多代码)。

我认为应该这样做:我们应该添加一个新的Employees实现,称为FilteredEmployees ,该实现会将Map放入其构造函数中,并确保它仅处理具有我们所要求技能的员工。 这样,他们仍然在同一家公司工作,除了现在我们更加了解他们,我们知道他们拥有一些别人没有的技能以外,没有任何改变。 我们不必编写代码来处理或转换 List ,我们仍将有一个Employees实例。 现在我们的班级看起来像这样:

/*** All employees of a company.* You can hire more, fire some of them, give them a raise etc.\*/
public final class AllEmployees implements Employees {//constructor//other methods from Employees interface (hire, fire, raise etc)@Overridepublic Employees filter(final Map<String, String> skills) {return new FilteredEmployees(..., skills);}}

我想说的是,这种想法本身就是试图实现这种情况,而不是告诉一个对象将您引向上述情况。 也就是说,我们实现了这些已过滤的员工,因为原始对象在维护上下文的同时无法为我们执行过滤。 简单地告诉目标对象去做就会使我们陷入相同的境地(与具有特定技能的人一起工作),但是这些人不再是雇员 ,而只是列表。

我将所有这些视为对TellDontAsk原理的扩展。 我不确定如何确保您朝正确的方向前进。 但是,我认为JDK(或您使用的任何开发套件)的使用是一个很好的指示: 在面向对象的代码库中,该套件应尽可能离散 。 使用开发套件的次数越多,您的代码实际面向对象的次数就越少,或者您的抽象并不是最好的。 另一方面,仅通过使用现有对象(或添加现有接口的新实现)就能添加/修改/删除功能越多,则应用程序的面向对象越多。

PS 这是同一想法的另一个示例。

翻译自: https://www.javacodegeeks.com/2018/11/extension-telldontask.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网管型光纤收发器产品功能特性详解

飞畅科技生产的网管型光纤收发器机架&#xff0c;吸收了国内外同类产品的优点&#xff0c;产品更具灵活性和实用性。网管光纤收发器采用结构灵活的机架模块化设计&#xff0c;十六槽2U机箱、电源模块及标准的热插拔模块组成&#xff0c;机箱内置双容错电源及无源背板总线&#…

[渝粤教育] 中国地质大学 大学英语(1) 复习题

《大学英语(1)》模拟题 一.单选题 — ______ is the man near the window? — Oh he is Tom. A. What B. Who C. How — I don’t get up late on Sundays.— _____ do I. A. Neither B. Either C. So — I have got a pain in my chest. — You _____ see the doctor. A. …

使用函数_使用TEXT函数生成中文大写金额

为满足《中华人民共和国票据法》中对中文大写金额的书写要求&#xff0c;可以使用TEXT函数将数字格式转换为中文大写金额。图中A列是小写的金额&#xff0c;需要在B列使用公式将其转换为中文大写金额。生成中文大写金额在B2单元格中输入以下公式&#xff0c;向下复制到B6单元格…

[渝粤教育] 中国地质大学 C语言程序设计(新) 复习题

《C语言程序设计》模拟题 一、单项选择题 1.下面程序运行的结果是 void ss(char *schar t) { while(*s) { if(*s t) *st-‘a’’A’; s; } } void main() { char str1[100]”abcddfefdbd”c’d’; ss(str1c); printf("%s\n"str1); } A.ABCDDFEFDBD B.abcDDfefDbD C.a…

简要分析电话光端机的常见问题

关于电话光端机&#xff0c;其实我们已经了解过许多&#xff0c;而许多朋友对光端机还是存有许多疑问。接下来飞畅科技的小编就来为大家详细介绍下电话光端机常见问题有哪些&#xff1f;感兴趣的朋友就赶紧跟着小编一起来看看吧&#xff01; 电话光端机常见问题有哪些&#xf…

[渝粤教育] 中国地质大学 Windows程序设计 复习题 (2)

《Windows程序设计》模拟题 一单选题 1.所有的Windows应用程序都是由()驱动的. A.事件 B.消息 C.命令 D.菜单 2.一般应用程序不会派生自己的()类. A.主框架 B.视图 C.菜单 D.文档 3.MessageBox不能完成()功能. A.接收用户输入 B.显示消息 C.改变对话框标题 D.显示问号图标 4…

java期末考试试卷及答案文库_JAVA期末考试试题及答案.docx

x[j1]){ wx[j]; x[j]x[j1]; x[j1]w; }/* if(i1||i2) ShowArray(x); if(i2) break; */}}public static void ShowArray(int b[]){for(int i0; iy; System.out.println("x>y"flag); flagz>w; System.out.println("z>w"flag);}}四、问答题&#xff1…

nashorn预编译_Java 8:在新的Nashorn JS引擎中编译Lambda表达式

nashorn预编译在最近的一篇文章中&#xff0c;我了解了Java 8和Scala如何实现Lambda表达式。 众所周知&#xff0c;Java 8不仅引入了对Javac编译器的改进&#xff0c;而且还引入了全新的解决方案-Nashorn。 这个新引擎旨在替代Java现有JavaScript解释器Rhino。 这为我们带来了…

光端机各种类型的接口介绍

光端机的接口类型还是比较多的&#xff0c;常见的物理接口类型有BNC接口、光纤接口、RJ-45接口、RS-232接口、RJ-11接口。那么&#xff0c;你对这五种典型的物理接口类型是否有所了解呢&#xff1f;接下来就由飞畅科技的小编一起来详细了解下吧&#xff01; 光端机的典型物理接…

[渝粤教育] 中国地质大学 事故应急救援 复习题

《事故应急救援》模拟题 一单选题 1.()是城市的整体预案从总体上阐述城市的应急方针政策应急组织机构及响应的职责应急行动的思路. A.综合预案 B.专项预案 C.总体预案 D.现场预案 2.()是在专项预案的基础上根据具体情况需要而编制的. A.综合预案 B.专项预案 C.现场预案 D.应急…

微服务升级优点_微服务–——定义, 原则 和 优点

微服务是业界最新的流行语&#xff0c;似乎每个人都在以这样或那样的方式谈论它。让我们理解一下什么是微服务&#xff1f;通过这篇教程我们将理解微服务的定义&#xff0c;概念以及微服务的原理。微服务的定义如今&#xff0c;微服务是SOA(面向服务的架构)之后越来越流行的架构…

[渝粤教育] 中国地质大学 企业文化建设与管理 复习题

《企业文化建设与管理》模拟题 一单选题 1.组织文化包括 A.物质文化&#xff0c;社会文化&#xff0c;精神文化 B.物质文化&#xff0c;精神文化&#xff0c;政治文化 C.物质文化&#xff0c;行为文化&#xff0c;制度文化 D.物质文化&#xff0c;社会文化&#xff0c;政治文化…

五金反引号

五种琴弦 从Java 1.0开始&#xff0c;我们就有了字符串文字"like this" 。 我们还想要其他什么字符串&#xff1f; 其他编程语言为我们提供&#xff1a; 表达式插值&#xff1a; s"I am ${age - 10} years old." 插值格式&#xff1a; f"Price: $pr…

多功能视频光端机_多业务光端机的功能特性

视频光端机&#xff0c;就是把1到多路的模拟视频信号通过各种编码转换成光信号通过光纤介质来传输的设备&#xff0c;由于视频信号转换成光信号的过程中会通过模拟转换和数字转换两种技术&#xff0c;所以视频光端机又分为模拟光端机和数字光端机。光端机原理就是把信号调制到光…

[渝粤教育] 中国地质大学 信息资源管理 复习题 (2)

《信息资源管理》模拟题 一.单选题 1.目前在我国各级政府部门在信息资源管理过程中的主要职责是(). A.向社会提供信息服务 B从政策上指导信息资源的开发和利用 C.直接从事信息资源的开发和管理 D.研究制定信息资源开发的标准和规范 2.研究与制定信息资源开发的标准与规范的责…

curl_exec() 执行的时候发送不出去_为什么端口明明开着,nmap却扫描不出来,看老司机怎么指点迷津...

大家应该都知道&#xff0c;nmap是用来扫描端口的标杆级神器&#xff0c;我们经常在运维工作或安全评估中使用到它。在使用的时候&#xff0c;我们可能会碰到明明目标IP端口有开着&#xff0c;但是nmap却死活扫描不出来&#xff0c;等了大半天却得到一些不可靠的结果。那到底是…

[渝粤教育] 中国地质大学 地球科学概论 复习题 (2)

《地球科学概论》模拟题 一.单选题 1.有一种岩石其SiO2含量为69%中粗粒粒状结晶结构片麻状构造主要由长石石英和角闪石等矿物组成这种岩石应该是() A.花岗岩; B.流纹岩; C.片麻岩; D.闪长岩 2.安山岩的化学成分相似于() A.橄榄岩 B.闪长岩 C.花岗岩 D.辉长岩 3.下列描述正确的…

4路视频+4路百电(物理隔离)+8路电话+开关量+串口+电话光端机 武警光端机

产品描述 本系列产品&#xff0c;是在该公司研制的专用超大规模集成电路的基础上&#xff0c;研发的点对点多业务光传输设备。此款产品提供4路视频&#xff0c;1-8路电话接口&#xff1b;1-16路开关量接口/1-8路RS232-422-485接口&#xff1b;4路百兆以太网接口&#xff0c;4路…

[渝粤教育] 中国地质大学 大学英语(6) 复习题

《大学英语(3)》模拟题 一.单选题 1.Are you sure about that?(). A.You needn’t worry about that. B.I like the idea. C.Ohno.I’m afraid of that. D.Ohyes.I’m absolutely positive. 2.Before I got to the cinemathe film(). A.had begun B.has begun C.is begun D.w…

yuki翻译器钩子_git hooks钩子

GIT HOOKS钩子(hooks)是一些在"$GIT-DIR/hooks"目录的脚本,在被特定的事件(certain points)触发后被调用。当"git init"命令被调用后,一些非常有用的示例钩子文件(hooks)被拷到新仓库的hooks目录中;但是在默认情况下这些钩子(hooks)是不生效的。 把这些钩子…