OO - 减少样板/转发代码

时间:2016-10-30 16:45:56

标签: oop

想象一下:我有一堆DTO继承自 Foo class

    class Foo { }

    class FooA : Foo { }

    class FooB : Foo { }

    class FooX : Foo { }

我有一个类封装了与Foo数据类型相关的所有相关逻辑和编排。我提供了一个方法DoSomethingWithData(Foo data),它可以完成与参数

提供的数据相关的所有逻辑

方法实现是这样的:

void DoSomething(Foo data)
{
     if (data is FooA)
           DoSomethingWithFooA((FooA) data);
     if (data is FooB)
           DoSomethingWithFooB((FooA)data);
     if (data is FooX)
           DoSomethingWithFooC((FooA)data);
}

这是一个非常简化的例子。这种方法的优点是:

  • “客户端”始终独立调用DoSomething方法 Foo数据类型
  • 如果我添加新类型,我只需要更改方法DoSomething

我不喜欢的是向下倾斜

替代方法是,不是仅公开DoSomething方法,而是按每个Foo数据类型公开方法。优点是我们没有向下转换,但增加了样板/转发代码。

你更喜欢什么?或者你有其他方法吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下,我会像这样处理问题(我将在本例中使用Java)。

在您的方法中,对于Foo的每个子类,您必须提供特定的处理逻辑 - 如您所示,并将Foo对象强制转换为其子类型。此外,对于您添加的每个新类,您必须更改DoSomething(Foo f)方法。

您可以将Foo课程设为interface

public interface Foo{
   public void doSomething();
}

然后让你的类实现这个接口:

public class FooA iplements Foo {
   public void doSomething(){
      //Whatever FooA needs to do.
   }
}

public class FooB implements Foo {
   public void doSomething(){
      //Whatever FooB needs to do.
   }
}

等等。然后,客户端可以调用doSomething()方法:

...
Foo fooA = new FooA();
Foo fooB = new FooB();

fooA.doSomething();
fooB.doSomething();
...

这样,您不必在运行时强制转换对象,如果添加更多类,则不必更改现有代码,但必须调用新添加方法的客户端除外对象