Cyclomatic泛型代码设计

时间:2014-10-02 09:32:18

标签: java generics

试着说抽象: 我尝试为组件和定向连接器网络设计通用模式。所有组件都通过连接器连接。 因此,在不失一般性的情况下,想象一下组件和连接器的链(非常简单的网)我们有这样的东西: CompA - > ConnectorAB - > CompB - > ConnectorBC - > CompC ......等等

由于连接器应该是具有某些属性和功能的实际对象,因此我不能只实现类似于双链的成员列表。

组件在列表中包含其中的输入和输出连接器,并且连接器保持其源组件和目标组件。 我给你一个例子 - 我的例子:

interface Component<In extends Connector, Out extends Connector> { List<In> getIns();...}

interface Connector<S extends Component, T extends Component> { S getSource();...}

interface CompA<In extends Connector<?, CompA>, Out extends Connector<CompA, ?>> extends Component<In, Out> {}

interface CompB<In extends Connector<?, CompB>, Out extends Connector<CompB, ?>> extends Component<In, Out> {}

interface A_A extends Connector<CompA, CompA> {}

interface A_B extends Connector<CompA, CompB> {}

问题:

  • i。)Cyclomatic泛型依赖:我可以无限地嵌套泛型(Component<Connector<Component.......>>>),而不是我使用原始类型,这很好,但无论如何它似乎都很混乱。
  • ii。)我想用CompA<In extends Connector<?, CompA>, Out extends Connector<CompA, ?>>表达的是,我的CompA知道它连接到一个针对CompA的连接器。显然那不是我在语法上做的事。
  • III。) A_A aa; aa.getSource(); //gives me a CompA, thats great. aa.getSource().getIns(); //gives me a List of raw Connectors, but i would like to have a list of partially defined connectors, they know they are referencing a compA aa.getSource().getIns().get(0).getTarget() // should give me a compA 编写我的代码,显然这不起作用,因为我想要它,但我认为'aa.getSource()。getIns();'可以工作,因为In-Type至少是一个连接器权利?
  • 我正在寻求实施此模式的建议(所以说,更正我的代码!)。它必须在java中,但我不必只使用java-generics。如果你可以使用非java泛型模式完成这个抽象模式,那么它可能没问题(基于其他java语言特性或OO模式的模式)。

    我想我错过了很多信息,所以如果事情不清楚,请提出要求。

    1 个答案:

    答案 0 :(得分:3)

    我认为以下内容最能模拟您的要求。您可能仍会遇到多个差异和/或擦除问题。如果你这样做,我会建议你完全放弃泛型而不是使用原始类型。

    interface Component<SELF extends Component<SELF>> { Set<Connector<?, SELF>> getIns();...}
    
    interface Connector<SOURCE extends Component<SOURCE>, DESTINATION extends Component<DESTINATION>> { SOURCE getSource();...}
    
    interface CompA extends Component<CompA> {}
    
    interface CompB extends Component<CompB> {}
    
    interface A_A extends Connector<CompA, CompA> {}
    
    interface A_B extends Connector<CompA, CompB> {}