Coding style 如何减少if-else深度?

Coding style 如何减少if-else深度?,coding-style,code-cleanup,Coding Style,Code Cleanup,我有这个示例代码 公共静态ActionProcessable getActionProcessor(TaskType currentTaskType,UserAction UserAction){ 字符串操作键; if(userAction!=null){ 如果(currentTaskType!=null){ actionKey=buildKey(currentTaskType,userAction); if(档案。容器(行动键)){ 返回档案。获取(actionKey); } } action

我有这个示例代码

公共静态ActionProcessable getActionProcessor(TaskType currentTaskType,UserAction UserAction){ 字符串操作键; if(userAction!=null){ 如果(currentTaskType!=null){ actionKey=buildKey(currentTaskType,userAction); if(档案。容器(行动键)){ 返回档案。获取(actionKey); } } actionKey=buildKey(anyTaskType(),userAction); if(档案。容器(行动键)){ 返回档案。获取(actionKey); } } 返回新的NullActionProcessor(); } 在这个逻辑中,我有一个映射,通过组合键TaskType和UserAction来存储ActionProcessible。此方法将返回带有输入taskType和action的ActionProcessible。TaskType可以为null,因此在这种情况下,我们只需要通过userAction获取

当我用声纳检查这个代码时,它说第三个if是“嵌套的if-else深度是2(允许的最大值是1)”

但我不知道如何让它变得更好。 有人建议我做些什么吗?

您可以将“if 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();
}
现在,代码的意图看起来更清楚了(至少对我来说是这样)

您还可以使第一个条件短路和\或使用三值if for
containsKey
,它将删除更多的
if
s,但会使某些人的代码更复杂

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操作符用例的一个很好的例子。遗憾的是,抱歉,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();
}

谢谢@Yeldar Kurmangaliyev。您的解释对我来说很清楚,我认为代码看起来更简洁、更清晰。我的示例是用Java编写的,但最好也用C#编写。