Oop 为什么分别坚持设置而不是car.speed()和car.speed(55)?

Oop 为什么分别坚持设置而不是car.speed()和car.speed(55)?,oop,encapsulation,setter,getter,car-analogy,Oop,Encapsulation,Setter,Getter,Car Analogy,除了清晰明确之外,我们为什么还要坚持: car.getSpeed()和car.setSpeed(55) 当这也可以使用时: car.speed()和car.speed(55) 我知道get()和set()通过将所有内容都放在一个地方来保持对数据成员的任何更改的可管理性非常有用 另外,很明显,我知道car.speed()和car.speed(55)是相同的函数,这使得这一点是错误的,但在PHP和Zend框架中,相同的操作用于GET、POST和postback。 在VB和C中,有“属性”,被许多我听

除了清晰明确之外,我们为什么还要坚持:
car.getSpeed()
car.setSpeed(55)

当这也可以使用时:
car.speed()
car.speed(55)

我知道get()和set()通过将所有内容都放在一个地方来保持对数据成员的任何更改的可管理性非常有用


另外,很明显,我知道
car.speed()
car.speed(55)
是相同的函数,这使得这一点是错误的,但在PHP和Zend框架中,相同的操作用于GET、POST和postback。
在VB和C中,有“属性”,被许多我听说过的纯粹主义者所厌恶,Ruby中也有类似于
5.times
。每个
。to\u I
等的东西 并且在C++中有操作符重载、多重继承、虚函数,其中某些组合可以驱动任何螺母。 我的意思是说,有这么多的范例和方式来做事情,似乎奇怪的是,没有人尝试过我提到的特定组合

至于我,我的理由是阅读代码既简短又干净。
我是不是大错特错了,有点错了,这是不是很奇怪,所以没有用过,还是别的什么

如果我仍然决定保持正确,我可以使用
car.speed()
car.setSpeed(55)

这在任何方面都是错误的(只是省略了“get”)


感谢您的解释。

我想C风格的属性作为get和set方法的合成糖是最具表现力的。

仅供参考,Objective-C使用
car.speed()
car.setSpeed(55)
(除了不同的语法,
[car speed]
[car setSpeed:55]


这都是关于约定的。

groovy的属性方法非常优秀

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

因为在我遇到的所有语言中,
car.speed()
car.speed(55)
在语法上都是一样的。就这样看它们,两者都可以返回一个值,如果它是一个setter,那么后者就不是这样了。

如果我调用car.speed(),我可能会认为我是在告诉汽车加速,换句话说就是提高速度,突破限速。这显然不是一个好办法

有些语言允许您声明const对象,然后将您限制为仅调用不修改对象数据的函数。因此,有必要为修改和读取操作提供单独的函数。虽然您可以使用参数重载来拥有两个函数,但我认为这会造成混淆

此外,当你说阅读更清晰时,我可以说我必须做一个前瞻性的了解如何阅读:

car.speed()
我读了“汽车速度…”,然后我看到没有数字,所以我修改并认为“获得汽车速度”

我读到“为了这辆车,加速”

我读到“对于这辆车,将速度设置为55”

似乎你基本上引用了该语言的其他特性,认为它们令人困惑,然后以此为借口让getter/setter变得更加困惑?这听起来就像是你承认你所提出的更令人困惑。这些特性有时令人困惑,因为它们的通用性。有时抽象ons可能会更令人困惑,但最终它们往往是为了更具可重用性。我认为,如果你想支持speed()和speed(55),你应该向程序员展示这如何为程序员带来新的可能性

另一方面,C#确实有您所描述的东西,因为属性作为getter或setter的行为不同,这取决于它们所使用的上下文:

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

car.Speed = 55 //setter

但是,虽然它是一个单独的属性,但有两个独立的代码部分用于实现获取和设置,很明显,这是一个getter/setter,而不是函数speed,因为它们省略了properties.So car.speed()的()显然是一个函数,而car.speed显然是一个属性获取工具。

代码的最终基准应该是:

  • 它工作正常吗
  • 如果它坏了,修理起来容易吗
  • 将来添加新功能容易吗
  • 其他人进来修复/增强它容易吗
  • 如果涵盖了这4点,我无法想象为什么会有人对此有问题。大多数“最佳实践”通常都是为了实现这4点


    无论哪种风格适合你,只要保持一致,你就可以了。

    这只是一个惯例问题。在Smalltalk中,它是按照你建议的方式完成的,我不记得有人抱怨过。获得车速是
    车速
    ,将车速设置为55是
    车速:55
    >

    如果我想猜测一下,我想说这种风格之所以没有流行是因为面向对象编程已经来到了我们的两条线:C++和Objtovi.C(C++在历史上更为如此)。,方法与C函数关系非常密切,C函数按惯例按照
    setwhather()
    命名,并且对于不同数量的参数没有重载,因此保持了命名的一般风格。Objective-C在很大程度上被NeXT(后来成为Apple)保留了下来,NeXT倾向于在API中使用冗长的语言,尤其是在区分不同类型的方法时——如果你只是在访问一个属性,NeXT需要一个动词来表达清楚。因此这成为Cocoa的惯例,Cocoa现在是Objective-C事实上的标准库。

    我更喜欢活动对象W
    car.setSpeed(55)
    
    Console.WriteLine(car.Speed); //getter
    
    car.Speed = 55 //setter
    
    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
    
    my_vector.size() 
    
    my_vector.resize(some_size) 
    
       car.Speed = 50;
       x = car.Speed
       car.Speed.set(30)
       car.setProperty("Speed",30)
    
       car.Speed()