5

と という 2 つのサービス Bean がPowerUserManagerありSimpleUserManagerます。両方の@Serviceアノテーション付きクラスには、コードの約 20% が共通しています。

2 つのクラス間の冗長性を減らすために、共通の抽象クラス ( ) を持つ継承ツリーを作成しました。BaseUserManager

                               BaseUserManager
                                      |
                               ---------------
                               |             |
                       PowerUserManager  SimpleUserManager

次に、私@Controllerまたは任意のクライアントクラスで、注釈を使用して両方を@Autowired注入し、扱っているユーザーのインスタンスに応じてそれらのいずれかを使用します。PowerUserManagerSimpleUserManager

特にサービス層でコードを因数分解するために継承を使用するのは苦手です。Spring フェローの皆さん、これを行うためのより良い方法を見つけましたか?

4

1 に答える 1

3

この場合、コンポジションに対する継承を検討する前に、いくつかの基本的な質問を自問する必要があります

  1. すべてのユーザー マネージャーは BaseUserManager ですか? これはどんな場合でも IS-A 関係ですか?
  2. ユーザーマネージャーが関与するすべての場所で BaseUserManager パブリック API を公開することは理にかなっていますか?
  3. BaseUserManager の責任は 1 つですか?

答えが「はい」の場合、継承が正しい方法です。それ以外の場合は、いくつかの小さなコンポーネントに再設計し、PowerUserManager と SimpleUserManager をサービス ファサードとして扱う必要があります。

于 2013-03-01T08:50:30.123 に答える