4

仕事をするのに長い時間がかかるかもしれないし、そうでないかもしれないバッチ操作を考えてみてください(データに依存します)。ユーザーは、ジョブの進行状況を追跡するためのオプションのリスナーを登録できます。

注:リスナーの登録は完全にオプションであり、ユーザーはリスナーを登録せずにジョブを呼び出したい場合があります。

Q:次のソリューションのどれがあなたの好みですか、そしてその理由は何ですか?

編集:ここでの懸念は、パフォーマンスクリーンなコードです。null参照のチェック(ソリューション1)は、2番目のソリューションに比べて高速であると言う人もいます。しかし、2番目の解決策はよりクリーンで理解しやすいものです。ご意見をお聞かせください。

いいえ1:nullリスナーを許可し、リスナーがnullでないかどうかを常に確認してから、呼び出します。

doMyBatchJob() {
   if (listener != null) {
      listenr.progressStarted(params);
   }
   while (x) {
      if (listener != null) {
          listener.progressUpdated(current, expected)
      }
   }
   if (listener != null) {
      listenr.progressFinished(params);
   }
}

いいえ2:ダミーリスナーを実装し、ユーザーが自分のリスナーを渡さなかった場合はそれを登録します。nullオブジェクトをチェックせずにリスナーを呼び出すことができるようにします。

DummyListener {
     public void progressStarted(params) { //DO NOTHING }
     public void progressUpdated(current, expected) { //DO NOTHING }
     public void progressFinished(params) { //DO NOTHING }
}

doMyBatchJob() {
   listener.progressStarted(params);
   while (x) {
         //Do a single unit of the batch operation
         // ... code omitted here
         listener.progressUpdated(current, expected)
   }
   listener.progressFinished(params)
}
4

4 に答える 4

4

if x==nullあなたはコードの臭いであるというあなたの懸念において正しいです、それは間違いなくそうです!

このパターンを使用することには非常に正当な理由があります。1つは、通常はビジネス関連ではなく、デザイン関連がより貧弱なノイズでNull Objectコードを散らかさないようにすることです。デフォルト値ではない値がないことを意味します。if (x == null)NULL

私はあなたがNull Objectパターンを十分に取っているとは思わない。

nullを返さないでください。また、nullをチェックする必要もありません。

まずreturn null、メソッドから決してif x == null、コードに含めることはありません。どちらもデザインが悪いことの確かな兆候です。null参照しNPE、それが発生しない場合に解決する必要があるエラーである必要があります。

nullを受け入れないでください。また、nullをチェックする必要もありません。

return nullを返し、Null Objectnullを受け入れ、null参照を処理する可能性のあるメソッドにはNull Object、を処理するための実装がありますNull References

あなたの場合、あなたのDummyオブジェクトは何もしないだけでなく、それが遭遇したという警告をログに報告するべきであり、それnullについて何かがなされるべきです。

優れたJSR305ライブラリを使用して、メソッドに注釈を付け、nullを受け入れないようにします。

作成するすべてのJavaプログラムにcom.google.code.findbugsMavenの依存関係があります。どんなに些細なことでも、すべてのメソッドとメソッドパラメーターを装飾することができ、二度と@NONNULL書くことを心配する必要はありませんif x == null

返されるサードパーティのコードがある場合はnull、それをラップしてJSR305アノテーションを使用します。

インポートでGuavaPreconditions.checkNotNull()を使用すると、マークされたすべてのパラメーターで実行できます。また、何があったのか、なぜそうではないのかなどについての説明的なエラーメッセージを含めることもできます。staticcheckNotNull()@Nonnnullnull

そして、彼らのコードがいかに貧弱に設計されているかについて、こっそりと考えてください。

于 2012-11-19T13:37:40.437 に答える
1

バッチジョブをとしてモデル化しObservable、リスナーをとしてモデル化しObserverます。notifyObservers(object)バッチジョブ内の状態の変化は、メソッドを介してオブザーバーと通信するために使用されるオブジェクトで追跡できます。

于 2012-11-19T03:11:07.593 に答える
-1

答えは、の背後にある本当の意図によって異なりますdefault listener。デフォルトのリスナー(ダミー)が何もしない場合は、そのようなリスナーを作成する必要はありません。Nullwithnull-checkは、そのようなシナリオのみを処理することを目的としています(より効率的でコンパクト)。

ただし、一方で、デフォルトのリスナーを介してデフォルトの動作を実装する場合は、デフォルトのリスナーを作成する必要があります。

経験則として、使用/要件が存在するまで、プログラムをオブジェクトで混雑させることはありません。

于 2012-11-19T03:10:38.257 に答える
-1

私はどちらもしません。オプション1を使用しますが、大幅に簡略化されています。

doMyBatchJob() {
   if (listener == null) {
       return; // if listener is null, do nothing
   }
   listener.progressStarted(params);
   while (x) {
      listener.progressUpdated(current, expected)
   }
   listener.progressFinished(params);
}

これは「早期終了」のマントラに従います。また、それは「クラスの肥大化」にはなりません-あなたのDummyListenerアイデアは価値を追加しません。代わりに使用するnullことはクリーンで明確です-リスナーが(つまり何もない)場合に何が起こっているかは誰もが知っておりnull、デバッグするときはより明白になります。

于 2012-11-19T04:03:35.217 に答える