2017-10-25 2 views
1

는 I 제가 결합 키와 TaskType UserAction하여 ActionProcessable를 저장하는 맵이이 논리 예 코드if-else 깊이를 줄이는 방법은 무엇입니까?

public static ActionProcessable getActionProcessor(TaskType currentTaskType, UserAction userAction){ 
    String actionKey; 
    if(userAction != null){ 
     if(currentTaskType != null){ 
      actionKey = buildKey(currentTaskType, userAction); 
      if(dossierActions.containsKey(actionKey)){ 
       return dossierActions.get(actionKey); 
      } 
     } 

     actionKey = buildKey(anyTaskType(), userAction); 
     if(dossierActions.containsKey(actionKey)){ 
      return dossierActions.get(actionKey); 
     } 
    } 

    return new NullActionProcessor(); 
} 

있다. 이 메소드는 input taskType 및 action으로 ActionProcessable을 리턴합니다. TaskType은 null 일 수 있으므로이 경우 userAction 만 가져야합니다.

내가 수중 음파 탐지기로이 코드를 검사 할 때, 그것은

그러나 나는 그것을 더 좋게 만드는 방법을 모르는 세 번째 경우는 "깊이 2 (최대 허용치는 1) 인 경우 - 다른 중첩"하고 있다고 . 누군가 나에게 뭔가 제안 했습니까? 조건 중

답변

1

당신은 이동할 수 있습니다 "containsKey 경우"부분은 코드 중복을 제거 :

public static ActionProcessable getActionProcessor(TaskType currentTaskType, UserAction userAction){ 
    if (userAction != null) { 
     String actionKey = currentTaskType != null 
      ? buildKey(currentTaskType, userAction) 
      : buildKey(anyTaskType(), userAction); 

     if (dossierActions.containsKey(actionKey)){ 
      return dossierActions.get(actionKey); 
     } 
    } 

    return new NullActionProcessor(); 
} 

지금, 코드의 의도는 (적어도 나를 위해) 더 명확 보인다.

또한 containsKey의 경우 첫 번째 조건을 단락 회로 및 \ 삼진으로 만들 수 있으며 더 많은 사람이 if을 제거하지만 일부 사람들에게는 더 복잡한 코드로 만들 수 있습니다.

public static ActionProcessable getActionProcessor(TaskType currentTaskType, UserAction userAction){ 
    if (userAction == null) { 
     return new NullActionProcessor(); 
    } 

    String actionKey = currentTaskType != null 
     ? buildKey(currentTaskType, userAction) 
     : buildKey(anyTaskType(), userAction); 

    return dossierActions.containsKey(actionKey) 
     ? dossierActions.get(actionKey); 
     : new NullActionProcessor(); 
} 

기술적으로 비슷한 것을 선택하십시오.

특정 프로그래밍 언어를 지정하지 않았으므로 한 가지 더 말하면 : 귀하의 코드는 null-coalsecing 연산자의 유스 케이스의 좋은 예입니다. 슬프게도 AFAIK, Java에는 아무 것도 없습니다. C#에서는 코드가 다음과 같이 보일 수 있습니다.

public static ActionProcessable GetActionProcessor(TaskType currentTaskType, UserAction userAction) { 
    if (userAction == null) { 
     return new NullActionProcessor(); 
    } 

    var actionKey = BuildKey(currentTaskType ?? anyTaskType(), userAction); 
    return dossierActions[actionKey] ?? new NullActionProcessor(); 
} 
+0

감사합니다. @Yeldar Kurmangaliyev. 당신의 설명이 나에게 분명하고 코드가 더 간결하고 깨끗해 보입니다. 내 예제는 Java이지만 C#에서도 알아두면 좋습니다. –

관련 문제