当我使用返回值创建方法时,我通常会尝试进行设置,以便在以某种方式调用方法时必须返回一些默认值.当我开始时,我会经常编写做某事的方法,并且要么返回他们所做的,要么如果他们没有做任何事情,就会返回null.但我讨厌if(!null)
在我的代码中发表丑陋的陈述,
我正在读一本关于ruby的重新指南,我读过许多月前,由务实的程序员,我注意到他们经常返回self
(ruby's this
)时他们通常不会返回任何东西.他们说,这是为了能够链接方法调用,就像在这个例子中使用返回其设置属性的对象的setter一样.
tree.setColor(green).setDecor(gaudy).setPractical(false)
最初我发现这种东西很有吸引力.有几次我很高兴能够链接方法调用,Player.getHand().getSize()
但这有点不同,因为方法调用的对象从一步到另一步变化.
Stack Overflow对返回值的看法是什么?当您想到返回值时,是否有任何模式或习语会浮现在脑海中?有什么好方法可以避免沮丧和增加美感?
在我看来,你应该考虑三种回归案例:
第一个是对象属性的操作.您在此处描述的模式经常在操作对象时使用.一个非常典型的场景是将它与工厂一起使用.考虑这个假设的创建调用:
// When the object has manipulative methods: Pizza p = PizzaFactory().create().addAnchovies().addTomatoes(); // When the factory has manipulative methods working on the // object, IMHO more elegant from a semantic point of view: Pizza p = PizzaFactory().create().addAnchovies().addTomatoes().getPizza();
它允许快速掌握正在创建的内容或对象的操作方式,因为这些方法形成了一个人类可读的表达式.这绝对不错,但不要过度使用.根据经验,这可能与方法一起使用,其返回值也可以声明为void.
第二种可能是方法评估对象上的某些东西.例如,考虑一下方法,该方法car.getCurrentSpeed()
可以被解释为对象的消息,要求当前速度并返回该速度.它只会返回值,而不是太复杂.:)
第三种方法可能是当一个方法执行一个操作时,返回某种值来表明调用者的意图达到了多少 - 但是布置这样的方法可能很困难:
int new_gear = 20; if (car.gears.changeGear(new_gear)) // does that mean success or fail?
在这里您可以看到设计方法的难度.成功或失败后应该返回0吗?如果没有设置齿轮怎么样-1,因为汽车只有5档?这是否意味着目前的装备现在也是-1?该方法可以返回它更改的齿轮,这意味着您必须将提供给该方法的参数与返回代码进行比较.那会有用.另一方面,您可以简单地返回true或false表示失败,或者返回false或true表示失败.可以通过估计您是否希望这些方法调用失败或成功来决定使用哪一个.
在我看来,有一种方法可以通过给出语义描述来更好地表达这些返回值的语义.未来的开发人员与您的对象进行交互将非常爱您,因为您无需查找方法的注释或文档:
class GearSystem { // (...) public: enum GearChangeResult { GearChangeSuccess, NonExistingGear, MechanicalGearProblem }; GearChangeResult changeGear (int gear); };
这样,对于任何查看代码的程序员来说,返回值的含义就变得非常明显(考虑:if (gears.changeGear(20) == GearSystem::GearChangeSuccess)
- 比上面的示例更清楚这意味着什么)
我实际省略了返回值的第四种可能性,因为在我看来它不是任何:当程序中出现错误时,如逻辑错误或需要处理的故障 - 理论上你可以返回一个值所以.但是今天,这种情况不再那么频繁(或者不应该),因为这样做有例外.