魔术笔反选

设置者和获取者是邪恶的。 创建JavaBean定义时,这似乎是个好主意。 但是它们对Java社区造成了很大的伤害。 通常不如null指针那么多,但足够了。

首先,许多初级人员相信实现setter和getter(嘿,在Eclispe中只需单击几下)确实可以正确封装。 我应该详细说明为什么不这样做吗?

另一件事是使用setter和getter反对YAGNI。 YAGNI代表您不需要它 。 这意味着您不应该开发该项目现在不需要的代码。 要强调的是这个词 。 许多程序员倾向于开发扩展实际功能并执行比实际需要更通用的代码。 即使从原则上讲它可能是有价值的:在大多数实际情况下却没有。 代码变得更加复杂,另一方面,项目从未发展到需要程序员创建泛化的阶段。

Setter和getter是YAGNI的一个干净,简单且使用非常广泛的示例。 如果setter除了设置字段的值外什么也不做,而getter除了返回字段的值外什么都不做,那为什么我们根本不需要它们呢? 为什么不将字段的访问修饰符更改为setter和getter的值(可能是public )?

答案通常是,您可能需要在getter或setter中实现一些更复杂的功能,然后不必更改bean提供的“接口”。 “ 您可能需要实施 ”一词表明这是YAGNI。 而且,这很危险。 实施setter和getter隐式公开了类的实现。 塞特犬做什么? 设置字段的值。 例如, setBirthDate()通过定义来设置字段birthDate 。 这就是编写调用setter的代码的用户会考虑的方式。 您可以在JavaDoc中记录setBirthDate()实际上“指定”了出生日期,但为时已晚。 您将方法命名为设置方法,仅此而已。 没有人阅读JavaDoc。 API规则。

以后,当您更改代码时, setBirthDate()不仅设置生日,甚至不设置生日,也不会通知用户。 更改是无声的,您只是更改了隐式提供给用户的界面。 会有bug,调试会话,新版本,这很好,因为这会创建工作场所(请讽刺,请)。 如果为用户提供对字段的直接访问,则将字段从public移到private访问修饰符的后面将导致编译时错误。 也许这只是一种怪异的个人喜好,但我更喜欢编译时错误而不是错误。 它们更易于修复(阅读:更便宜)。

不用担心:您仍然可以修改您的API。 您仍然可以从方法集中删除setter和getter,并迫使其他程序员修复其代码,这些代码隐含地假定setter确实已设置并且getter得到。 拜托

我写这篇文章的真实故事是什么?

从前,有一个物体可以做某事。 要执行其任务,您可以设置字段aaa或字段bbb ,但不能两者都设置。 该应用程序是通过这种方式开发的,并且已经超过六年了。 有一天,一位年轻的程序员公主骑着白马,希望使世界变得更美好。 他想使前面提到的类更安全,并修改了setter setAaa()以使字段bbb nullsetAaa() 。 单元测试大放异彩。 覆盖率为100%。 (我应该学会不撒谎。)他提交了图书馆的新书,几周后他完成了实习,回到学校。 那时应用程序开始使用该库的新版本。 由于这一微小的更改,他们惨遭失败,并回滚到了旧版本。 我们所有人都辛苦了,总而言之,由于简单的更改,公司花了大约一年的时间来工作,更不用说程序员从头顶拔下来的头发了。

为什么程序失败了? 有一些代码以如下方式克隆了包含字段aaabbb的对象:

BadBean newBadBean = new BadBean();newBadBean.setAaa(oldBadBean.getAaa());newBadBean.setBbb(oldBadBean.getBbb());

你明白了。 在新bean中,字段aaa始终为null

现在您已经阅读了本文,您将永远不会尝试创建一个聪明的二传手。 我知道你不会! 您知道的一句话是: 始终编​​码,就像最终维护您的代码的人是知道您的住所的暴力精神病患者。 看哪!

翻译自: https://www.javacodegeeks.com/2015/03/the-magic-setter-antipattern.html

魔术笔反选

魔术笔反选_魔术二传手反图案相关推荐

  1. 双圆环环布带系法图解_魔术(连环扣)两个环之间是怎样穿过去的

    展开全部 1.有很小的空隙. 2.有机关可以打开. 环魔术是中国特有的魔术,其奥妙在于看似毫62616964757a686964616fe78988e69d8331333431353366无缝隙的两个 ...

  2. 对称、群论与魔术(十一)——魔术《百变箭头》等和系列总结

    早点关注我,精彩不错过! 在前面的文章中,我们已经引入了群的数学结构来完备地描述了以几何对称为代表的各种对称现象,并分享了很多利用这些操作的对称性来设计的魔术,相关内容请戳: 对称.群论与魔术(十)- ...

  3. 约瑟夫问题与魔术(七)——魔术《The Australian Deal》

    在本系列前面的文章中,我们讲清楚了约瑟夫问题的基本原理以及三个魔术的应用,相关文章请戳: 约瑟夫问题与魔术(六)--<自我匹配的奇迹>魔术赏析 约瑟夫问题与魔术(五)--魔术<自我匹 ...

  4. 对称、群论与魔术(九)——魔术《五边形的奇迹》

    早点关注我,精彩不错过! 在前面的两篇文章中,我们隆重介绍了利用对称的合理操作,进而通信后构造巧合的预言效果的第一个经典作品<tic tac toe>,相关内容请戳: 对称.群论与魔术(八 ...

  5. 约瑟夫问题与魔术(四)——魔术《10张牌的巧合》

    在前面的三篇文章中,我们完成了约瑟夫问题数学部分的解析,相信已经令数学爱好者们大呼过瘾,让魔术爱好者们一头雾水了,相关内容请戳: 约瑟夫问题与魔术(三)--终极数学推导 约瑟夫问题与魔术(二)--数学 ...

  6. 对称、群论与魔术(十)——魔术《吉普赛测试》等

    早点关注我,精彩不错过! 在前面的系列文章中,我们从最基本的几何对称的应用开始,讲到了用群描述的抽象的对称性,等价性原理以及用它来设计魔术的案例.之前的那两个作品<tic-tac-toe> ...

  7. 约瑟夫问题与魔术(五)——魔术《自我匹配的奇迹》中的数学原理

    特别通知:2020马丁加德纳聚会已于本周开始在线上举行,MatheMagician也将在10.18周日晚8点带来题为<数学魔术的魅力>讲座,详情请点击: 2020中国纪念马丁·加德纳聚会线 ...

  8. 给定下面的java代码_则运行_会产生类型的异常_JavaSE_笔试题_单选选择题

    JavaSE_笔试题_单选选择题1 1. 下面哪一种描述是正确的()? A:abstract修饰符可修饰字段.方法和类. B:抽象方法的body部分必须用一对大括号{}包住. C:声明抽象方法,大括号 ...

  9. php魔术方法例子,PHP魔术方法示例

    ① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php define('BASEDIR',__DIR__); //定义根目录常量 include BASE ...

最新文章

  1. 十分流行的自举法(Bootstrapping )为什么有效
  2. grunt入门讲解1:grunt的基本概念和使用
  3. Rational工具介绍『转』
  4. 《Create Your Successful Agile Project》书评与作者访谈
  5. php与mysql同步_MySQL 同步(一)
  6. linux源码阅读笔记 fork函数
  7. php篮球比赛,篮球数据API接口 - 【篮球比赛动画直播变化数据】API调用示例代码...
  8. Netty学习笔记(一)Netty客户端源码分析
  9. 查看nginx php mysql apache编译安装参数
  10. win7 下安装python用的dlib库
  11. oracle的监听服务详解
  12. 学业水平测试计算机知识点,2021高中学业水平考试信息技术知识点
  13. Discussion: 神经网络neural network与计量经济学模型econometric model比较
  14. KNN分类USPS, USI sonar及USI iris
  15. Windows命令之tracert命令
  16. opencv-python控制笔记本摄像头
  17. 安卓双摄像头录像_usb双摄像头app下载
  18. 移动通信网络规划:双工技术
  19. linux kali安装应用商店
  20. 剩余运算符和展开运算符

热门文章

  1. jzoj5363-[NOIP2017提高A组模拟9.14]生命之树【启发式合并,Trie】
  2. [2020.10.30NOIP模拟赛]字符串水题【SA,树状数组】
  3. 牛客练习赛50-记录
  4. jzoj4803-[NOIP2016提高A组模拟9.28]求导【模拟】
  5. 概率期望题(期望 DP)做题记录
  6. 数学基础知识(高精、快速幂、龟速乘……)
  7. 【DP】【高精】幸运票 (jzoj 2122)
  8. L3-002 堆栈 树状数组+二分答案
  9. SpringCloud Greenwich(二)注册中心之consul、Zuul和 gateway网关配置
  10. JavaFX官方教程(十二)之树动画示例