2

だから私は最近、仕事で新しいプロジェクトに追加されました.Javaコードには、どこでも使用される約10〜15個のシングルトンクラスがあります。これらのクラスの目的は、(クライアント アプリケーションの起動時に) サーバーからデータを取得し、プログラム全体でそのデータにアクセスできるようにして、必要なたびにサービス呼び出しを行う必要がないようにすることです。

ただし、シングルトンがいかにひどいものであるかについての多数の投稿を読んだ後、密結合とテスト不能のために、どうすればそれらを置き換えることができますか? 依存性注入について聞いたことがありますが、アプリケーション内のほぼすべてのオブジェクトに同じデータを渡し続けたいですか? どんな提案も役に立ちます。

4

4 に答える 4

0

クラスを設計する方法は、明示的な依存関係を除外することです。クラスがシングルトンを使用する場合:

class Client {
  public void Method() {
    SomeService.getInstance().doSomething();
  }
}

その依存関係を内部に隠しています。それを引き出すには、(1) 構築するか、(2) 意味がある場合は関連するメソッドを使用します (オプション 2 を表示):

class Client {
  public void Method(SomeService service) {
    service.doSomething();
  }
}

これが最初のステップです。後で、シングルトンからインターフェイスを抽出して使用できます。これは遅いプロセスです: リファクタリング、再テスト、反復...

于 2012-04-13T17:32:31.623 に答える
0

ギースを見てください。コンストラクターを定義して、直接的な依存関係 (深い依存関係を下位に渡すためのファクトリーのファクトリーはありません) を受け取り、各注入可能なコンストラクターに注釈を付けて@injectから、それらで使用される抽象クラスまたはインターフェースに使用する実装を定義する「モジュール」クラスを作成します。コンストラクタ。

Guice はリフレクション マジックを使用して、モジュール クラスの命令に基づいて実装を見つけ、オブジェクト グラフをインスタンス化します。明示的に指示せずにモジュールで明示的に定義しなかった依存関係に対して、引数なしのコンストラクターを自動的に使用するのに十分スマートです。

Guice をそれよりもはるかにアーキテクチャに絡ませることができますが、回避したいのが依存関係を注入するための一連のファクトリだけである場合は、少しの Guice が非常に便利です。

于 2012-04-13T05:32:49.137 に答える
0

各シングルトンに依存すると思います。たとえば、Singleton をいくつかの静的関数に分解できますか? または、いくつかの小さなクラスに分割できますか。アプリケーションのごく一部でしか使用されていない可能性があります。したがって、そのモジュールで使用するためにリファクタリングされた小さなクラスです。最終的には、各シングルトンの使用に依存すると思います。コードがよりシンプルになり、拡張性が増し、よりクリーンになる場合は、それを維持してください。そうでない場合は、リファクタリングします。

編集:追加するには、リファクタリングの必要性は何ですか? コードはシンプルでクリーンで、機能しますか? もしそうなら、アプリケーションに機能を追加するだけです。既存のコードを変更するのではなく、常にコード/機能を追加するようにしてください。最後に答えなければならないのは、拡張可能ですか?

于 2012-04-13T03:33:51.507 に答える