为什么分别坚持get-set而不是car.speed()和car.speed(55)?

nam*_*orm 12 oop getter setter encapsulation car-analogy

除了明确清晰,我们为什么要坚持:
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
你有操作符重载,多重继承,虚拟函数C++,某些组合可以驱使任何人坚果.

我的意思是说,有太多的范例和方法可以完成任务,似乎没有人尝试过我提到的特定组合.

至于我,我的理由是阅读代码简短而清晰.
我错了,稍微错了,这只是奇怪的,所以不使用,或者还有什么?

如果我仍然决定保持正确,我可以使用car.speed()car.setSpeed(55).
这有什么不对(只是省略"获取")?

谢谢你的任何解释.

Aar*_*nLS 10

如果我打电话给car.speed(),我可能会认为我告诉汽车加速,换句话说就是提高速度并打破速度限制.这显然不是一个吸气剂.

某些语言允许您声明const对象,然后将您限制为仅调用不修改对象数据的函数.因此,必须具有用于修改和读取操作的单独功能.虽然你可以在参数上使用重载来实现两个功能,但我认为这会让人感到困惑.

此外,当你说它更清楚时,我可以争辩说我必须先去了解如何阅读它:

car.speed()
Run Code Online (Sandbox Code Playgroud)

我读了"汽车速度......",然后我看到没有号码,所以我修改并想"获得车速".

car.getSpeed()
Run Code Online (Sandbox Code Playgroud)

我读过"这辆车,速度快"

car.setSpeed(55)
Run Code Online (Sandbox Code Playgroud)

我读过"这辆车,速度设定为55"

你似乎已经基本上引用了该语言的其他功能令人困惑,然后用它作为防止让getter/setter更加混乱?这几乎听起来像是承认你提出的建议更令人困惑.这些功能有时令人困惑,因为它们具有一般的用途.有时抽象可能更令人困惑,但最终它们通常用于更可重用的目的.我想如果你想争论速度()和速度(55),你需要展示如何为程序员提供新的可能性.

另一方面,C#确实具有您所描述的内容,因为属性的行为与getter或setter不同,具体取决于它们的使用环境:

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

car.Speed = 55 //setter
Run Code Online (Sandbox Code Playgroud)

但是虽然它是单个属性,但是有两个单独的代码段用于实现获取和设置,很明显这是一个getter/setter而不是函数速度,因为它们省略了属性的().所以car.speed()显然是一个函数,car.speed显然是一个属性getter.

  • **"如果我打电话给car.speed(),我可能会认为我正在告诉汽车加速,换句话说就是提高速度并打破速度限制.这显然不是一个吸气剂."** - 这完全解释了它.如果你这么想的话,确实令人困惑.我的目标是"短而甜",但如果它被误解了一半的时间,这是一个*新问题,而不是解决方案*:-) (4认同)
  • 如果我看到"car.speed()",我会看到一个方法.如果我看到"int speed = car.speed()",我会看到一个吸气剂. (3认同)
  • 这个答案特定于"速度"这个词,因为它既是动词又是名词.替换"速度",这只是一个名词,它不再适用. (2认同)

Otá*_*cio 8

恕我直言,具有作为get和set方法的合成糖属性的C#样式是最具表现力的.

  • 能够做myObject.ThingsCount ++不仅是语法糖,而且比myObject.setThingsCount(MyObject.getThingsCount()+ 1)更具可读性; (10认同)