方法是否应该具有与他们所说的方法相同的前提条件?
-
11-10-2019 - |
题
最近,我有几个方案,对代码的小更改导致了多个类别的前提更改,我想知道是否应该通过合同设计。
public Goal getNextGoal() {
return goalStack.pop();
}
如果 goalStack.pop()
有一个先决条件,即堆栈不是空的,然后 getNextGoal()
需要明确具有相同的先决条件吗?似乎继承前提条件会使事情变得脆弱,而更改为队列或其他结构会将前提条件更改为 getNextGoal()
, ,是呼叫者,是呼叫者的呼叫者。但是,似乎并没有继承前提条件会隐藏合同和呼叫者,而呼叫者的呼叫者不知道先进的条件。
因此,所有呼叫者都知道并继承了他们所调用的代码的前提条件和后条件,或者在呼叫者永远不知道更深层的前提条件和后条件是什么?
解决方案
这取决于您的调用方法的准确作用。 前提条件的重要性是呼叫者负责履行前提条件.
因此,如果您的GetNextGoal方法的呼叫者应负责提供非空堆栈,那么您确实应该在GetNextGoal方法上设置前提条件。前提条件的明确性是代码合同的巨大优势之一,因此我建议您将它们放在呼叫者必须履行前提条件的所有地方。
但是,如果您的代码似乎很脆弱, 这可能是您需要重构一些代码的迹象.
似乎继承前提条件会使事情变得脆弱,并且更改为队列或其他结构将将前提条件更改为getNextGoal(),是呼叫者,它是呼叫者的呼叫者。
如果您将队列暴露于呼叫者并以后将其更改(如您所说,将其更改为另一个结构),则呼叫者也必须更改。这通常是脆性代码的标志。
如果你露出 界面而不是特定队列实现, ,您的先决条件也可以使用该界面,您不必每次实施更改时都更改前提条件。因此导致较少的代码。
其他提示
例外是一种解决方案,但对于您的情况可能不可行。
记录如果没有目标是正常的,会发生什么。
我无法判断您是否正在使用Java,C ++或其他内容,因为每种语言对于该特定语言都有更自然的方式。