2

API があるとします。

interface Graph {
    boolean checkIfPathExists(source, destination);
    List<Integer> getPath(source, destination);
}

次のうち、最適な実装または推奨される実装はどれですか。

オプション 1: パスが存在することを確認するためのチェックを強制します。checkPath が事前に呼び出されていない場合は、例外をスローします。

Graph g = new GraphImpl(graph);
if (g.checkIfPathExists(s, d)) {
   List path = g.getPath(s, d);
}

オプション 2: 関数シーケンスを強制しない。getPath が呼び出された場合、getPath() は内部的に checkIfPathExists() を呼び出し、checkIfPathExists() が false を返す場合は空のコレクションを返します。

Graph g = new GraphImpl(graph);
List path = g.getPath(s, d);

私の意見では、Option2 は私には良さそうに見えますが、唯一の問題は、'checkIfPathExists()' のような状態チェック メソッドへの冗長/不必要な呼び出しです。理想的には、これは getPath() がすべきことではありません。パスを返すだけです。

  1. option1 と option2 のどちらがより良い実装ですか?

  2. オプション 2 がより良いオプションである場合、'checkIfPathExists' をパブリック インターフェイスとしてまったく追加しない方が良い設計上の選択でしたか? 質問をより一般的な状態チェック メソッドにするために、強制されていない場合は「hasNext()」のように表示されます。リストを繰り返し処理する場合でも、リストのサイズを取得し、i <= サイズになるまで for ループを使用でき、hasNext() はまったく使用しません。一言で言えば、強制されていない状態チェック関数の使用は何ですか?

  3. 状態チェック方法が強制されている「実際の」例はありますか? つまり、それらを事前に呼び出さないと例外が発生しますか?

4

2 に答える 2