除了明确明确之外,我们为什么要坚持:
car.getSpeed()car.setSpeed(55)
什么时候也可以使用它:car.speed()car.speed(55)

我知道 get() 和 set() 通过将所有内容保留在一个位置来保持对数据成员的任何更改都易于管理非常有用。

另外,显然,我明白 car.speed()car.speed(55)相同的 函数,这使得这个错误,但是在 PHP 和 Zend Framework 中,相同的操作用于 GET、POST、回发。
在 VB 和 C# 中,有“属性”,并且被很多人使用,这让我听说的纯粹主义者感到厌恶,而 Ruby 中也有这样的东西 5.times.each, .to_i ETC。
C++ 中还有运算符重载、多重继承、虚函数,这些的某些组合可能会让任何人发疯。

我的意思是说,做事的范例和方式如此之多,以至于没有人尝试过我提到的特定组合,这似乎很奇怪。

对于我来说,我的理由是 简短、清晰易读 代码。
我是不是非常错误,有点错误,这只是奇怪所以没有被使用,还是别的什么?

如果我仍然决定保持正确,我可以使用 car.speed()car.setSpeed(55).
这有什么错误吗(只是省略了“get”)?

感谢您的任何解释。

有帮助吗?

解决方案

如果我叫car.speed(),我可能会觉得我的车告诉速度,换句话说,以提高速度和突破速度极限。它是没有明确的吸气剂。

有些语言让你声明const对象,然后限制你只能调用不修改对象的数据功能。因此,有必要有单独的功能进行修改和读取操作。虽然你可以使用上PARAMATERS重载有两个功能,我认为这将是混乱的。

此外,当你说这是更清晰的阅读,我可以说,我已经做了展望了解如何阅读:

car.speed()

我读“汽车速度...”然后我就看有没有号码,我修改,并认为“得到车速。”

car.getSpeed()

我读 “这辆车,让速度”

car.setSpeed(55)

我读 “这辆车,设定速度,以55”

看来你已经基本上引用了语言的其他功能,如令人困惑,然后使用了作为制造getter / setter方法更加混乱辩护?这听起来等承认你提出什么更令人困惑。这些功能有时混淆,因为他们是多么通用。有时抽象可以更混乱,但最终,他们往往成为被更多的可重复使用的目的。我认为,如果你想支持速度()和速度(55)的争论,你会希望展示如何,可以使为程序员新的可能性。

在另一方面,C#确实有像你的描述,因为性质不同的表现为根据上下文getter或setter中使用了他们:

Console.WriteLine(car.Speed); //getter

car.Speed = 55 //setter

但是,尽管它是一个单一的属性,还有代码用于实现获取和设置两个单独的部分,并且很明显,这是一个吸气/设定器,而不是一个功能的速度,因为它们省略()为属性。所以car.speed()显然是一个函数,并且car.speed显然是一个属性吸气剂。

其他提示

IMHO具有属性作为用于获取语法糖和set方法是的C#风格最具表现。

我喜欢哪种封装业务,而不是getter和setter活动对象,所以你得到一个语义上更丰富的对象。

例如,虽然一个ADT而非业务对象,即使在C ++中vector已配对功能:

size_type capacity() const // how many elements space is reserved for in the vector  
void reserve(size_type n)  // ensure space is reserved for at least n elements 

void push_back ( const T& ) // inserts an element at the end
size_type size () const     // the number of elements in the vector

如果您开车,可以设置加速器,离合器,制动器和档位选择,但不设置速度。你可以阅读的速度关闭速度表。这是比较罕见的希望同时设定器和与行为的对象上的吸气剂。

FYI,Objective-C中使用car.speed()car.setSpeed(55)(除了在不同的语法,[car speed][car setSpeed:55]

这是所有关于约定。

有没有正确的答案,这是一个风格问题,最终也没有关系。花大脑循环别处。

FWIW我更喜欢的 class.noun()作为吸气剂,和 class.verb()作为设定器。有时动词只是setNoun(),而不是其他时间。这取决于名词。例如:

my_vector.size() 

返回的大小,和

my_vector.resize(some_size) 

改变的大小。

在常规的方法来性质是相当出色IMHO, http://groovy.codehaus.org/Groovy +豆类

代码的最终基准应该是这样的:

  1. 它工作正常吗?
  2. 如果坏了容易修吗?
  3. 以后添加新功能容易吗?
  4. 其他人介入并修复/增强它是否容易?

如果这四点都涵盖了,我无法想象为什么会有人对此有疑问。大多数“最佳实践”通常都是为了实现这 4 点。

使用适合你的风格,只要保持一致,就应该没问题。

这是只是一个约定的问题。在Smalltalk中,它的完成你的建议的方式,我不记得曾经听到有人抱怨。获得汽车的速度是car speed,和汽车的速度设定到55是car speed:55

如果我是冒险猜测,我会说这个款式不流行的原因是因为两条直线下降,这面向对象的编程都到我们这里来的:C ++和Objective-C。在C ++中(更在其历史这么早),方法是密切相关的C函数和C函数沿setWhatever()的线条常规命名,并没有超载不同数量的参数,所以命名的那普遍风格保持。 Objective-C的主要是明年保存下来(后来成为苹果),接下来往往在他们的API来冗长的青睐,尤其是对各种不同的方法区分 - 如果你正在做什么,但只是访问属性,旁边需要一个动词要清楚。这样就成了在可可惯例,这对目标C的事实上的标准库这些天。

这是常规的Java具有的getter和setter C#中的约定已性质,Python有公共字段和JavaScript框架倾向于使用现场()来获得和字段(值)来设置

  

除了明确清晰,我们为什么要坚持:   car.getSpeed()和car.setSpeed(55)   当这可以用作良好:car.speed()和car.speed(55)

由于在所有的语言我遇到,car.speed()car.speed(55)在语法方面是相同的。只是看着他们这样,既可以返回一个值,如果它本来是一个setter这是不是后者的事实。

如果您打算调用二传手却忘了放在什么说法?该代码是有效的,所以编译器不会抱怨,也不会引发立即运行时错误;它是一个无声的错误。

()意味着它是一个动词。 无()表示它是一个名词。

   car.Speed = 50;
   x = car.Speed
   car.Speed.set(30)
   car.setProperty("Speed",30)

   car.Speed()

意味着命令到超过速度极限。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top