12

除了明确的明确性之外,我们为什么要坚持:
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.timesand.each等等.to_i
你有运算符重载、多重继承、虚函数C++,某些组合可能会让任何人发疯。

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

至于我,我的理由是阅读代码更简洁。
我是不是很不对,有点不对,这只是奇怪的,所以没有使用,还是别的什么?

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

感谢您的任何解释。

4

12 回答 12

10

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

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

此外,当您说阅读更清晰时,我可以争辩说我必须提前了解如何阅读它:

car.speed()

我读了“车速......”然后我看到没有数字所以我修改并认为“获取车速”。

car.getSpeed()

我读到“对于这辆车,获得速度”

car.setSpeed(55)

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

看来您基本上已经引用了该语言的其他功能令人困惑,然后将其用作使 getter/setter 更加混乱的辩护?这几乎听起来像是在承认你的提议更令人困惑。这些功能有时会因为它们的通用性而令人困惑。有时抽象可能更令人困惑,但最终它们通常服务于更可重用的目的。我认为如果你想支持 speed() 和 speed(55),你会想展示它如何为程序员带来新的可能性。

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

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

car.Speed = 55 //setter

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

于 2010-01-12T19:43:06.460 回答
8

恕我直言,将属性作为 get 和 set 方法的语法糖的 C# 风格是最具表现力的。

于 2010-01-12T19:31:37.517 回答
4

我更喜欢封装操作的活动对象而不是 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

如果你开车,你可以设置油门、离合器、刹车和档位选择,但你不能设置速度。您可以从车速表上读取速度。在具有行为的对象上同时需要 setter 和 getter 是相对罕见的。

于 2010-01-12T19:56:45.323 回答
3

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

一切都与约定有关。

于 2010-01-12T19:34:56.290 回答
3

没有正确的答案,这是风格问题,最终没关系。把你的大脑周期花在别处。

FWIW 我更喜欢getter的class.noun ()和 setter 的 class.verb()。有时动词只是 setNoun(),但有时不是。这取决于名词。例如:

my_vector.size() 

返回大小,并且

my_vector.resize(some_size) 

改变大小。

于 2010-01-12T20:30:15.460 回答
1

恕我直言,属性的常规方法非常出色, http: //groovy.codehaus.org/Groovy+Beans

于 2010-01-12T19:37:16.850 回答
1

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

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

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

使用适合您的任何风格,只要保持一致,就可以了。

于 2010-01-12T19:45:30.733 回答
1

这只是一个约定俗成的问题。在 Smalltalk 中,它按照您建议的方式完成,我不记得曾听过任何人抱怨它。获取车速为car speed,设置车速为 55 为car speed:55

如果我冒昧地猜测一下,我会说这种风格没有流行起来的原因是因为面向对象编程的两条线已经来到我们这里:C++ 和 Objective-C。在 C++ 中(甚至在其历史的早期阶段),方法与 C 函数密切相关,并且 C 函数通常setWhatever()按照. Objective-C 在很大程度上由 NeXT(后来成为 Apple)保留,NeXT 倾向于在他们的 API 中支持冗长,尤其是区分不同类型的方法——如果你正在做任何事情而不只是访问一个属性,NeXT 需要一个动词说清楚。所以这成为了 Cocoa 中的约定,它是当今 Objective-C 的事实上的标准库。

于 2010-01-12T19:49:28.410 回答
1

它的约定 Java 有一个 getter 和 setter 的约定 C# 有属性,python 有公共字段,JavaScript 框架倾向于使用 field() 来获取和 field(value) 来设置

于 2010-01-12T19:59:41.260 回答
0

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

因为在我遇到的所有语言中,car.speed()并且car.speed(55)在语法方面都是相同的。只是这样看它们,两者都可以返回一个值,如果后者是一个 setter,这对后者来说是不正确的。

于 2010-01-12T19:38:51.697 回答
0

如果您打算调用 setter 但忘记输入参数怎么办?代码是有效的,所以编译器不会报错,也不会立即抛出运行时错误;这是一个无声的错误。

于 2010-01-12T20:50:44.503 回答
0

.() 表示它是一个动词。no () 表示它是一个名词。

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

   car.Speed()

暗示命令超过速度限制。

于 2010-01-15T15:23:14.727 回答