0

これが私のコードです:

deleteStuffFromDb(); // void method
deleteStuffFromCache();

deleteStuffFromDb() は、戻り値の型が のインターフェイス メソッドvoidです。

理想的には、最初のメソッドは値 (成功/失敗) を返します。この戻り値によって、2 番目のメソッドが実行されるかどうかが決まります。

2 つのクラスから呼び出されるため、インターフェイスを変更できます。ただし、システムの全体像を把握していない O&M 開発者として、何かを壊してしまうリスクは依然としてあります。

この void deleteStuffFromDb() の実行が deleteStuffFromCache() の実行を決定するかどうかを私が決定することをどのように提案しますか?

ここに私が考えたいくつかの方法があります:

  1. deleteStuffFromDb() の周りに try/catch を配置し、エラーの場合に例外をスローします。catch() が発生した場合は、deleteStuffFromCache() を実行しないでください。
  2. deleteStuffFromCache() のロジックをメソッド deleteStuffFromDb() に入れ、このメソッド内での実行を許可/禁止する
  3. ...?

選んだ理由と感想を教えてください。

ありがとう。

4

4 に答える 4

2

2 つのクラスから呼び出されるため、インターフェイスを変更できます。ただし、システムの全体像を把握していない O&M 開発者として、

システムの全体像が 2 つの場所でしか使用されていない場合は、必ず両方を変更する必要があります。完全な再コンパイルとシステム テストにより、他に問題があるかどうかが明らかになります。

于 2012-10-26T01:15:30.073 に答える
1

deleteStuffFromDb()の署名を に書き換えますdeleteStuffFromDb(Object returnObject)

次に、古い署名を置き換えるラッパー インターフェイスを記述します。deleteStuffFromDb()

ラッパー インターフェイスで、次の操作を行います。

void deleteStuffFromDb() {
     // initialize some dummy returnObject that doesnt get used
     deleteStuffFromDb(dummyObject);
}

このシステムを使用するreturnObjectには、インターフェイスに a を渡して戻り値を取得します。

このようにして、必要に応じてオプションでインターフェイスから戻り値を取得できますが、古いインターフェイスを使用する既存の呼び出しを壊すことはありません。

于 2012-10-26T01:03:43.610 に答える
0

戻り値の型を void から別のものに変更しても、既存のコードが壊れるとは思いません。

戻り値の型が void の場合、それを使用しているコードはそのメソッドからの戻りを期待していません。また、そうするとすぐに壊れます。

これを変更してメソッドから何らかの値を返すと、既存のコードの場合、返された値は無視されます。

メソッドが何らかの値を返すことが期待される場所で void メソッドを使用することはできませんが、その逆は可能です。

私が考えることができる唯一のケースは、そのインターフェイスの実装がたくさんある場合です。

2 番目のポイントに関する限り、ロジックはそのままにしておくことをお勧めします。メソッド自体を呼び出すだけかもしれません。

于 2012-10-26T01:09:59.213 に答える
0

これがどれほど良い音かはわかりませんが、失敗の場合に例外をスローして成功するためのメソッド (例:Scanner.html#next()スローNoSuchElementExceptionIllegalStateException失敗の理由に基づく。このような例は他にもたくさんあります) を見てきました。

 public void deleteStuffFromDb(){
      ..... usual code..
      if (failedCondition){
           throw new RuntimeErrorException(new Error("Couldn't delete"));
      }
 }

呼び出し元側で、スローされた例外を受け取った場合、それは失敗であり、それ以外の場合は成功したと想定できます。これにより、インターフェイスの変更を回避できます。

于 2012-10-26T01:29:38.760 に答える