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;机箱内置双容错电源及无源背板总线&#…

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

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

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

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

五金反引号

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

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

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

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

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

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

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

武警多业务光端机,五防光端机产品介绍

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

与kylin_什么是Kylin,Kylin的学习

概述Kylin定义Apache Kylin是一个开源的分布式分析引擎&#xff0c;提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据&#xff0c;最初由eBay开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。Kylin架构1)REST ServerREST Server是一套面向应用程…

工业轨式 1-16路 4-20MA 模拟量光端机产品介绍

产品描述 本系列设备采用大规模FPGA设计&#xff0c;采用独创技术&#xff0c;可同时支持 1~8 通道模拟量信号&#xff08;电流/电压&#xff09;到光纤中继&#xff0c;每组模拟量有24V供电输出VO脚&#xff0c;方便给传感器等设备供电。该设备采用双电源供电&#xff0c;高性…

采购光纤收发器时应该注意哪些事项?

目前市场上国外和国内生产光纤收发器的厂商很多&#xff0c;产品线也极为丰富&#xff0c;光纤收发器的种类也不一&#xff0c;主要分为机架式光收发器、台式光收发器和卡式光收发器。在实际的采购中&#xff0c;企业考虑的一个重要的因素是价格。当然&#xff0c;除价格外同时…

scala集合转java_Java,Scala,Guava和Trove集合-它们可以容纳多少数据?

scala集合转java关于我们的数据结构的一个有趣的事情是&#xff0c;即使我们非常熟悉它们&#xff0c;但对于我们来说&#xff0c;仍然很难说出像HashMap这样基本的东西在1GB的内存中可以容纳多少个项目。 我们可能会在学校&#xff0c;高级开发人员那里学到这一点&#xff0c;…

单模单纤的光纤收发器A、B端的位置可以互换吗?

单纤光纤收发器&#xff1a;接收发送的数据在一根光纤上传输顾名思义&#xff0c;单纤设备可以节省一半的光纤&#xff0c;即在一根光纤上实现数据的接收和发送&#xff0c;在光纤资源紧张的地方十分适用。那么&#xff0c;单模单纤的光纤收发器A、B端的位置可以互换吗&#xf…

最常见的SQL报错注入函数(floor、updatexml、extractvalue)及payload总结

SQL报错注入是一种常见的SQL注入攻击方式&#xff0c;攻击者通过注入恶意代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 下面介绍最常见的三个报错注入函数用法及payload总结&#xff1a; 1、floor() 使用floor报错注入&#xff0c;需要…

光电转换器与光纤收发器有哪些区别?

说到光电转换器&#xff0c;我们都知道光电转换器是一种类似于基带MODEM&#xff08;数字调制解调器&#xff09;的设备&#xff0c;和基带MODEM不同的是接入的是光纤专线&#xff0c;是光信号&#xff0c;分为全双工流控&#xff0c;半双工背压控制。那么&#xff0c;光电转换…

如何查看spark消耗的内存_Spark优化(三)----数据本地化及内存调优

1. 数据本地化的级别&#xff1a;1.PROCESS_LOCAL2.NODE_LOCAL3.NO_PREF4.RACK_LOCAL5.ANY1) PROCESS_LOCALtask要计算的数据在本进程&#xff08;Executor&#xff09;的内存中。2) NODE_LOCAL① task所计算的数据在本节点所在的磁盘上。② task所计算的数据在本节点其他Execu…

光收发器安装介绍,光纤收发器连接示意图解

对于光纤布线来讲光纤收发器都是非常熟悉的产品了&#xff0c;在光纤网络中&#xff0c;我们常常会使用到光纤收发器&#xff0c;那么&#xff0c;在网络布线过程中光纤收发器该怎么连接呢&#xff1f;接下来飞畅科技的小编就来为大家介绍下光纤收发器安装以及连接图解&#xf…

mysql 分库分表_大众点评订单系统分库分表实践

原大众点评的订单单表早就已经突破两百G&#xff0c;由于查询维度较多&#xff0c;即使加了两个从库&#xff0c;优化索引&#xff0c;仍然存在很多查询不理想的情况。去年大量抢购活动的开展&#xff0c;使数据库达到瓶颈&#xff0c;应用只能通过限速、异步队列等对其进行保护…

多模光纤收发器购买时需要注意什么问题?

光纤收发器是光通讯产品的一类&#xff0c;它一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中&#xff0c;同时在帮助把光纤最后一公里线路连接到城域网和更外层的网络上也发挥了巨大的作用。现如今&#xff0c;随着光通信产业的高速发展&#xff0…

cd mysql 权限不够_.bash_profile权限不够_cdmysql权限不够

mac环境下创建bash_profile文件并写入内容_IO690x477 - 118KB - JPEGmac下创建bash_profile的问题? - Mac - 知乎585x366 - 22KB - PNG如何设置bash profile格式599x366 - 38KB - JPEG如何设置bash profile格式599x366 - 38KB - JPEG.bash_profile .bashrc profile文件的作用的…