TLDR; 내 DailyRecordDataManager 클래스에 코드 냄새가 있습니까? '신 클래스'인가요? 구조를 개선하려면 어떻게해야합니까?
안녕,
저는 Spring과 함께 첫 번째 프로젝트를 진행하고 있습니다. 마드리드 (내가 살고있는) 정부 웹 사이트에서 코로나 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 개체는 특정 날짜 및 특정 지방 자치구에 대한 사례 및 감염률에 대한 기록입니다.
데이터를 가져온 후 프로그램은 데이터를 구문 분석하고, 필터링하고, 일부 속성을 트리밍 / 반올림하고, 지역별로 매핑하고,이를 사용하여 각 지역 (DistrictData)에 대한 개체를 만들고, 지역 DistrictData 개체를 MonoDB 인스턴스에 씁니다.
현재 단일 책임 원칙에 따라 프로세스의 각 단계를 별도의 클래스로 나누었습니다. 링크 된 스크린 샷에서 볼 수 있듯이 :
내 문제는 이러한 여러 클래스를 함께 연결하는 방법을 모른다는 것입니다.
현재 저는 신 클래스와 같은 냄새가 나는 매니저 클래스가 있습니다.
@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;
}
}
또한 Injected Dependencies의 체인에서 관련된 모든 클래스를 함께 연결하는 것에 대해 생각했습니다 .-> 각 클래스는 프로세스의 다음 클래스를 종속성으로 갖고 데이터에 문제가없는 경우 체인의 다음 클래스를 호출합니다. 때가됐다.
그러나 나는 또한 내가 가진 문제를 해결하는 디자인 패턴이 있어야한다고 생각합니다!
감사!