1

私は最近、コードへの小さな変更が複数のクラスにわたって前提条件を変更するといういくつかのシナリオを経験しました。

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

goalStack.pop()スタックが空でないという前提条件がある場合getNextGoal()、同じ前提条件を明示的に持つ必要がありますか? 前提条件を継承すると物事が脆弱になり、キューまたはその他の構造に変更すると、前提条件がgetNextGoal()、呼び出し元、呼び出し元の呼び出し元に変更されるようです。しかし、前提条件を継承しないと、コントラクトと呼び出し元が隠され、呼び出し元の呼び出し元は前提条件についてわからないように思えます。

すべての呼び出し元が呼び出し元のコードの事前条件と事後条件を知って継承する脆弱なコードか、それともより深い事前条件と事後条件が何であるかを呼び出し元がまったく知らない不思議なコードですか?

4

2 に答える 2

3

呼び出しメソッドが正確に何をするかによって異なります。前提条件で重要なことは、呼び出し元が前提条件を満たす責任があるということです。

したがって、GetNextGoal メソッドの呼び出し元が空でないスタックを提供する必要がある場合は、GetNextGoal メソッドに前提条件も設定する必要があります。前提条件が明確であることは、コード コントラクトの大きな利点の 1 つであるため、呼び出し元が前提条件を満たさなければならないすべての場所に配置することをお勧めします。


ただし、コードが壊れやすいと思われる場合は、一部のコードをリファクタリングする必要があることを示している可能性があります

前提条件を継承すると物事が脆弱になり、キューまたは他の構造に変更すると前提条件が getNextGoal() に変更され、それが呼び出し元であり、呼び出し元の呼び出し元になるようです。

キューを呼び出し元に公開し、後で変更する場合 (あなたが言ったように別の構造に)、呼び出し元も変更する必要があります。これは通常、脆弱なコードの兆候です。

特定のキュー実装の代わりにインターフェイスを公開する場合、前提条件でもインターフェイスを使用でき、実装が変更されるたびに前提条件を変更する必要はありません。したがって、脆弱なコードが少なくなります。

于 2010-12-21T07:45:22.587 に答える
0

例外は 1 つの解決策ですが、状況によっては実行できない可能性があります。

ゴールがない場合に何が起こるかを文書化するのが普通です.EG これは malloc() が C で行うことです.

Java を使用しているのか、C++ を使用しているのか、それとも何か他の言語を使用しているのかはわかりません。各言語には、その特定の言語に対してより自然な方法がある可能性があるためです。

于 2010-12-20T16:39:43.497 に答える