2009-10-03 4 views
0

특정 순서의 지정이 약간 다른 순서로 발생한다는 것을 제외하고는 동일한 코드가 있습니다.리팩토링에 대한 도움말 : 매개 변수 객체 소개?

주문을 나타내는 int[] 유형의 메소드 매개 변수로 쉽게 분해 할 수 있습니다.

그러나 가장 명확하지는 않습니다.

또 다른 옵션은 유형을 AssignmentOrders의 개체로 분해하는 것입니다. 배열을 사용하여 수행 할 수 없었던 객체 생성자의 값에 대한 유효성 검사를 수행 할 수도 있습니다. 이것은 책에서 "매개 변수 개체 소개"리팩토링 리 팩터링 것입니다.

이 특정 리팩토링이 잔인한 것이라면 궁금합니다. int[]을 고수해야합니까?

코드 : 원본의

3 개의 시료 :

나는 이것으로 3 위를 리팩토링 한 방법
private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections) 
      throws Exception { 
     String[] sections = line.split(deliminator); 

     String value1 = sections[0].trim(); 
     String value2 = sections[1].trim(); 
     String value3 = sections[4].trim(); 
     String value4 = sections[2].trim(); 
     String value5 = sections[3].trim(); 

     //........ 
    } 

private static PersonDetails parseLine(String line, String deliminator) 
      throws Exception { 
     String[] sections = line.split(deliminator); 

     String value1 = sections[1].trim(); 
     String value2 = sections[0].trim(); 
     String value3 = sections[2].trim(); 
     String value4 = sections[3].trim(); 
     String value5 = sections[4].trim(); 

     //........ 
    } 

private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections) 


     throws Exception { 
     String[] sections = line.split(deliminator); 

     String value1 = sections[0].trim(); 
     String value2 = sections[1].trim(); 
     String value3 = sections[2].trim(); 
     String value4 = sections[4].trim(); 
     String value5 = sections[5].trim(); 

     //........ 
    } 

: 나는 이론적 매개 변수로 리팩토링 수있는 방법

private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections) 
      throws Exception { 
     String[] sections = line.split(deliminator); 

     String value1 = sections[orderOfSections[0]].trim(); 
     String value2 = sections[orderOfSections[1]].trim(); 
     String value3 = sections[orderOfSections[2]].trim(); 
     String value4 = sections[orderOfSections[3]].trim(); 
     String value5 = sections[orderOfSections[4]].trim(); 

     //........ 
    } 

대상 :

private static PersonDetails parseLine(String line, String deliminator, OrderOfSections order) 
     throws Exception { 
     String[] sections = line.split(deliminator); 

     String value1 = sections[order.getValue1Idx].trim(); 
     String value2 = sections[order.getValue2Idx].trim(); 
     String value3 = sections[order.getValue3Idx].trim(); 
     String value4 = sections[order.getValue4Idx].trim(); 
     String value5 = sections[order.getValue5Idx].trim(); 

     //........ 
    } 

내가 생각한 것은 int[]을 사용하는 대신 특정 클래스를 만드는 것이 었습니다.하지만 과장 될지는 궁금했습니다.

장점은 더 읽기 쉬울 것입니다. orderOfSections[0] 대신 orderOfSections.value1SectionIdx이 될 수도 있습니다. 클래스에 유효성 검사 코드를 추가 할 수도 있습니다.

필자는 Martin Fowler가 Introducing a Parameter Object라고 생각합니다.

편집 :

또 다른 옵션은 사전을 사용하는 것입니다. 새로운 클래스보다 가벼우면서도 더 설명하기 ... 그렇다면 orderOfSections["value1"]

+0

리팩터링하려는 코드를 게시해야합니다. 그렇지 않으면 도움을 드릴 수 없습니다. –

+1

Ok ok ok 나는 이미 그것을 연구 중이다! –

+2

http://refactormycode.com/에서 시도하는 것이 좋습니다. – Noldorin

답변

6

. 그것은 다음을 수행하는 것이 훨씬 더 읽을 것 :

결국
private static PersonDetails parseLine(String line, String deliminator, 
         SectionsReader reader) throws Exception 
{ 
    reader.setLine(line); 
    String value1 = reader.getValue1(); 
    String value2 = reader.getValue2(); 
    String value3 = reader.getValue3(); 
    String value4 = reader.getValue4(); 
    String value5 = reader.getValue5(); 

    //........ 
} 

,이 과잉되지 않을 것, 그리고 당신이 코드로 되돌아 갈 때 3개월 '시간에 자신을 감사하고 더 이해할 수 발견 할 것이다 .

+0

우, 아주 좋은, 고마워. 이 코드는 가독성을 높이고 유지 보수성을 높이기 위해 리팩토링 될 수 있음을 알고있었습니다. 고맙습니다. –

1

IMHO와 같이 사용할 수 있습니다. 가장 간단하고 가장 읽기 쉬운 방법은 int 배열 대신 맵을 전달하는 것입니다.

PersonDetails의 필드가 어떤 모양인지에 따라 리플렉션을 사용하여 루프의 값을 할당 할 수도 있습니다. 대신 단순히 원시 String에있는 항목의 순서를 표시하고 할당되는 방법, 나는이 Class에 입력 line의 분석을 위임 할 것 Class 또는 배열 전달의

+0

에 제출하고 싶다. 내 목적에 가장 적합하다고 생각한다. –