2017-10-20 4 views
2

내 코드 에 if/else 문이 있으며 리팩토링을 생각하고 있습니다. 이미 비슷한 질문이 많이 있습니다. this. 가장 좋은 대답은 chain-of-responsibility 패턴이 좋은 선택이라는 것입니다. 그러나 아래는 제 코드의 일부입니다. CoR 패턴을 사용하면 Java 클래스를 70 개 이상 만들고 ArrayList를 만들어 해당 클래스의 인스턴스를 유지합니다. 더 많은 메모리를 소비합니다. 나는 또한 상태 패턴에 대해서도 배웠다. 또한 많은 수업을 만들어야한다.많은 양의 if refactor

단지 알고 싶다면 더 좋은 방법으로 해결할 수 있을까요?

if (urlContent.contains(YLWFX)) { 
    urlContent = urlContent.replace(YLWFX + ":", ""); 
    if (urlContent.startsWith(TRANSMIT)) { 
    mProcess.onTransmit(activity, url); 
    } else if (urlContent.startsWith(TAKEORDER)) { 
    mProcess.onTakeOrder(activity, url); 
    } else if (urlContent.startsWith(GOODS)) { 
    if (urlContent.contains(GOODSMANAGER_MMZL)) { 
     mProcess.onEnterpriseShopManage(activity, url); 
    } else { 
     mProcess.onGoods(activity, url); 
    } 
    } else if (urlContent.startsWith(SUPPLIER)) { 
    mProcess.onSupplier(activity, url); 
    } else if (urlContent.startsWith(POSTS)) { 
    mProcess.onPosts(activity, url); 

    } else if (urlContent.startsWith(TEAM)) { 

    if (urlContent.contains(TEAM_LIST)) { 
     mProcess.onTeamList(activity); 
    } else if (urlContent.contains(TEAMINDEX)) { 
     mProcess.onTeamIndex(activity, url); 
    } else if (urlContent.contains(TEAMINFO)) { 
     mProcess.onTeamInfo(activity, url); 
    } else if (urlContent.contains(TEAMMEMBER_INFO)) { 
     mProcess.onTeamMemberInfo(activity, url); 
    } else { 
     mProcess.onTeam(activity, url); 
    } 
    } 
} 
+0

단일 패턴 일치 작업을 사용하여 선행 "키워드"를 결정할 수 있습니다. 이것은 활동 및 URL로 호출 할 BiConsumer를 검색하는 키로 사용할 수 있습니다. – laune

답변

2

같은 조건의 대안을 고려 I를 시도해야한다 switch 문을 사용하는 것이 좋습니다. 논리를 변경하지 않고도 코드를 더 쉽게 읽을 수 있도록 도와줍니다. 당신은 심지어 유지를 elses 경우의 두 번째 많은에 다른 스위치를 할 수

if(contains){ 
    //you will need to look at how to add this to a switch properly, 
    //just giving you an idea of how I'd look at it. 
    switch(urlContent.startswith) { 
     case TRANSMIT: 
      mProcess.onTransmit(activity, url); 
     case TAKEORDER: 
      mProcess.onTakeOrder(activity, url); 
     case GOODS: 
      if (urlContent.contains(GOODSMANAGER_MMZL)) { 
       mProcess.onEnterpriseShopManage(activity, url); 
      } else { 
       mProcess.onGoods(activity, url); 
      } 
     case SUPPLIER: 
      mProcess.onSupplier(activity, url); 
     case POSTS: 
      mProcess.onPosts(activity, url); 
     case TEAM: 
      if (urlContent.contains(TEAM_LIST)) { 
       mProcess.onTeamList(activity); 
      } else if (urlContent.contains(TEAMINDEX)) { 
       mProcess.onTeamIndex(activity, url); 
      } else if (urlContent.contains(TEAMINFO)) { 
       mProcess.onTeamInfo(activity, url); 
      } else if (urlContent.contains(TEAMMEMBER_INFO)) { 
       mProcess.onTeamMemberInfo(activity, url); 
      } else { 
       mProcess.onTeam(activity, url); 
      } 
    } 
} 

(이것은 분명히 단지 의사입니다)하지만 나는 훈련으로 있음을 떠날거야)은 다음과 같습니다 그래서 이런 모양 일 너무 일부 읽기 : https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

희망이 당신이 시작하는 데 도움이됩니다. 어떻게 진행되는지 알려주세요!

+0

TEAM – chokdee

+0

의 경우에 새로운 방법을 추가하는 것이 좋습니다. 약간 생각한 후에는 별개의 방법 인 .contains를 사용하려고하면 성명이 항상 이상한 것처럼 TEAM 케이스를 유지하는 것이 가장 좋습니다. Where, 나는 urlContent (너무 복잡해서는 안 됨)의 첫 번째 단어를 추출 할 수있는 한 위의 코드가 작동해야한다고 생각합니다. 나는 그가 비교하고있는 urlContent의 포맷에 달려 있다고 생각한다. –

+0

내가 디자인 패턴에 대해 너무 많이 생각할 수도 있습니다. 가장 좋은 방법 인 것 같습니다. –

1

당신이 COR의 길을 가고 싶지 않을 경우 당신은의 differents에게 스위치 구조

switch (/*Variable*/) 
{ 
    case /*Argument*/: 
    /*Action*/; 
    break;   
    default: 
    /*Action*/;    
} 

또는 삼항 연산자

int result = testCondition ? value1 : value2 
+0

나는이 방법이 단일 변수를 검사하지 않고 변수의 변수 하위 문자열을 검사하는 데 도움이 될 것이라고 생각하지 않습니다. – Bernat

0

먼저, 많은 if-else에 대한 문제는 정확히 얼마나 많은 것인가가 아니라 얼마나 깊은 지에 대한 문제입니다. 이 방법을 측정하는 방법과 깊이가 높은 중첩 된 if-else 체인이있는 프로그램이 바람직하지 않은 이유는 here을 참조하십시오.

두 번째로, if-else는 java와 같이 명령형 언어 중 가장 중요한 표현입니다. 그래서, 그것들을 하나의 메소드 안에 넣거나 CoR과 같은 클래스 계층 구조로 퍼트하는 것은 사용중인 프로그램 패러다임의 자연스러운 방법입니다.

글쎄, 사람이 말할 수 있습니다 : "하지만 어쩌면 이런 종류의 코드에 문제가있다, 만약-다른 많은있다"는. 그런 경우에는 문제 자체가 if-else를 많이 사용하는 것이 아니라 대신 그 방법에 많은 책임이 있다는 것입니다. "잡고 디자인 패턴"그 중 하나라는 디자인 패턴의 일반적인 목록이 있습니다 말한다 :

"높은 응집력이 이 적절하게 관리하고 이해 초점을 맞춘 개체를 유지하기 위해 시도하는 평가적인 패턴이다."

정액 패턴에 대한 자세한 내용은 book of Craig Larman을 참조하십시오.

그래서 메서드 안의 코드가 (형식, 다시 쓰기, 라우팅, 유효성 검사 등) 할 일이 많으면 중첩 된 뚱뚱한 순서처럼 코드를 작성하는 다른 방법이 없습니다 -else 문. 이 경우 솔루션은 다른 클래스의 유한 클래스 또는 CoR 패턴에서 제안 된 것과 같은 몇 가지 다른 클래스의 유한 메서드 집합에서 메서드를 중단합니다.