属性/字段是否应始终具有setter和getter方法,还是可以将它们组合在一起?

时间:2012-06-05 14:52:40

标签: function object architecture methods

如果我有一个User对象,其属性/字段'firstName'和'lastName'。使用firstName和lastName getter / setter来设置和获取每个字段总是最好的,还是可以接受一个简单的'name'getter / setter?

1 个答案:

答案 0 :(得分:1)

这在很大程度上取决于你计划使用这些变量的语言。在访问者(获取)和mutators(集合)是手工写出并且本身并不存在的语言中,有很多方法可以处理这些功能。

公共变量通常不赞成,但提供直接访问权限以使用和更改值。人们可以争论或反对公共和受保护的变量,但OOP中的普遍共识是您应该将自己的数据保留给自己。既然你已经提到了get / set,我们假设你不会这样做。

解决变量访问权限的另一种方法是返回参考,但与第一个示例一样,您的里程可能会有所不同。提供直接访问有很多责任,其中很多都直接留在用户的肩上。如果你打算让其他人在你这个班级工作,那么给他们这样的访问并不是特别安全。

标准 getName() setName()函数是处理它的最简单方法,并提供可在不更改界面的情况下轻松更新的格式。一旦你的程序大小合适,重构界面的变化就会成为一场噩梦。此路线允许您在不更改代码中的任何其他内容的情况下执行功能。

在支持它的语言中,您可以编写重载函数,它将根据语法决定您是要检索数据还是更改数据。这遵循与标准get / set相同的基本思想,但调用语法更类似于user.name("Joebob Peoplesmith")name = user.name()。解决这个问题的方式因语言和语言而异。

最后,某些语言对以某种方式声明的变量具有内置访问权限。一个很好的例子是Objective-C的property,它可以与私有变量合成,作为get / set接口直接访问。在此格式中,要访问NSString *m_pFirstName,您可以创建@property NSString *firstName,然后创建@synthesize firstName = m_pFirstName。 get / set由user.firstName隐式处理,就像它是一个局部变量一样。

至于组合firstName和lastName,这是个人选择,应根据您是否希望/需要单独更改任何内容来决定。问问自己:

  • 我是否只需要更改firstName或lastName?
  • 我是否只需要访问firstName或lastName?
  • 我如何计划返回firstName + lastName? (一个数组?一个组合的字符串?)
  • 谁将使用这些功能? (其他开发者?其他类?)
  • 这对新手来说是不言自明的吗? (易于理解?易于使用?'傻瓜'?)
  • 是否有可以帮助我的数据结构?

总的来说,您需要根据语言限制研究您的选项,并在做出决策之前计划如何使用变量。如果可能的话,避免重构中期开发。希望这有帮助!