最近,我有几个方案,对代码的小更改导致了多个类别的前提更改,我想知道是否应该通过合同设计。

public Goal getNextGoal() {
    return goalStack.pop();
}

如果 goalStack.pop() 有一个先决条件,即堆栈不是空的,然后 getNextGoal() 需要明确具有相同的先决条件吗?似乎继承前提条件会使事情变得脆弱,而更改为队列或其他结构会将前提条件更改为 getNextGoal(), ,是呼叫者,是呼叫者的呼叫者。但是,似乎并没有继承前提条件会隐藏合同和呼叫者,而呼叫者的呼叫者不知道先进的条件。

因此,所有呼叫者都知道并继承了他们所调用的代码的前提条件和后条件,或者在呼叫者永远不知道更深层的前提条件和后条件是什么?

有帮助吗?

解决方案

这取决于您的调用方法的准确作用。 前提条件的重要性是呼叫者负责履行前提条件.

因此,如果您的GetNextGoal方法的呼叫者应负责提供非空堆栈,那么您确实应该在GetNextGoal方法上设置前提条件。前提条件的明确性是代码合同的巨大优势之一,因此我建议您将它们放在呼叫者必须履行前提条件的所有地方。


但是,如果您的代码似乎很脆弱, 这可能是您需要重构一些代码的迹象.

似乎继承前提条件会使事情变得脆弱,并且更改为队列或其他结构将将前提条件更改为getNextGoal(),是呼叫者,它是呼叫者的呼叫者。

如果您将队列暴露于呼叫者并以后将其更改(如您所说,将其更改为另一个结构),则呼叫者也必须更改。这通常是脆性代码的标志。

如果你露出 界面而不是特定队列实现, ,您的先决条件也可以使用该界面,您不必每次实施更改时都更改前提条件。因此导致较少的代码。

其他提示

例外是一种解决方案,但对于您的情况可能不可行。

记录如果没有目标是正常的,会发生什么。

我无法判断您是否正在使用Java,C ++或其他内容,因为每种语言对于该特定语言都有更自然的方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top