java – 无法将类拆分为更小的类
作者:互联网
将我的班级分成更小的部分我遇到了麻烦.我们有一个糟糕的情况,Dto拥有30个不同的Dtos.现在我们需要这个selectDto的映射,这也迫使我们制作30个不同的映射类. (我们在项目中也使用了mapstruct,这个场景与mapstruct可以处理的不同)
现在我的问题开始了:
我在相应的课程中制作了所有映射.在基础selectDto中,我的构造函数中有26个映射器,这很糟糕:
SonarLint:构造函数有26个参数,大于7个授权参数
我想方法如何分割这种情况,但我找不到办法.有什么建议?
我的构造函数持有26个参数:
AssignedSelectMapper(AssignedOpDtoMapper assignedOpDtoMapper,
AssignedOrderDtoMapper assignedOrderDtoMapper
// many more constructor parameters
) {
this.assignedOptionCodeDtoMapper = assignedOptionCodeDtoMapper;
this.assignedOrderCriteriaDtoMapper = assignedOrderCriteriaDtoMapper;
// all settings
}
我的公共函数映射哪些调用每个映射的私有函数:
public List<AssignedSelect> assignSelectFrom(SelectDto selectDto) {
Objects.requireNonNull(selectionDto, "selectionDto can not be NULL");
List<AssignedSelect> assignedSelects= new ArrayList<>();
assignedSelects.addAll(this.mapOps(selectionDto.getOps()));
assignedSelects.addAll(this.mapOra(selectionDto.getOra()));
assignedSelects.addAll(this.mapOrs(selectionDto.getOrs()));
assignedSelects.addAll(this.mapSs(selectionDto.getSs()));
assignedSelects.addAll(this.mapDels(selectionDto.getDels()));
assignedSelects.addAll(this.mapMs(selectionDto.getMs()));
assignedSelects.addAll(this.mapBrs(selectionDto.getBrs()));
assignedSelects.addAll(this.mapEqs(selectionDto.getEqs()));
assignedSelects.addAll(this.mapPaints(selectionDto.getPaints()));
assignedSelects.addAll(this.mapBas(selectionDto.getBas()));
// more ...
// and more...
return assignedSelects;
}
//我的私有函数的例子,它调用相应的mapper,其中我的所有私有函数都包含不同类的类,如OptionCodeDto.它们不会从相同的接口/类扩展而不能扩展.
private List<AssignedSelectionCriteria> mapOps(List<OptionCodeDto> optionCodeDtos) {
return this.assignedOpDtoMapper.mapCriterias(opDtos);
}
//这里是反向映射.我需要从我的映射返回类型中选择不同类的类
// this is my public function for mapping.
public void assignSelectionTo(SelectionDto selectionDto,
List<AssignedSelectionCriteria> assignedSelectionCriterias) {
setOptionCodes(selectionDto, copyCriterias);
setOrderCriteria(selectionDto, copyCriterias);
// many more
}
这是反向映射私有函数,每个映射类返回不同类型的dto,如OptionCodeDto,其中没有Dto从同一个类扩展.
private void setOptionCodes(SelectionDto selectionDto, List<AssignedSelectionCriteria> assignedSelectionCriterias) {
// this is where I have trouble, each mapping returns different Dto's
List<OptionCodeDto> optionCodeDtos =
this.assignedOptionCodeDtoMapper.mapAssignedCriterias(assignedSelectionCriterias;
selectionDto.setOptionCodes(optionCodeDtos);
}
解决方法:
这就像@Michaels answer的扩展.
带界面的想法是个好主意.虽然在我看来,界面可以更改为更适合您的用例:
interface SelectDtoProcessor {
void process(SelectDto dto,
Consumer<? super Collection<? extends AssignedSelect>> action);
}
现在每个映射器都实现了这个接口:
class AssignedOpDtoMapper implements SelectDtoProcessor {
@Override
public void process(SelectDto dto,
Consumer<? super Collection<? extends AssignedSelect>> action){
List<OptionCodeDto> ops = dto.getOps();
consumer.accept(mapCriterias(ops));
}
然后将所有这些处理器注入到主类中:
private final List<SelectDtoProcessor> processors;
AssignedSelectMapper(List<SelectDtoProcessor> processors) {
this.processors = processors;
}
最后遍历方法中的所有处理器:
public List<AssignedSelect> assignSelectFrom(SelectDto selectDto) {
Objects.requireNonNull(selectionDto, "selectionDto can not be NULL");
List<AssignedSelect> assignedSelects= new ArrayList<>();
for(SelectDtoProcessor processor: processors) {
processor.process(selectDto, assignedSelects::addAll);
}
return assignedSelects;
}
标签:java,sonarlint 来源: https://codeday.me/bug/20190522/1152458.html