读一本书我发现了以下声明:
(对象)行为回答以下两个问题之一:这个对象做什么(对我而言)?或我该怎么做这个对象?在这个例子中一个橘子,它没有做很多,但我们可以做到这一点。一种行为是它可以被吃掉。
在我对对象行为的理解中,上述陈述对于第一个问题是正确的,而对于第二个问题则是不正确的。但是,我经常看到类似 Orange :: eat()的类,这让我不确定我的设计技巧。所以我想问一下 oranges 行为 eat 是一个设计错误吗? (橙子和吃只是用于举例)
答案 0 :(得分:3)
我认为你对物体及其责任的思考方式没有错。如果橘子有嘴,Orange::eat()
会有意义。否则,这是一个正在做饭的Animal
。
问题在于,SVO(主语 - 动词 - 宾语)句子并不总是描述某些内容的最佳方式,但是OOP似乎对这种语句有很大的偏见,所以我们经常遇到奇怪的,不自然的代码中的抽象句子结构。
答案 1 :(得分:1)
让我们采用经典的员工样本。 “我能为这个对象做些什么”意味着:
void SetSalary(int value);
吃橘子不是橙色的方法,是Person方法:
void Eat(Orange& orange);
答案 2 :(得分:1)
橙子可以做的事情,例如,给新的橙树提供rize。你是对的,橘子不能吃任何东西,所以吃橙子有吃的方法是有意义的。
通过这个明显的例子,答案很容易,但在现实生活中它变得更加复杂,你可以看看Robert Martin的C#中的敏捷原则,模式和实践。通过一些场景,了解谁可以做什么等。