getter/setter_Getters / Setters。 邪恶。 期。

getter/setter

从2003年开始,艾伦·霍鲁布(Allen Holub)讨论了为什么吸气和塞特方法是邪恶的著名文章,关于吸气/塞特方法是否是反模式,应该避免使用,还是我们在面向对象中不可避免地需要它,这是一个古老的争论。编程。 我将在讨论中加我的两分钱。

以下是本文的要旨:吸气剂和吸气剂是一种糟糕的做法,使用它的人不能被原谅。 同样,为了避免任何误解,我并不是说应尽可能避免进行get / set操作。 不,我是说您永远不要让它们靠近您的代码。

大卫·韦斯特的物体思考 傲慢到足以引起您的注意? 您使用该获取/设置模式已有15年了,您是一位受人尊敬的Java架构师吗? 而且您不想听到陌生人的胡话吗? 好吧,我了解您的感受。 当我偶然发现David West的《 对象思维》时,我的感觉几乎是一样的,这是我迄今为止已读过的有关面向对象编程的最佳书籍。 所以,请。 冷静下来,尝试理解,而我尝试解释。

现有参数

在面向对象的世界中,有一些反对“访问者”(getter和setter的别称)的争论。 我认为所有这些都不够强大。 让我们简要地介绍一下它们。

询问,不要告诉:艾伦·霍尔布(Allen Holub)说:“不要询问您需要做的工作; 询问具有信息的对象为您完成工作”。

违规封装原理:一个对象可以被其他对象撕裂 ,因为它们能够通过设置器将任何新数据注入该对象。 该对象根本无法足够安全地封装其自身的状态,因为任何人都可以更改它。

公开的实现细节:如果我们可以从另一个对象中获得一个对象,则我们过于依赖第一个对象的实现细节。 如果明天它会改变,例如,结果的类型,我们也必须改变代码。

所有这些理由都​​是合理的,但它们没有要点。

基本误解

大多数程序员认为对象是带有方法的数据结构。 我引用的是Bozhidar Bozhanov的文章Getters and Setters Not Evil 。

但是,人们为其生成getter和setter的大多数对象都是简单的数据持有者。

这种误解是巨大误会的结果! 对象不是“简单的数据持有人”。 对象不是具有附加方法的数据结构。 这种“数据持有者”的概念来自过程语言(尤其是C和COBOL)的面向对象编程。 我再说一遍:一个对象不是一组数据元素和操作它们的函数。 对象不是数据实体。

之后怎么样了?

球和狗

在真正的面向对象编程中,对象就是像您和我一样的生物。 它们是活着的生物,具有自己的行为,特性和生命周期。

生命有机体可以有二传手吗? 你能“把”球放到狗身上吗? 并不是的。 但这正是以下软件正在执行的操作:

Dog dog = new Dog();
dog.setBall(new Ball());

听起来怎么样?

你能从狗身上拿球吗? 好吧,如果她吃了并且正在做手术,您可能可以。 在那种情况下,是的,我们可以从狗那里“拿走”一个球。 这就是我在说的:

Dog dog = new Dog();
Ball ball = dog.getBall();

或更荒唐的例子:

Dog dog = new Dog();
dog.setWeight("23kg");

您能想象现实中的交易吗?

它看起来与您每天写的内容相似吗? 如果是,那么您就是程序程序员。 承认吧 这就是大卫·韦斯特(David West)在他的书的第30页上说的:

将成功的程序开发人员转换为成功的对象开发人员的第一步是放样。

您需要放血吗? 好吧,在阅读West的Object Thinking的同时,我肯定需要一个并收到了它。

对象思维

开始像一个对象一样思考,您将立即重命名那些方法。 这是您可能会得到的:

Dog dog = new Dog();
dog.take(new Ball());
Ball ball = dog.give();

现在,我们将狗当做一种真正的动物,当我们提出要求时,他可以从我们这里拿走球并将其还给他。 值得一提的是,狗不能给NULL 。 狗根本不知道NULL是什么! 对象思维立即消除了代码中的NULL引用 。

查尔斯·克里顿(1988)

查尔斯·克里顿(1988)

除此之外,对象思维将导致对象不变,就像“狗的重量”示例一样。 您可以这样改写:

Dog dog = new Dog("23kg");
int weight = dog.weight();

狗是一成不变的生物,不允许外界任何人改变自己的体重,大小或名称等。她可以根据要求告知自己的体重或名称。 公开方法对对象的某些“内部”的请求没有问题。 但是这些方法不是“获取器”,它们永远不应带有“获取”前缀。 我们没有从狗身上“得到”任何东西。 我们没有得到她的名字。 我们要她告诉我们她的名字。 看到不同?

我们也不在这里谈论语义。 我们正在将过程编程的思维方式与面向对象的思维方式区分开。 在过程编程中,我们正在处理数据,在需要时对其进行处理,获取,设置和删除。 我们负责,数据只是一个被动组件。 狗对我们来说什么都不是-它只是一个“数据持有者”。 它没有自己的生活。 我们可以自由地从中获取任何必需的东西,并将任何数据放入其中。 这就是C,COBOL,Pascal和许多其他过程语言的工作方式。

相反,在一个真正的面向对象的世界中,如果您愿意,我们将具有生命日期和死亡时刻的生物视为物体,包括它们自己的出生日期和死亡时刻。 我们可以请狗给我们一些数据(例如,她的体重),然后她可能会向我们返回该信息。 但我们始终记得,狗是一种活跃的成分。 她决定在我们要求之后会发生什么。

这就是为什么在概念上让任何方法都以setget in object开头是不正确的 。 但这并不像许多人认为的那样破坏封装。 无论您是想像一个对象还是仍在用Java语法编写COBOL。

PS。 是的,您可能会问-JavaBeans,JPA,JAXB和许多其他依赖于get / set表示法的Java API呢? Ruby的简化了访问器创建的内置功能呢? 好吧,所有这些都是我们的不幸。 留在过程式COBOL的原始世界中,要比真正理解和欣赏真实对象的美丽世界要容易得多。

PPS。 忘了说,是的,通过setter进行依赖注入也是一种可怕的反模式。 关于它,在下一篇文章中!

相关文章

您可能还会发现以下有趣的帖子:

  • OOP中的反模式
  • 避免字符串串联
  • 对象应该是不可变的
  • 为什么NULL是错误的?
  • 实用程序类的OOP替代

翻译自: https://www.javacodegeeks.com/2014/09/getterssetters-evil-period.html

getter/setter

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

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

相关文章

Java / Spring:如何快速生成整个Swagger记录的CRUD REST API

作为开发人员,我们在日常生活中经常面临的最繁琐的任务之一就是编写良好且易于理解的文档。 无论我们的文档只有几行来解释功能的核心功能,还是表明系统的来龙去脉的成熟文章都没关系。 重要的是,我们试图通过文档传达的信息是准确且可理解的…

中的实践 中兴_中兴通讯5G智慧治水业务在千岛湖畔下姜村成功实践

近日,中兴通讯智慧治水业务在千岛湖畔下姜村成功实践。这一业务为实现千岛湖下姜村水域的智能化管理、立体化监控提供了可靠保障,也将浙江电信5G网络、中兴通讯5G端到端解决方案在试商用实践中再推进一步。下姜村曾先后获得“全国创先争优先进基层党组织…

一加7充电_一加真无线耳机曝光,65W快速充电器获认证

一加8系列发布后,曾有消息显示,一加旗下还有一款被称为一加Z的手机将于今年7月登陆市场。现在,距离传言中提到的发布时间越来越近,也再次有消息提到了这一时间点。不过,这次爆料中的新品并不是手机产品。来自爆料人士 …

从工作中清除代码–使用JUnit 5,Mockito和AssertJ编写可执行规范

可执行规范是可以用作设计规范的测试。 通过启用公共语言(在DDD世界中,这也称为无处不在的语言 ),它们使技术和业务团队能够进入同一页面。 它们充当代码的未来维护者的文档。 在本文中,我们将看到一种编写自动测试的…

家用计算机注意哪些参数,电脑小白买内存条要注意哪些?主要看哪些参数?这些知识要掌握...

内存条是电脑的核心硬件之一,它的作用主要是为CPU服务的,电脑运行的时候,CPU从硬盘里调用数据通过总线寻址放在内存里,内存相当于缓冲处理区,处理好信息后再回馈给CPU,然后电脑再根据指令运行。内存没有记忆…

日照职业技术学院计算机怎么样,日照职业技术学院宿舍条件怎么样 住宿环境好不好...

又到了一年一度的新生入学季,今年考上日照职业技术学院的学子们对你们的新学校有没有期待?下文中有途网小编给大家整理了日照职业技术学院的宿舍环境,供参考!日照职业技术学院宿舍环境如何大学宿舍是各位同学们在大学期间会陪伴我…

cam350怎么看顶层_蛋糕胚速学教程大全,适合初学者看哦!

蛋糕胚速学教程大全,适合初学者看哦!烘焙蛋糕最难的还是装饰,对手残星人来说,好不容易切好了蛋糕胚,抹面费了老大劲还是凹凸不平,做出来像狗狗啃过似的~快来看这份蛋糕抹面技巧,教你…

计算机一级上机考试试题题库,2016年计算机一级上机考试题库

2016年计算机一级上机考试题库第1题、 ****** 本套题共有5小题 ******(1)新建文档WDA01.DOC,插入文档WTA01.DOC的内容,将文中所有“星星”替换为“行星”,存储为文档WDA01.DOC。(2)新建文档WDA02.DOC,插入文档WDA01.DOC的内容&…

stc单片机485发送多出一字节_单片机干货!STC8H案例制作分享(内含高清实物动图)...

本期,Lucy制作了九个案例分享给大家,分别为:流水灯、按键LED、数码管、点阵、定时蜂鸣器、NTC温度计、超声波测距仪、光敏RGB灯、氛围灯(红外)Lucy无偿提供全部案例的原理图和部分案例的代码。有需要的朋友先关注并私信我。需要源码私信我&am…

怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...

0、GET/POST 请求数据在 PHP 中,可以直接通过全局变量 $_GET 和 $_POST 快速获取 GET/POST 请求数据,GET 请求数据主要是 URL 查询字符串中包含的参数,以前面在线论坛项目的群组详情页为例:http://localhost:8080/thread/read?id…

删除表报正在使用_U盘拔出要不要点quot;安全删除USB硬件quot;退出?

小U盘,大用处。U盘不仅可以用来存储各种各样的文件,甚至还可以用来制作电脑启动盘、Win to Go系统盘等。直接拔还是点“安全删除”后再拔U盘呢?在用完U盘后,有的会点击电脑右下角“安全删除”才拔,有的则会不管那么多直…

职业规划测试软件,生涯规划常用测试工具

原标题:生涯规划常用测试工具认识自己测试生涯规划关于生涯规划的几个测试上周我们说到中学生很有必要进行生涯规划,在进行生涯规划前,我们需要对自己有一个更清晰、更全面的认识,随着心理学的发展,很多认识自我的测试…

使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第一部分

在这个分为三部分的系列中,我将演示如何使用SoapUI API工具来调用安全的WCF SOAP服务。 第一篇文章将着重于创建将要测试的系统的服务。 第二篇文章将介绍在基本身份验证机制保护的情况下调用它所需的步骤。 在最后一部分中,我将对初始服务稍作更改&…

配置中文_星球大战:战机中队配置需求公布 支持中文

近日《星球大战》系列新作《星球大战:战机中队》公布,该作采用寒霜引擎打造,支持中文。游戏将于2020年10月3日发售,预购价格为238元,登陆Xbox One/PS4/PC(Steam/Origin/Epic)平台,有单人和多人模式&#xf…

为什么在生产中进行硒自动化测试对于您的下一个版本至关重要?

您是否认为仅仅是因为您的Web应用程序在过渡环境中以鲜艳的色彩通过了,您的生产环境也将是相同的吗? 您可能需要重新考虑! 特别是,如果我们指的是跨浏览器测试 ,则需要确保跨各种操作系统,运行在不同操作系…

手机usb共享计算机网络连接,如何将手机wifi网络通过USB共享给电脑?小编教你共享方法...

曾经就有过这样的情况,家里突然断网了,这时又需要打开电脑接收文件,或是需要在线编辑公众号的文章,着急得很,这时电脑没有网络怎么办呢?能不能使用手机的流量,来让电脑连网呢?有时候…

为全局变量赋值_实例分析如何远离漫天飞舞的全局变量

前篇《由static来谈谈模块封装》基本实现了对外隐藏属性,隐藏局部模块函数,开放接口的功能。对于这个话题还有些点没有深入探讨:为什么要这样做?以及这样做的好处。或许很多刚刚开始用C或者其他面向对象编程语言(比如C)的小伙伴们…

计算机指令取决,不同的计算机,其指令不同,这主要取决于什么?

不同的计算机,其指令系统也不同,这主要取决于所用的CPU。1、CPU指中央处理器,是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。2、程…

栈空间_Linux中的进程栈和线程栈

1. 进程栈进程栈是属于用户态栈,和进程虚拟地址空间 (Virtual Address Space) 密切相关。那我们先了解下什么是虚拟地址空间:在 32 位机器下,虚拟地址空间大小为 4G。这些虚拟地址通过页表 (Page Table) 映射到物理内存,页表由操作…

csgo显示服务器失败,csgo服务器失败

csgo服务器失败 内容精选换一换您可以通过“应用管理”页面的应用列表,快速查看应用状态,及相关异常信息,如图1所示。包括:应用状态:即图1中的①应用异常信息:即图1中的②云服务器异常信息:即图…