2017-10-25 4 views
1

Ich habe dieses Beispiel-CodeWie reduziere ich die if-else-Tiefe?

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(); 
} 

In dieser Logik ich eine Karte haben die ActionProcessable durch kombinierte Schlüssel und Tasktype Useraction zu speichern. Diese Methode gibt ActionProcessable mit Eingabe taskType und Aktion zurück. TaskType kann null sein. In diesem Fall müssen wir nur nach userAction suchen.

Wenn ich diesen Code durch Sonar überprüfen, sagen Sie es der dritte wenn wird „Verschachtelte if-else Tiefe 2 (max 1)“

Aber ich weiß nicht, wie man es besser machen . Hat mir jemand etwas vorgeschlagen?

Antwort

1

Sie können „wenn containsKey“ Teil aus Bedingung bewegen Code-Duplizierung zu entfernen:

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(); 
} 

Nun Absicht des Code sieht klarer (zumindest für mich).

Sie können auch die erste Bedingung kurzschließen und/oder Ternär verwenden, wenn für containsKey, wird es noch mehr if s entfernen, kann aber Code für einige Leute komplexer machen.

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(); 
} 

Wählen Sie die, die Sie mögen, sie sind technisch ähnlich.

Da Sie keine bestimmte Programmiersprache angegeben haben, müssen Sie noch Folgendes sagen: Ihr Code ist ein gutes Beispiel für den Anwendungsfall des Null-Kohlebier-Operators. Leider, AFAIK, gibt es keinen in Java. In C# könnte der Code wie folgt aussehen:

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

Dank @ Yeldar Kurmangaliyev. Ihre Erklärung ist mir klar, und ich denke, dass Code prägnanter und sauberer aussieht. Mein Beispiel ist in Java, aber es ist auch gut in C# zu wissen. –

Verwandte Themen