4

私はまだプログラミング開発の初心者であり、きれいなデザインを作成するのに苦労しています。具体的には、次のようなシナリオがあります。

それぞれ共通の機能を持つ 4 つのクラスがあります。これらのメソッドを A、B、C などと呼びましょう。

クラス: アカウント; メソッド: A、B、C、G、H、I、S1、S2、S3
クラス: フォルダー。メソッド: A、B、C、D、E、S1、S2、S3
クラス: グループ ; メソッド: A、B、C、D、E、F、S1、S2、S3
クラス: Role ; メソッド: A、B、C、D、E、F、S1、S2、S3

上記のメソッドは抽象的です。同様に、メソッド A を異なる方法で実装する FooAccount と BarAccount が存在する可能性があります。ただし、FooAccount と FooGroup には同じメソッド A があります (これらは同じ実装であるため、Foo)。FooAccount と BarAccount が同じメソッド S1、S2、および S3 を持つように、Foo と Bar の間でも同じように実装されているいくつかのメソッド S1、S2、および S3 があることを除いて、それほど悪くはありません。

現在、私のデザインはかなり醜いです:

インターフェイス Object1: A、B、C を宣言し
ます インターフェイス Object2 は Object1 を拡張します: D、E を宣言します インターフェイス Object3 は Object2 を拡張し
ます: F を宣言し
ます インターフェイス Account は Object1 を拡張します: G、H、I を宣言し
ます インターフェイス Folder は Object2 を拡張します。
インターフェイス Group は Object3 を拡張します。
インターフェイス Role は Object3 を拡張します。
class Helper: S1、S2、S3 を定義

私は複数の継承が正当な理由で禁止されていることを知っていますが、そうすることを許可された場合、メソッドS1、S2、およびS3をObject1に入れて、すべてのインターフェイスを要約に変えることができます。その後、fooaccountはアカウントとfooobject1の両方を拡張できます。

どの構造がより良いか、誰かアドバイスをもらえますか? すべての A、B、C などを Util クラス (FooUtil や BarUtil など) に入れる必要がありますか?

4

2 に答える 2

2

出現回数ではなく、役割に従ってインターフェース内のメソッドをグループ化する必要があります。したがって、が 1 つの役割に属し、別の役割に属し、その役割に属すると仮定するABCDEF

interface Role1 - A, B, C
interface Role2 - D, E
interface Role3 - F
interface Account extends Role1
interface Folder extends Role1, Role2
interface Group extends Role1, Role2, Role3

メソッドの共通の実装がある場合は、デフォルトの実装を提供する抽象基本クラスにそれらを移動できます

abstract class Helper - S1, S2, S3

次に、具体的なクラスを宣言できます

class FooAccount extends Helper implements Account

FooおよびBarに共通する動作を抽出できる場合は、ジェネリックの使用を検討することもできます(およびをインターフェイスの代わりにAccountジェネリック クラスにする)。FooBar

于 2012-06-19T17:27:02.110 に答える
0

コードの繰り返しを減らすメカニズムとして継承に依存しないでください。代わりに、責任を別々のクラスに分ける方法を見つけてください。

FooAccount と FooGroup には同じメソッド A があります

これは、メソッド A の実装が独自のクラス ( FooA) に属していることを示しています。AccountGroupがメソッド を公開することが本当に理にかなっている場合、とAの実装は単純に へのパススルーにする必要があります。FooAccount.AFooGroup.AFooA.A

于 2012-06-19T17:32:27.347 に答える