gpt4 book ai didi

java - 如何重构使用 "Strategies"的大类?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:13 27 4
gpt4 key购买 nike

问题

我有一个大类(大约 1500 LOC),它使用不同的“策略”将数据从一个对象转换到另一个对象。我在这里有那个类的表示:

public class FooService implements FooProcessing {
FooRequestTransformer fooRequestTransformer;
AnotherService anotherService;
InstanceVar1 iVar1;
InstanceVar2 iVar2;
...

这个类使用了一个接口(interface)(类外部):

interface TransformerStrategy {
public FooRequest transform(FooResponse response);
}

传入此方法(在 FooService 类中):

private FooResponse getResponse(FooResponse fooResponse, TransformerStrategy transformerStrategy) {
FooRequest fooRequest = transformerStrategy.transform();
fooResponse = anotherService.bar(fooRequest);
return fooResponse;
}

入口点在这里,它使用 getResponse() 方法并匿名创建一个 TransformerStrategy:

public List<Foo> getFooForSomeFlow1(Param1 param1, Param2 param2, ...){
FooResponse fooResponse = anotherService.baz(fooRequest);

TransformerStrategy myTransformerStrategy = new TransformerStrategy() {
public FooRequest transform(FooResponse fooResponse) {
fooRequestTransformer.transform(param1, param2, iVar1, iVar2)
}
}

FooResponse fooResponse = getResponse(fooResponse, myTransformerStrategy);
...//other code
}

现在的问题是:有 几个 方法,例如 getFooForSomeFlow1()(在 FooService 内),它们都有自己的匿名实现 TransformerStrategy 然后调用 getResponse()。正如您所想象的,这非常困惑,并且在您调试时会造成混淆(即您正在进入 getResponse() 然后突然又回到了 getFooForSomeFlow1())

可能的解决方案

(想到的)一个可能的解决方案是将这些不同的策略组织到一个“Provider”类中,以某种方式将它们组合在一起。奇怪的是,这个类已经包含这种类型的Provider类:

protected class StrategyProvider {
public ABCTransformerStrategy newABCTransformerStrategy(FooRequestTransformer transformer, Param1 param1, Param2 param2) {
return new ABCTransformerStrategy(transformer, param1, param2);
}
}

protected class ABCTransformerStategy implements TransformerStrategy {
protected FooRequestTransformer transformer;
protected Param1 param1;
protected Param2 param2;

//...constructor here

//...overridden transform method as above
}

在其中一条评论中说,“出于测试目的将匿名类转换为内部类”。然而,他们只转化了其中的一个,其余的都留下了。所以就好像他们开始了重构过程并在中间停止了。

所以,我想我可以完成重构的过程,将所有匿名类移动到内部类,然后最终将这些类和StrategyProvider 移动到外部类中。问题是“将匿名转换为内部”增加了更多样板(请参阅上面的 ABCTransformerStrategy;我必须将所有数据传递给构造函数)而且我不确定我获得了多少通过执行此重构过程。

我有两个问题:

  1. 我应该继续使用这种方法吗?
  2. 或者是否有另一种我可以应用的设计模式更合适并且真正简化了这段代码?

谢谢

最佳答案

根据您提供的代码示例,它表面上很复杂。为什么不简单地

public List<Foo> getFooForSomeFlow1(Param1 param1, Param2 param2, ...)
{
FooResponse fooResponse = anotherService.baz(fooRequest);

FooRequest fooRequest = fooRequestTransformer
.transform(param1, param2, iVar1, iVar2);

FooResponse fooResponse2 = anotherService.bar(fooRequest);
...//other code
}

除非您还没有向我们展示其他内容。

关于java - 如何重构使用 "Strategies"的大类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15257926/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com