除了毫不含糊的明确性外,我们为什么要坚持:
car.getSpeed()和car.setSpeed(55)
当它也可以使用时:car.speed()和car.speed(55)
我知道get()和set()可以通过将所有内容保持在一个位置来保持对数据成员的任何更改是可管理的。
而且,很明显,我理解car.speed()和car.speed(55)是相同的函数,这使得这是错误的,但是在中,同样的操作用于GET、POST、回发。
在VB和C#中有“属性”,被许多人使用,这让我所听到的纯粹主义者非常反感,而且Ruby中也有一些东西,比如5.times和.each、.to_i等等。
而且在C++中有操作符重载、多重继承、虚拟函数,其中的某些组合可能会使任何人发疯。
我的意思是说,有如此多的范例和方式来做事情,所以似乎奇怪的是,没有人尝试过我提到的特定组合。
对我来说,我的理由是,阅读代码是简短和简洁的。
我是不是大错特错了,有点不对,这是不是很奇怪,所以没有被使用,或者还有什么?
如果我仍然决定保持正确,我可以使用car.speed()和car.setSpeed(55)。
这在任何方面都是错误的(只是省略了"get“)吗?
谢谢你的解释。
发布于 2010-01-12 19:43:06
如果我调用car.speed(),我可能会认为我是在告诉汽车加速,换句话说,是为了提高速度和打破速度限制。这显然不是一个好消息。
有些语言允许您声明const对象,然后将您限制为只调用不修改对象数据的函数。因此,对于修改操作和读取操作,需要有独立的函数。虽然可以使用参数上的重载来具有两个函数,但我认为这会让人感到困惑。
另外,当你说阅读更清晰时,我可以说我必须向前看一看才能理解它的阅读方式:
car.speed()我读过“车速.”然后,我看到没有数字,所以我修改,并认为“获得汽车速度”。
car.getSpeed()我读过“为了这辆车,要提速”
car.setSpeed(55)我读到“这辆车,把车速调到55”
似乎您基本上已经引用了语言的其他特性使人感到困惑,然后用它作为使getter/setter更加混乱的辩护理由?这听起来好像是在承认你提出的建议更令人困惑。这些特性有时会让人感到困惑,因为它们的用途是多么的普遍。有时,抽象可能更令人困惑,但最终它们往往会达到更可重用的目的。我认为,如果您想要主张速度()和速度(55),那么您将需要展示如何为程序员提供新的可能性。
另一方面,C#确实有类似于您所描述的内容,因为属性作为getter或setter的行为是不同的,这取决于它们使用的上下文:
Console.WriteLine(car.Speed); //getter
car.Speed = 55 //setter但是,虽然它是一个单独的属性,但是有两个独立的代码部分来实现not和设置,很明显这是一个getter/setter,而不是函数速度,因为它们忽略了属性的()。因此,car.speed()显然是一个函数,而car.speed显然是一个属性getter。
发布于 2010-01-12 19:31:37
IMHO作为get和set方法的属性作为合成糖的C#风格是最具表现力的。
发布于 2010-01-12 19:56:45
我更喜欢封装操作的活动对象,而不是getter和setter,因此您可以获得语义上更丰富的对象。
例如,虽然ADT而不是业务对象,但即使是vector在C++中也有成对的函数:
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如果你开车,你可以设置油门,离合器,刹车和齿轮选择,但你不设定速度。你可以从速度计上读出速度。对于有行为的对象,想要一个设置者和一个getter是相对较少的。
https://stackoverflow.com/questions/2051713
复制相似问题