Link

<aside> 👉🏼 :

避免过度设计

过度设计通常体现在以下几个方面:

1. 过多的抽象

症状: 过多的接口和抽象类,导致理解和维护变得复杂。

建议: 保持代码的简洁和清晰,避免不必要的抽象。如果某个类或接口在短期内不太可能被重用或扩展,可以考虑简化设计。

2. 提前优化

症状: 为未来可能遇到的问题做过多的设计和优化,导致代码复杂度增加。

建议: 遵循YAGNI(You Ain't Gonna Need It)原则,只为当前的需求编写代码。等到实际需要时再进行优化和扩展。

3. 过度使用设计模式

症状: 为了使用设计模式而使用设计模式,而不是解决实际问题。

建议: 设计模式是解决常见问题的工具,不是目标。确保每个设计模式的使用都有明确的目的,并且简化代码结构。

针对你代码的具体建议

  1. 简化设计:
  2. 代码可读性:
  3. 实际需求驱动:

总结

总的来说,你的代码设计是合理且清晰的,没有明显的过度设计问题。保持对设计模式的理解和实际应用,继续关注代码的简洁性和可维护性,你的代码质量会不断提升。如果你发现某些部分变得过于复杂,可以回头看看是否有简化的空间,并根据实际需求进行调整。

</aside>


模板方法模式+策略模式

classDiagram
    class AbstractModelSplitterTemplate~T~ {
        <<abstract>>
        - JobRepository jobRepository
        - SplitConfigProvider~T~ splitConfigProvider
        - BizTypeEnum bizTypeEnum
        + doSplit(T modelSplitParam)
        + setSplitConfigProvider(SplitConfigProvider~T~ splitConfigProvider)
        # getJobParam(T modelSplitParam) : BaseInputParam
    }

    class RegionModelSplitter {
        + switchSplitConfigProvider(SplitConfigProvider~ModelSplitSaveOrUpdateReqDTO~ newProvider)
    }

    class SplitConfigProvider~T~ {
        <<interface>>
        + getConfig(T modelSplitParam) : String
    }

    class RegionSplitConfigProvider {
        + getConfig(ModelSplitSaveOrUpdateReqDTO modelSplitParam) : String
    }

    class BlockSplitConfigProvider {
        + getConfig(ModelSplitSaveOrUpdateReqDTO modelSplitParam) : String
    }

    class JobRepository {
    }

    class ModelSplitter~T~ {
        <<interface>>
    }

    class ModelSplitParam {
    }

    class ModelSplitSaveOrUpdateReqDTO {
    }

    class BizTypeEnum {
    }

    AbstractModelSplitterTemplate~T~ --> SplitConfigProvider~T~
    AbstractModelSplitterTemplate~T~ --> JobRepository
    AbstractModelSplitterTemplate~T~ --> BizTypeEnum
    AbstractModelSplitterTemplate~T~ ..|> ModelSplitter~T~
    RegionModelSplitter --> SplitConfigProvider~ModelSplitSaveOrUpdateReqDTO~
    RegionModelSplitter --> ModelSplitSaveOrUpdateReqDTO
    SplitConfigProvider~T~ <|.. RegionSplitConfigProvider
    SplitConfigProvider~T~ <|.. BlockSplitConfigProvider
    RegionModelSplitter ..|> AbstractModelSplitterTemplate~ModelSplitSaveOrUpdateReqDTO~
    ModelSplitter~T~ --> ModelSplitParam

// Abstract Model Splitter Template Class
@RequiredArgsConstructor
public abstract class AbstractModelSplitterTemplate<T extends ModelSplitParam> implements ModelSplitter<T> {

    protected final JobRepository jobRepository;
    protected SplitConfigProvider<T> splitConfigProvider;
    protected final BizTypeEnum bizTypeEnum;

    @Override
    public void doSplit(T modelSplitParam) {
        BaseInputParam jobParam = getJobParam(modelSplitParam);
        jobRepository.createJob(
                modelSplitParam.getTargetId(),
                bizTypeEnum,
                jobParam);
    }

    protected BaseInputParam getJobParam(T modelSplitParam) {
        BaseInputParam jobParam = new BaseInputParam();
        jobParam.setAppId(RequestContextUtil.getAppId());
        jobParam.setMainProjectId(HeadTool.getPortalId());
        jobParam.setProjectId(modelSplitParam.getProjectId());
        jobParam.setTenantId(modelSplitParam.getTenantId());
        jobParam.setExtParam(splitConfigProvider.getConfig(modelSplitParam));
        return jobParam;
    }

    public void setSplitConfigProvider(SplitConfigProvider<T> splitConfigProvider) {
        this.splitConfigProvider = splitConfigProvider;
    }
}

// Region Model Splitter Class
@Service
public class RegionModelSplitter extends AbstractModelSplitterTemplate<ModelSplitSaveOrUpdateReqDTO> {

    public RegionModelSplitter(JobRepository jobRepository, RegionSplitConfigProvider splitConfigProvider) {
        super(jobRepository, splitConfigProvider, BizTypeEnum.REGION_SPLIT);
    }

    // Method to switch Split Config Provider
    public void switchSplitConfigProvider(SplitConfigProvider<ModelSplitSaveOrUpdateReqDTO> newProvider) {
        setSplitConfigProvider(newProvider);
    }
}

// SplitConfigProvider Interface
public interface SplitConfigProvider<T extends ModelSplitParam> {
    String getConfig(T modelSplitParam);
}

// Region Split Config Provider Implementation
public class RegionSplitConfigProvider implements SplitConfigProvider<ModelSplitSaveOrUpdateReqDTO> {
    @Override
    public String getConfig(ModelSplitSaveOrUpdateReqDTO modelSplitParam) {
        return "RegionConfig";
    }
}

// Block Split Config Provider Implementation
public class BlockSplitConfigProvider implements SplitConfigProvider<ModelSplitSaveOrUpdateReqDTO> {
    @Override
    public String getConfig(ModelSplitSaveOrUpdateReqDTO modelSplitParam) {
        return "BlockConfig";
    }
}