카테고리 없음

[이런] 객체 지향 디자인

행복을전해요 2020. 12. 15. 15:47

나는 이것을 시도했다. 내가 생각하는 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가 도와 줄 수있는 한 가지) 코드에서 자연스럽게 디자인 패턴이 나타나는 것을 볼 수 있습니다.

귀하의 질문을 읽는 몇 번의 패스에서 생각할 수있는 몇 가지 변경 이유는 다음과 같습니다.

  1. 데이터 파일 형식 변경 / 열 추가
  2. 더 나은 일치 알고리즘을 찾거나 "이제 휴대폰 번호도 필터링하고 싶습니다."
  3. xml / yaml / etc 파일과 일치하도록 요청받습니다.
  4. 새 형식 / 위치에 저장하라는 메시지가 표시됩니다.

좋아, 그래서 이들 중 하나를 구현하면 어딘가에 "if 문"을 추가해야하는 경우 공통 인터페이스를 구현하는 하위 클래스에 대한 이음새 일 것입니다.

또한 생성 된 파일을 새 위치에 저장한다고 가정 해 보겠습니다. 이것이 변경해야하는 한 가지 이유이며 병합 전략을 변경해야하는 것과 겹치지 않아야합니다. 이 두 부분이 동일한 클래스에 있으면 해당 클래스는 이제 두 가지 책임을 가지며 이는 단일 책임 원칙 을 위반합니다 .

이것은 매우 간단한 예입니다. 좋은 OO 디자인으로 더 깊이 들어가려면 SOLID 원칙을 확인하십시오 . 그것들을 배우고 추구하는 것이 잘못 될 수 없으며 OO 디자인 전체에 신중하게 적용하십시오.



출처
https://stackoverflow.com/questions/7415139