对象的行为回答了什么问题?

时间:2010-03-09 09:02:30

标签: language-agnostic oop class-design

读一本书我发现了以下声明:

  

(对象)行为回答以下两个问题之一:这个对象做什么(对我而言)?我该怎么做这个对象?在这个例子中一个橘子,它没有做很多,但我们可以做到这一点。一种行为是它可以被吃掉。

在我对对象行为的理解中,上述陈述对于第一个问题是正确的,而对于第二个问题则是不正确的。但是,我经常看到类似 Orange :: eat()的类,这让我不确定我的设计技巧。所以我想问一下 oranges 行为 eat 是一个设计错误吗? (橙子和吃只是用于举例)

3 个答案:

答案 0 :(得分:3)

我认为你对物体及其责任的思考方式没有错。如果橘子有嘴,Orange::eat()会有意义。否则,这是一个正在做饭的Animal

问题在于,SVO(主语 - 动词 - 宾语)句子并不总是描述某些内容的最佳方式,但是OOP似乎对这种语句有很大的偏见,所以我们经常遇到奇怪的,不自然的代码中的抽象句子结构。

答案 1 :(得分:1)

让我们采用经典的员工样本。 “我能为这个对象做些什么”意味着:

void SetSalary(int value);

吃橘子不是橙色的方法,是Person方法:

void Eat(Orange& orange);

答案 2 :(得分:1)

橙子可以做的事情,例如,给新的橙树提供rize。你是对的,橘子不能吃任何东西,所以吃橙子有吃的方法是有意义的。

通过这个明显的例子,答案很容易,但在现实生活中它变得更加复杂,你可以看看Robert Martin的C#中的敏捷原则,模式和实践。通过一些场景,了解谁可以做什么等。