1

주어진 도메인에서 유사한 개체 또는 구조를 나타내는 여러 파일 형식이있을 수 있습니다. 예를 들어, (지리적 포인트의 순서를 의미) 유형 Track의 목적은 등이클래스에 각 파일 형식에 대한 메서드가 있어야합니까? 아니면 I/O를 다른 파일 형식 별 클래스에 위임해야합니까?

그래서, 내 수업 Track를 읽고 저장하도록되어, .GPX, .KML, GeoJSON, WKT, shape 파일에 저장할 수 있습니다 그 다른 형식의 파일 일 수 있습니다.

질문은 다음과 같습니다

내 클래스는 각각의 파일 형식에서 읽을 수있는 방법 (즉, 그들 "에 대해 알고"이다), 또는 각 클래스에 로직을 포함 할 곳은, 다른 클래스를 사용해야 구현해야합니다 각 파일 유형의 구현 세부 정보와 상호 작용할 수 있습니까? 표준 관행은 무엇입니까?

첫 번째 옵션은 다음과 같이 구분된다 :

trackCollection.Add(Track.loadFromGPX(gpx_fname)) 
trackCollection.Add(Track.loadfromKML(kml_fname)) 
# ...and so on with other filetypes 

두 번째 옵션이 아마 것 동안 :

trackCollection.Add(GpxReader.getTrack(gpx_fname)) 
trackCollection.Add(KmlReader.getTrack(kml_fname)) 

그것은 나에게 보인다 싱글 Responsibility는 원칙을 포함하는 몇 가지 특성 정보 숨어서 클래스 간의 상호 의존성은 다른 접근법보다 한 접근법을 더 좋게 만들지 만, 어느 것이 있는지 파악하기에는 충분한 경험이 없습니다.

답변

2

각 파일 유형을 완전히 다른 라이브러리 및 논리로 파싱해야 할 수도 있으므로 두 번째 방법 (별도의 클래스)을 선호합니다.

많은 코드를 공유 할 다른 데이터 유형 또는 메소드로 인수를 지원하는 데 "loadFromXXX"메소드 만 사용합니다. 예를 들어, C++에서는 loadFromFile(std::ifstream& input)loadFromString(std::string& str) 일 수 있습니다. loadFromFile()은 파일을 문자열로 구문 분석하고 결국 loadFromString을 호출하거나 파일을 한 줄씩 구문 분석하고 loadFromString에서 사용 된 일부 구문 분석 함수를 공유 할 수 있습니다.

어쨌든 나열된 파일 형식의 공통점이 거의없고 KML과 GeoJSON과 같은 일부 파일은 완전히 다른 파서가 필요합니다. 결과적으로 각 파일 유형에 대해 별도의 "독자"또는 "파서"클래스가 있어야합니다. 그렇지 않으면 당신은 bloating 클래스 Track이며 매우 낮은 응집력을 갖습니다. 관심사를 분리하면 파싱을 다른 클래스로 분리하는 것이 좋습니다.

관련 문제