Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 获取者和设定者:代码气味、必要的邪恶或Can';我不能没有他们生活_Oop - Fatal编程技术网

Oop 获取者和设定者:代码气味、必要的邪恶或Can';我不能没有他们生活

Oop 获取者和设定者:代码气味、必要的邪恶或Can';我不能没有他们生活,oop,Oop,可能重复: 对于使用面向对象语言的getter和setter,有没有一个好的、不好的、非常好的理由来克服所有的麻烦?直接引用属性或方法有什么错?是否有一些“语义掩饰”是人们不想在礼貌的场合谈论的?当有人走出来说“你应该编写大量的代码来获取getter和setter”时,我是不是太累了,睡着了 一年后的后续行动: 这在Java中似乎很常见,而在Python中则不太常见。由于我没有用Java编程(目前是自愿的),所以我无法做出这样的评估 就我而言,目前(截至本文写作日期2010-03-22)的1

可能重复:

对于使用面向对象语言的getter和setter,有没有一个好的、不好的、非常好的理由来克服所有的麻烦?直接引用属性或方法有什么错?是否有一些“语义掩饰”是人们不想在礼貌的场合谈论的?当有人走出来说“你应该编写大量的代码来获取getter和setter”时,我是不是太累了,睡着了


一年后的后续行动:

这在Java中似乎很常见,而在Python中则不太常见。由于我没有用Java编程(目前是自愿的),所以我无法做出这样的评估

就我而言,目前(截至本文写作日期2010-03-22)的1个问题分数已经完成。有趣的是,有一些特定的问题被否决了,不是因为它们是“糟糕的问题”,而是因为它们触动了某人的神经

那么,让我们进入问题的核心。我再说一遍:

直接引用属性或方法有什么不对?

这是一个不成文的推论:


作为程序员,我们是不是太没有纪律,以至于我们不能把手从标有“禁止接触”的东西上移开?

保护。某些属性/方法不应该在没有类的情况下调用…永远。我相信你有权告诉任何人你的社会保险号码,对吗?他们一定要问你(盖特)?当然,您不会建议我们允许人们在自己的生活中直接访问私有数据/方法……为什么对待您的应用程序有任何不同?:)

我发现它很有用的一种方法是能够在集合上设置断点(比get更有效)。这可能意味着“我把它编错了”,但至少我能确切地知道它什么时候变了

这是艾伦·霍卢布(他很聪明)。他在书中对这个问题作了更详细的阐述。有些东西需要公共getter和setter,比如序列化和模式,比如。一般来说,我认为这是必要的,因为当您不使用它们时,应用程序会变得复杂。

getter和setter会向类的用户隐藏您的类数据细节

在许多情况下,它们没有得到充分利用,但使用它们总是一个好主意。直接访问对象数据可以减少封装


如果您不使用getter和setter,当您改变对数据成员的看法时,您会破坏类接口,并且必须更改代码库的其余部分以符合更改。在某些情况下,您的类表示公共API的一部分,这甚至是不可能的。如果将属性包装在getter和setter中,则可以进行这些更改,并通过修改getter和setter方法将它们隐藏起来,以免使用代码。

getter和setter是实现的一个方面。如果将所有功能封装在适当的属性后面,那么使用属性的代码就不会中断。它还使将来完全用其他对象替换该对象成为可能——特别是如果您对接口而不是类进行编码

它们是如此重要,以至于C#不辞辛劳地使基本的getter和setter易于编写


为了进一步理解为什么OOD的某些方面很重要,请阅读Scott Bain的书。

因此,如果我理解了这本书的要点……OO语言的getter和setter没有隐藏名称空间的方法?它们围绕类构建了一堵砖墙,其中包含对内部某些项的特定权限。有些类具有任何人都不应该处理的属性。这些将被定义为私有的或受保护的,因此任何人都不能从类之外操纵它们的值。只有通过提供getter,他们才能真正知道值是什么,只有通过提供setter,他们才能实际操作值。你是你的数据之王——人们唯一能进入内部的途径,就是你给予他们的访问权。有趣的是,这种解释的心理学比解释本身更有趣。我感觉到另一个问题即将出现……但从搜索重复问题功能的工作情况来看(刚刚在不到30分钟内关闭),我必须仔细措辞。无论如何,感谢您的澄清!祝你好运:)希望你能很快找到你想要的清晰:)我觉得这不是一个完全相同的副本。另一个问题是“你应该永远不要使用getter/setter吗?”而这个问题是“你应该使用getter/setter吗?”这里有一个完全不同的特征!D'oh,如果这是一个完全相同的副本,那么为什么我第一次发布它时,它没有出现在建议中?@Avery:这是一个公平的问题。我不确定当你问一个问题时所做的搜索和填充相关侧栏的搜索之间有什么区别,但我可以看出有区别。我通常在发布问题之前先从谷歌搜索,因为这样会得到更好的结果。啊。如果你不得不使用一些外部的东西,那么这表明搜索机制可能被破坏了。我稍后会尝试在uservoice上提交一些东西。@Avery:我知道这有点晚了,但根据您的标题在询问时显示的副本列表是。我会查看这本书。同时,如果我一目了然地理解了这一点,你是在暗示我真的,真的,不想对任何其他对象公开比必要的更多的内容…听起来几乎所有对象都应该被非常紧密地封装,所有的事物都进行处理,好像每个对象之间都有数百万个小API调用…呸,我累了,忘了那个评论吧。是的,你说得很对!封装和低耦合。每个对象都应该有自己的(单个)响应