可能重复:
Allen Holub wrote “You should never use get/set functions”, is he correct?
是否有一个很好的,没有,非常的理由,要解决使用getter和setter来面向对象语言的所有麻烦?使用对属性或方法的直接引用有什么问题?人们不想在礼貌的公司谈论某种“语义掩盖”吗?当有人走出去说“你应该写大量的代码来获取吸气剂和制定者”时,我是否太累了并且睡着了?
一年后的跟进:
这似乎是Java的常见现象,而Python则不那么常见。 I'm beginning to wonder if this is more of a cultural phenomena (related to the limitations of the language) rather than "sage advice".由于我没有用Java编程(目前可供选择),我无法进行评估。
就我所关注的而言,当前(截至本文写作2010-03-22)-1问题得分已完成。有趣的是,有一些特定的问题被低估了,不是因为它们是“坏问题”,而是因为它们击中了某人的原始神经。
让我们来解决问题。我重复一遍:
What's wrong with just using a direct reference to a property or method?
这是不成文的必然结果:
Are we so undisciplined as programmers that we can't keep our hands off of things that are clearly marked "no touchy"?
答案 0 :(得分:3)
这是Allen Holub(很聪明)on the matter。他在Holub on Patterns中详细介绍了这个主题。有些事情需要公共getter和setter,如序列化和模式,如Data Transfer Object pattern。一般来说,我认为必要的恶,因为当你不使用它们时你的应用程序会变得错综复杂。
答案 1 :(得分:3)
Getters and Setters会隐藏您班级用户的班级数据。
在许多情况下,它们没有得到充分利用,但使用它们总是一个好主意。直接访问对象数据可减少封装。
如果您不使用getter和setter,当您改变对数据成员的想法时,就会破坏类接口,并且必须更改代码库的其余部分以符合更改。在某些情况下,您的类代表公共API的一部分,这甚至是不可能的。如果将属性包装在getter和setter中,则可以进行这些更改,并通过修改getter和setter方法来隐藏它们以避免使用代码。
答案 2 :(得分:2)
保护。一些属性/方法不应该在没有类的情况下调用...永远。我相信你保持唯一的权力告诉任何人你的社会安全号码,对吗?他们不得不问你(吸气)?当然,你不建议我们允许人们在我们自己的生活中直接访问私人数据/方法......为什么要对你的应用程序进行任何不同的处理? :)
答案 3 :(得分:1)
我发现它有用的一种方法是能够在集合上设置断点(比get更多)。这可能意味着“我编码错了”,但至少我可以确切地知道它何时发生变化。
答案 4 :(得分:1)
Getters和Setter是实施Open/Close principle的一个方面。如果将所有功能封装在适当的属性后面,则使用属性的代码不会中断。它还可以在将来用其他东西完全替换该对象 - 特别是如果您编写接口而不是类。
它们非常重要,以至于C#经历了让基本的getter和setter易于编写的麻烦。
为了进一步理解为什么OOD的某些方面很重要,请阅读Scott Bain的书Emergent Design。