网页翻译器,搜索引擎优化的简称是,wordpress的收费,网站空间内存getter/setter从2003年开始#xff0c;艾伦霍鲁布#xff08;Allen Holub#xff09;讨论了为什么吸气和塞特方法是邪恶的著名文章#xff0c;关于吸气/塞特方法是否是反模式#xff0c;应该避免使用#xff0c;还是我们在面向对象中不可避免地需要它#xff0c;这是一个… 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 除此之外对象思维将导致对象不变就像“狗的重量”示例一样。 您可以这样改写 Dog dog new Dog(23kg);
int weight dog.weight(); 狗是一成不变的生物不允许外界任何人改变自己的体重大小或名称等。她可以根据要求告知自己的体重或名称。 公开方法对对象的某些“内部”的请求没有问题。 但是这些方法不是“获取器”它们永远不应带有“获取”前缀。 我们没有从狗身上“得到”任何东西。 我们没有得到她的名字。 我们要她告诉我们她的名字。 看到不同 我们也不在这里谈论语义。 我们正在将过程编程的思维方式与面向对象的思维方式区分开。 在过程编程中我们正在处理数据在需要时对其进行处理获取设置和删除。 我们负责数据只是一个被动组件。 狗对我们来说什么都不是-它只是一个“数据持有者”。 它没有自己的生活。 我们可以自由地从中获取任何必需的东西并将任何数据放入其中。 这就是CCOBOLPascal和许多其他过程语言的工作方式。 相反在一个真正的面向对象的世界中如果您愿意我们将具有生命日期和死亡时刻的生物视为物体包括它们自己的出生日期和死亡时刻。 我们可以请狗给我们一些数据例如她的体重然后她可能会向我们返回该信息。 但我们始终记得狗是一种活跃的成分。 她决定在我们要求之后会发生什么。 这就是为什么在概念上让任何方法都以set或get in object开头是不正确的 。 但这并不像许多人认为的那样破坏封装。 无论您是想像一个对象还是仍在用Java语法编写COBOL。 PS。 是的您可能会问-JavaBeansJPAJAXB和许多其他依赖于get / set表示法的Java API呢 Ruby的简化了访问器创建的内置功能呢 好吧所有这些都是我们的不幸。 留在过程式COBOL的原始世界中要比真正理解和欣赏真实对象的美丽世界要容易得多。 PPS。 忘了说是的通过setter进行依赖注入也是一种可怕的反模式。 关于它在下一篇文章中 相关文章 您可能还会发现以下有趣的帖子 OOP中的反模式 避免字符串串联 对象应该是不可变的 为什么NULL是错误的 实用程序类的OOP替代 翻译自: https://www.javacodegeeks.com/2014/09/getterssetters-evil-period.htmlgetter/setter