Java/Spring -> 如何构建(设计模式)涉及同一进程的多个类之间的关系
Java/Spring -> how to structure (Design Pattern) the relationship between multiple classes involved in the same process
TLDR;
我的 DailyRecordDataManager class 有代码味道吗?是 'God Class' 吗?以及如何改进结构?
嗨,
我正在与 Spring 合作我的第一个项目。它将从马德里(我居住的地方)政府网站获取 covid-19 数据,按地区组织,并通过 API.
提供服务
这是我正在使用的 JSON 数据的示例。
{
"codigo_geometria": "079603",
"municipio_distrito": "Madrid-Retiro",
"tasa_incidencia_acumulada_ultimos_14dias": 23.4668991007149,
"tasa_incidencia_acumulada_total": 1417.23308497532,
"casos_confirmados_totales": 1691,
"casos_confirmados_ultimos_14dias": 28,
"fecha_informe": "2020/07/01 09:00:00"
}
每个JSON对象是一个特定日期和特定市辖区的病例和感染率的记录。
程序获取数据后:解析它,过滤它,trims/rounds一些属性,按地区映射它,用它为每个地区创建一个对象(DistrictData),并写入地区 DistrictData 对象到 MonoDB 实例。
目前,根据单一职责原则,我已将流程中的每个步骤分开 classes。如 linked 截图所示:
screenshot of intellij package structure
我的问题是我不知道如何 link 这些多个 class 在一起。
目前我有一个经理 class 对我来说有点像上帝 Class:
@Service
public class DailyRecordDataManager implements DataManager {
private final Logger logger = LoggerFactory.getLogger(DailyRecordDataManager.class);
private final DailyRecordDataCollector<String> dataCollector;
private final DataVerifier<String> dataVerifier;
private final JsonParser<DailyRecord> dataParser;
private final DataFilter<List<DailyRecord>> dataFilter;
private final DataTrimmer<List<DailyRecord>> dataTrimmer;
private final DataSorter<List<DailyRecord>> dataSorter;
private final DataMapper<List<DailyRecord>> dataMapper;
private final DataTransformer dataTransformer;
private final DistrictDataService districtDataService;
public DailyRecordDataManager(DailyRecordDataCollector<String> collector,
DataVerifier<String> verifier,
JsonParser<DailyRecord> parser,
DataFilter<List<DailyRecord>> dataFilter,
DataTrimmer<List<DailyRecord>> dataTrimmer,
DataSorter<List<DailyRecord>> dataSorter,
DataMapper dataMapper,
DataTransformer dataConverter,
DistrictDataService districtDataService) {
this.dataCollector = collector;
this.dataVerifier = verifier;
this.dataParser = parser;
this.dataFilter = dataFilter;
this.dataTrimmer = dataTrimmer;
this.dataSorter = dataSorter;
this.dataMapper = dataMapper;
this.dataTransformer = dataConverter;
this.districtDataService = districtDataService;
}
@Override
public boolean newData() {
String data = dataCollector.collectData();
if (!dataVerifier.verifyData(data)) {
logger.debug("Data is not new.");
return false;
}
List<DailyRecord> parsedData = dataParser.parse(data);
if (parsedData.size() == 0) {
return false;
}
List<DailyRecord> filteredData = dataFilter.filter(parsedData);
List<DailyRecord> trimmedData = dataTrimmer.trim(filteredData);
List<DailyRecord> sortedData = dataSorter.sort(trimmedData);
Map<String, List<DailyRecord>> mappedData = dataMapper.map(sortedData);
List<DistrictData> convertedData = dataTransformer.transform(mappedData);
districtDataService.save(convertedData);
return true;
}
}
我还考虑过 link 将所有涉及的 class 整合到一个注入依赖链中 -> 所以每个 class 都有下一个 class作为依赖项的过程,如果数据没有任何问题,则在时间到了时调用链中的下一个 class。
不过我也觉得一定有一种设计模式可以解决我遇到的问题!
谢谢!
对于发现此内容并想知道我最终选择了什么的人 Pipeline pattern。
它让我可以轻松地将我使用的所有个人 classes 组织到一个干净的工作流程中。它还使过程的每个阶段都非常容易测试。以及管道 class 本身!
我强烈建议任何对 Java 中的模式感兴趣的人查看我广泛使用的 this article。
TLDR; 我的 DailyRecordDataManager class 有代码味道吗?是 'God Class' 吗?以及如何改进结构?
嗨,
我正在与 Spring 合作我的第一个项目。它将从马德里(我居住的地方)政府网站获取 covid-19 数据,按地区组织,并通过 API.
提供服务这是我正在使用的 JSON 数据的示例。
{
"codigo_geometria": "079603",
"municipio_distrito": "Madrid-Retiro",
"tasa_incidencia_acumulada_ultimos_14dias": 23.4668991007149,
"tasa_incidencia_acumulada_total": 1417.23308497532,
"casos_confirmados_totales": 1691,
"casos_confirmados_ultimos_14dias": 28,
"fecha_informe": "2020/07/01 09:00:00"
}
每个JSON对象是一个特定日期和特定市辖区的病例和感染率的记录。
程序获取数据后:解析它,过滤它,trims/rounds一些属性,按地区映射它,用它为每个地区创建一个对象(DistrictData),并写入地区 DistrictData 对象到 MonoDB 实例。
目前,根据单一职责原则,我已将流程中的每个步骤分开 classes。如 linked 截图所示:
screenshot of intellij package structure
我的问题是我不知道如何 link 这些多个 class 在一起。
目前我有一个经理 class 对我来说有点像上帝 Class:
@Service
public class DailyRecordDataManager implements DataManager {
private final Logger logger = LoggerFactory.getLogger(DailyRecordDataManager.class);
private final DailyRecordDataCollector<String> dataCollector;
private final DataVerifier<String> dataVerifier;
private final JsonParser<DailyRecord> dataParser;
private final DataFilter<List<DailyRecord>> dataFilter;
private final DataTrimmer<List<DailyRecord>> dataTrimmer;
private final DataSorter<List<DailyRecord>> dataSorter;
private final DataMapper<List<DailyRecord>> dataMapper;
private final DataTransformer dataTransformer;
private final DistrictDataService districtDataService;
public DailyRecordDataManager(DailyRecordDataCollector<String> collector,
DataVerifier<String> verifier,
JsonParser<DailyRecord> parser,
DataFilter<List<DailyRecord>> dataFilter,
DataTrimmer<List<DailyRecord>> dataTrimmer,
DataSorter<List<DailyRecord>> dataSorter,
DataMapper dataMapper,
DataTransformer dataConverter,
DistrictDataService districtDataService) {
this.dataCollector = collector;
this.dataVerifier = verifier;
this.dataParser = parser;
this.dataFilter = dataFilter;
this.dataTrimmer = dataTrimmer;
this.dataSorter = dataSorter;
this.dataMapper = dataMapper;
this.dataTransformer = dataConverter;
this.districtDataService = districtDataService;
}
@Override
public boolean newData() {
String data = dataCollector.collectData();
if (!dataVerifier.verifyData(data)) {
logger.debug("Data is not new.");
return false;
}
List<DailyRecord> parsedData = dataParser.parse(data);
if (parsedData.size() == 0) {
return false;
}
List<DailyRecord> filteredData = dataFilter.filter(parsedData);
List<DailyRecord> trimmedData = dataTrimmer.trim(filteredData);
List<DailyRecord> sortedData = dataSorter.sort(trimmedData);
Map<String, List<DailyRecord>> mappedData = dataMapper.map(sortedData);
List<DistrictData> convertedData = dataTransformer.transform(mappedData);
districtDataService.save(convertedData);
return true;
}
}
我还考虑过 link 将所有涉及的 class 整合到一个注入依赖链中 -> 所以每个 class 都有下一个 class作为依赖项的过程,如果数据没有任何问题,则在时间到了时调用链中的下一个 class。
不过我也觉得一定有一种设计模式可以解决我遇到的问题!
谢谢!
对于发现此内容并想知道我最终选择了什么的人 Pipeline pattern。
它让我可以轻松地将我使用的所有个人 classes 组织到一个干净的工作流程中。它还使过程的每个阶段都非常容易测试。以及管道 class 本身!
我强烈建议任何对 Java 中的模式感兴趣的人查看我广泛使用的 this article。