[이런] 객체 지향 디자인
나는 이것을 시도했다. 내가 생각하는 OO 원칙이나 디자인 패턴에 관해서는 MatchingAlgorithm (필요한 경우 전략 및 템플릿)에 대한 구성을 사용하는 것을 제외하고는 할 수있는 일이 많지 않습니다. 내가 요리 한 내용은 다음과 같습니다.
class Mapper {
map(String fileA, String fileB, String fileC) {
RecordsList a = new RecordsList(fileA);
RecordsList b = new RecordsList(fileB);
MatchingRecordsList c = new MatchingRecordsList();
for(Record rb : b) {
int highestPerc = -1;
MatchingRecords matchingRec;
for(Record ra : a) {
int perc;
rb.setMatchingAlgorithm(someAlgorithmYouVeDefined);
perc = rb.match(ra);
if(perc > highestPerc) {
matchingRec = new MatchingRecords(rb, ra, perc);
}
}
if(matchingRec != null) {
c.add(matchingRec);
}
}
c.saveToFile(fileC);
}
}
class MatchingAlgorithm {
int match(Record b, Record a) {
int result;
// do your magic
return result;
}
}
class Record {
String Id;
String Name;
String Address;
String City;
String State;
String Zipcode;
MatchingAlgorithm alg;
setMatchingAlgorithm(MatchingAlgorithm alg) {
this.alg = alg;
}
int match(Record r) {
int result; -- perc of match
// do the matching by making use of the algorithm
result = alg.match(this, r);
return result;
}
}
class RecordsList implements List<Record> {
RecordsList(file f) {
//create list by reading from csv-file)
}
}
class MatchingRecords {
Record a;
Record b;
int matchingPerc;
MatchingRecords(Record a, Record b, int perc) {
this.a = a;
this.b = b;
this.matchingPerc = perc;
}
}
class MatchingRecordsList {
add(MatchingRecords mr) {
//add
}
saveToFile(file x) {
//save to file
}
}
(이것은 Notepad ++로 작성되었으므로 오타 등이있을 수 있습니다. 또한 제안 된 클래스는 확실히 약간의 리팩토링을 통해 이점을 얻을 수 있지만이 레이아웃을 사용하기로 선택한 경우에는 그대로 두겠습니다.)
-------------------재미있게도 저는 지금 거의 이와 같은 프로젝트를 진행하고 있습니다.
쉬운 답변 : 우선, 메서드가 한동안 잘못된 클래스에 있으면 세상의 끝이 아닙니다! 수업이 모두 테스트로 덮여 있다면 기능이 중요한 곳 이지만 도메인의 왕이 적합하다고 판단되면 유동적으로 변경할 수 있습니다.
당신이 이것을 테스트 하지 않는다면 , 그것이 나의 첫 번째 제안이 될 것입니다. 저보다 똑똑한 많은 사람들이 TDD와 테스트가 어떻게 여러분의 수업을 최고의 디자인으로 자연스럽게 이끌어 줄 수 있는지에 대해 언급했습니다.
더 긴 답변 : 디자인에 적용 할 패턴을 찾는 것보다 다음 과 같이 생각하고 싶습니다. 각 클래스가 변경해야하는 이유는 무엇입니까? 이러한 이유를 서로 분리하면 (TDD가 도와 줄 수있는 한 가지) 코드에서 자연스럽게 디자인 패턴이 나타나는 것을 볼 수 있습니다.
귀하의 질문을 읽는 몇 번의 패스에서 생각할 수있는 몇 가지 변경 이유는 다음과 같습니다.
- 데이터 파일 형식 변경 / 열 추가
- 더 나은 일치 알고리즘을 찾거나 "이제 휴대폰 번호도 필터링하고 싶습니다."
- xml / yaml / etc 파일과 일치하도록 요청받습니다.
- 새 형식 / 위치에 저장하라는 메시지가 표시됩니다.
좋아, 그래서 이들 중 하나를 구현하면 어딘가에 "if 문"을 추가해야하는 경우 공통 인터페이스를 구현하는 하위 클래스에 대한 이음새 일 것입니다.
또한 생성 된 파일을 새 위치에 저장한다고 가정 해 보겠습니다. 이것이 변경해야하는 한 가지 이유이며 병합 전략을 변경해야하는 것과 겹치지 않아야합니다. 이 두 부분이 동일한 클래스에 있으면 해당 클래스는 이제 두 가지 책임을 가지며 이는 단일 책임 원칙 을 위반합니다 .
이것은 매우 간단한 예입니다. 좋은 OO 디자인으로 더 깊이 들어가려면 SOLID 원칙을 확인하십시오 . 그것들을 배우고 추구하는 것이 잘못 될 수 없으며 OO 디자인 전체에 신중하게 적용하십시오.
출처
https://stackoverflow.com/questions/7415139