当前位置: 首页 > 知识库问答 >
问题:

无法将类拆分为较小的类

庄元龙
2023-03-14

我很难把我的课分成更小的部分。我们的情况很糟糕,一个Dto持有30个不同的Dto。现在我们需要这个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;
}

//我的私有函数的示例,它调用相应的映射器,其中我所有的私有函数都由不同类型的类组成,例如这里的OptionCodeDto。它们不从同一个接口/类扩展,也不能。

java prettyprint-override"> 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);
    }

共有3个答案

周宏伯
2023-03-14

有2个解决方案

1.通过所有作为1参数:

假设您在1个构造函数中传递30个参数(它们是DTO),然后生成一个主DTO,其中包含所有30个DTO,并将该DTO作为一个参数传递。

例如:

public class MasterDTO{

private ChildDto1 childDto1 ;
private ChildDto2 childDto2 ;
private ChildDto3 childDto3 ;
...
..
private ChildDto30 childDto30 ;
//public getter setter methds
}

通过30 DTOS的呼叫者等级

public class Caller{
  Functional fun = new Functional(masterDTO);

}

期望值为 30 DTOS 的功能类

class Functional{
  private ChildDto1 childDto1 ;
  private ChildDto2 childDto2 ;
  private ChildDto3 childDto3 ;
...
...

public Functional(MasterDTO masterDTO){
childDto1 = masterDTO.getChildDto1();
childDto2 = masterDTO.getChildDto2();
childDto3 = masterDTO.getChildDto3();

...
...

childDto30 = masterDTO.getChildDto30();
}

}

2. 使用设置器方法:

只传递7个元素作为构造函数的参数,然后使用对象和调用setter方法设置其余23个元素。

通过30 DTOS的呼叫者等级

public class Caller{
  Functional fun = new Functional(childDto1 ,childDto1 , ....childDto7 );
  fun.setChildDto8(childDtoValue8);
  fun.setChildDto9(childDtoValue9);
  fun.setChildDto10(childDtoValue10);
  ...
  ...
  fun.setChildDto30(childDtoValue30);


}
茅曾琪
2023-03-14

创建已分配的接口选择提供程序

interface AssignedSelectProvider
{
    List<AssignedSelect> getAssignedSelects();
}

每个映射器实现接口,每个私有方法移动到相关的类:

class AssignedOpDtoMapper implements AssignedSelectProvider
{
    public List<AssignedSelect> getAssignedSelects()
    {
        return mapOps(getOps());
    }
}

分配选择映射器获取构造函数中的提供程序列表,而不是 26 个参数:

class AssignedSelectMapper
{
    AssignedSelectMapper(List<AssignedSelectProvider> mappers)
    {
        //...
    }
}

26个参数减少到1个。

伯丁雷
2023-03-14

这就像是@Michaels答案的扩展。

界面的想法是个好主意。尽管在我看来,界面可以更改为更适合您的用例:

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));
}

然后将所有这些< code >处理器注入到主类中:

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;
}
 类似资料:
  • 问题内容: 我需要将整个表从一个MySQL数据库移动到另一个数据库。我没有完全访问第二个权限,只有phpMyAdmin访问权限。我只能上传(压缩)小于2MB的sql文件。但是,第一个数据库表的mysqldump的压缩输出大于10MB。 有没有办法将mysqldump的输出分成较小的文件?我无法使用split(1),因为无法将文件分类(1)到远程服务器上。 还是我错过了其他解决方案? 编辑 第一个发

  • 问题内容: 我有一个非常大的WAV文件,大小约为100MB。我想使用Java读取此wav文件,并每隔2秒钟音频将其拆分成较小的块。 用Java可以做到吗?您能否建议我一个我可以实现的API? 预先感谢,Snehal 问题答案: 您可以使用AudioInputStream及其AudioFileFormat成员(包含AudioFormat实例)来知道要写的内容(格式,采样率),也可以使用AudioSy

  • 问题内容: 我有一个电子邮件数组(可以是1封电子邮件,也可以是100封电子邮件),我需要用ajax请求发送该数组(我知道该怎么做),但是我只能发送一个包含以下内容的数组不超过10封电子邮件。因此,如果原始阵列中包含20封电子邮件,我将需要将其拆分为2个阵列,每组10个。或者,如果原始数组中有15封电子邮件,那么1数组中的10封电子邮件,以及另一个数组中的5封电子邮件。我使用的是jQuery,哪种方

  • 除了这个用例,流还有很多问题 我有一个巨大的对象流

  • 如何使用流将Java列表拆分为Java大小为的较小列表? 在JavaScript中,我会使用函数并执行如下操作: 我试图用Java流来实现这一点,但我似乎不知道如何让它允许我使用数组列表

  • 找不到大小注释,我得到大小不能解析为类型。虽然添加了导入javax.validation.constraints.大小;,但我得到了这个错误。 导入javax。验证。限制。大小 导入lombok.数据; @data公共类UserCreateDTO{@size私有字符串firstName;私有字符串lastName; } 我在POM的依赖性。xml是: