【发布时间】:2018-07-30 17:38:00
【问题描述】:
我有一个非常简单的界面来管理业务提案的更新,特别是在每晚的批处理过程中,每条记录都在这里提交(但它可能用于其他场景)。 此接口在 EJB 2.0 Bean 内部使用,它获取记录并“循环”它们。 注意名字是从意大利语翻译成英语的,所以请原谅可能的错误。我还简化了一些概念。
public interface ProposalUpdateService {
void updateProposal(final ProposalFirstType proposal);
void updateProposal(final ProposalSecondType proposal);
}
这个接口的实现有相当多的依赖:
public class ProposalUpdateDefaultService implements ProposalUpdateService {
private final ComplexService complexService;
private final OtherComplexService otherComplexService;
private final ProposalStep<Proposal> stepOne;
private final ProposalStep<Proposal> stepTwo;
private final ProposalStep<ProposalTypeTwo> stepThree;
private final ProposalStep<Proposal> stepFour;
public ProposalUpdateDefaultService(
final ComplexService complexService,
final OtherComplexService otherComplexService,
final YetAnotherComplexService yetAnotherComplexService,
final SimpleService simpleService,
final OtherSimpleService otherSimpleService,
final YetAnotherSimpleService yetAnotherSimpleService,
final Converter<ProposalTypeOne, ComplexServiceType> converterProposalTypeOne,
final Converter<ProposalTypeTwo, OtherComplexServiceType> converterProposalTypeTwo) {
this.complexService = complexService;
this.otherComplexService = otherComplexService;
stepOne = new StepOne(yetAnotherComplexService);
stepTwo =
new StepTwo(
complexService,
otherComplexService,
yetAnotherComplexService,
converterProposalTypeOne,
converterProposalTypeTwo);
stepThree =
new StepThree(
simpleService,
otherSimpleService,
yetAnotherSimpleService);
stepFour = new StepFour();
}
...
如你所见,这个类封装了一个Proposal对象的更新,这个过程分为四个阶段,每个阶段代表一个单一的概念(例如,“这个提案应该过期吗?”或“我应该提前它的状态?”)。这四个阶段在不同类型的Proposal 之间可能会有不同的安排。
这是这两个updateProposal 方法的高度简化实现:
@Override
public void updateProposal(final ProposalTypeOne proposal) {
stepOne.process(proposal);
stepTwo.process(proposal);
if (...) {
stepFour.process(proposal);
}
}
@Override
public void updateProposal(final ProposalTypeTwo proposal) {
stepOne.process(proposal);
stepTwo.process(proposal);
stepThree.process(proposal);
stepFour.process(proposal);
}
两个私有字段
private final ComplexService complexService;
private final OtherComplexService otherComplexService;
用于辅助私有方法。
正如您所见,这个类只是组织和委派工作,但是,它确实依赖于太多其他类。对于某些ProposalStep(s) 也可以这样说。
*Service(s) 在每个步骤中用于从数据库中检索详细信息、更新相关条目等。
您会接受这么多的依赖项吗?
您将如何重构以简化?
我已经阅读了有关 Facade Service 概念作为减少依赖项的一种方式,以及我应该如何将依赖项集群组合在一起,但在这里我真的不明白该怎么做。
我可以将使用它们的Converter(s) 和Service(s) 分组,但无论如何它们会太多。
如果需要其他详细信息,请告诉我。
【问题讨论】:
-
有多种方法可以降低类在责任和依赖方面的复杂性,但在这里您没有提供足够的输入来说明使用依赖项为您提供具体建议的方式。除了这个问题不适合SO。这个更好:codereview.stackexchange.com
-
@davidxxx 我已经尝试过很多次 CodeReview(例如 stackoverflow.com/questions/51340234/…),我发现 SO 是一个更好的地方。让我知道您需要哪种类型的详细信息,我会提供。
-
@davidxxx “这是这两个 updateProposal 方法的高度简化实现” 表示这是假设/存根代码,在代码审查中偏离主题。
-
这很好。你有一个特定的编程问题,你带着一个最小的例子来重现这个问题。只是人们经常将问题重定向到代码审查,在那里他们可能会被关闭。
-
@davidxxx 在这种情况下是错误的。请看A guide to Code Review for Stack Overflow users
标签: java design-patterns