카테고리 없음

Java / Spring-> 동일한 프로세스에 관련된 여러 클래스 간의 관계를 구조화 (디자인 패턴)하는 방법

기록만이살길 2021. 2. 25. 04:32
반응형

Java / Spring-> 동일한 프로세스에 관련된 여러 클래스 간의 관계를 구조화 (디자인 패턴)하는 방법

1. 질문(문제점):

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의 체인에서 관련된 모든 클래스를 함께 연결하는 것에 대해 생각했습니다 .-> 각 클래스는 프로세스의 다음 클래스를 종속성으로 갖고 데이터에 문제가없는 경우 체인의 다음 클래스를 호출합니다. 때가됐다.

그러나 나는 또한 내가 가진 문제를 해결하는 디자인 패턴이 있어야한다고 생각합니다!

감사!

2. 해결방안:

이것을 발견하고 내가 파이프 라인 패턴을 선택하게 된 것이 무엇인지 궁금해하는 사람을 위해 .

사용하던 모든 개별 수업을 하나의 깔끔한 워크 플로로 쉽게 구성 할 수있었습니다. 또한 프로세스의 각 단계를 테스트하기가 매우 쉽습니다. 파이프 라인 클래스 자체도 마찬가지입니다!

Java의 패턴에 관심이있는 사람 에게이 기사 를 확인하는 것이 좋습니다 .

65796718
반응형