2

アンチパターンこの階層的にクラスを追加している:は、私はこのようないくつかのクラスを持っていた

+---+    +---+ 
| L | ---uses---> | D | 
+---+    +---+ 
    |    +---+ 
inherit ----<---- | V | 
    |  +---+ +---+ 
    +---<--- | C | 
      +---+ 

さんが言ってみましょう。クラスLは抽象クラスであり、VCはそれを継承しています。 LはクラスDの特性を持っています。 - RA - - 私の悪い描画のため申し訳ありませんし、また英語 -

今、私は新しいクラスを追加する必要がありますクラスDとクラスVの性質を持つクラスRAの性質を持っている必要があり、しかし、私はまた、取得する必要がありますクラスのオブジェクトのプロパティV。私の心の中では、次のようなものです:

+---+   +---+   +----+ 
| L | --uses--> | D | <--uses-- | RA | 
+---+   +---+   +----+ 
    |    +---+   | 
inherit ----<----| V | --uses-->--+ 
    |  +---+ +---+ 
    +---<---| C | 
      +---+ 

私は分かりません!しかし、それは私には、アンチ・パターンやソリッド原理のLSPのブレーカが好きなようです - しかし、私はそれを理解できません。

私の新しいダイアグラムはアンチパターンですか?またはこの状況を設計するより良い方法がありますか?

D,V,CおよびRAのようなクラスがインスタンス化できることに注意してください。
そして、私は、クラスDのプロパティの使用がクラスVに階層的になったことを意味しました。

編集:私はRAを使用しての代わりDことによってそれをオーバーライドする必要がVでそうVCLDプロパティを使用してstring値を返され、今 - - IGFP
は、私はインターフェイスを使用することを想像してみて。 C#クラスで
は以下のとおりです。

public abstract class L : VOBase<L>, IGFP { 
    public virtual D D { get; protected set; } 
    public virtual string Name { get; protected set; } 
    public virtual string GFP => $"{D.GFP}/{Name}";  // Here I use D property that I think breaks LSP 
} 

public class C : L { 
    public C (D d, string name) { 
     D = d; 
     Name = name; 
    } 
} 

public class V : L { 
    public V (RA ra, string name) { 
     RA = ra; 
     Name = name; 
     D = ra.D; 
    } 
    public RA RA { get; private set; } 
    public override string GFP => $"{RA.GFP}/{Name}"; // Here I should override GFP to use RA instead of D 
} 

public class D : VOBase<D>, IGFP { 
    public D (U u, string name) { 
     U = u; 
     Name = name; 
    } 
    public U U { get; private set; } 
    public string Name { get; private set; } 
    public string GFP => $"{U.GFP}/{Name}"; 
} 

public class RA : VOBase<RA>, IGFP { 
    public RA (D d, string name) { 
     D = d; 
     Name = name; 
    } 
    public D D { get; private set; } 
    public string Name { get; private set; } 
    public string GFP => $"{D.GFP}/{Name}"; 
} 

答えて

2

私は本当にこの質問で説明されていないものは何でもあなたが臭いがされていることです。

私はそれを分解しようとしましょう。

最初のDは、他の2つのクラスでのみ使用されます。それには何も問題ありません。どのようなものをStringのようなクラスを参照する両方のクラスと異なる任意のDですか?それでは、ダイアグラムから削除してみましょう:、RAのみ、使用されている今、

+---+       +----+ 
| L |       | RA | 
+---+       +----+ 
    |    +---+   | 
inherit ----<----| V | --uses-->--+ 
    |  +---+ +---+ 
    +---<---| C | 
      +---+ 

なぜStringまたはDのようなクラスを使用してから任意の異なるが、のはダイアグラムから削除しましょうということです。

+---+ 
| L | 
+---+ 
    |    +---+    
inherit ----<----| V | 
    |  +---+ +---+ 
    +---<---| C | 
      +---+ 

だから私たちは、問題を示さない非常に簡単な図を持っています。

だから、いいえ、あなたの図は、どのようなアンチパターンも示していません。しかし、そうではないと言っているわけではなく、図に十分な情報が含まれていないということだけです。私はあなたが英語で説明しようとしたことを知っていますが、英語はあいまいです。これらのクラスがどのように相互作用するかの実際のコード例を見るだけで、人々はアンチパターンや改善を識別することができます。

+0

あなたの答えはtnxです。あなたはアンチパターンがないということを意味していると思います。 –

+0

私はそう言っています: "あなたの図はどんなアンチパターンも示していません" – weston

+0

私はいくつかの単純化を行っていますが、コードはまだあなたに間違って見えますか? – weston

関連する問題