将此层次结构类添加为反模式

时间:2017-08-16 09:57:09

标签: oop language-agnostic solid-principles anti-patterns

我有一些这样的课程:

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

让我们说; class L是一个抽象类,VC继承自该类。并且L具有类D的属性。 - 抱歉我的糟糕画和英语 -

现在,我需要添加一个新类 - RA - 具有类D的属性,而类V应该具有类RA的属性,但是我还需要从类L所以V的对象获取属性。在我看来是这样的:

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

我不确定!但在我看来,就像一个反模式或破坏LSP-SOLID原则 - 不知何故!但我无法弄明白。

我的新图表是反模式吗?还是有更好的方法来设计这种情况?

请注意,DVCRA等类可以实例化。
我的意思是类D的属性的使用现在在类V中是分层次的。

修改
想象一下,我使用了一个界面 - IGFP - 使用string中的D属性返回L值,因此在VC中,现在在V我需要使用RA代替D来覆盖它 在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}";
}

1 个答案:

答案 0 :(得分:2)

我确信无论你有什么味道,这个问题都没有真正描述过。

但是让我尝试将其分解。

第一个D仅由其他两个类使用。没有错。是什么让D引用类String这两个类的不同?所以让我们从图中删除它:

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

现在,仅使用RA,为什么与使用StringD等类有任何不同,让我们从图中删除它:

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

所以现在我们有一个非常简单的图表,没有证明任何问题。

所以,不,你的图表没有表明任何反模式。但这并不是说它不是一个,只是图表中没有足够的信息。我知道你试图用英语解释,但英语含糊不清。只看到这些类如何交互的实际代码示例将允许人们识别反模式或改进。