2017-10-25 5 views
1

私は私は複合キー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(); 
} 

を有します。このメソッドは、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#でも知っておくと良いです。 –

関連する問題