Coding style 如何减少if-else深度?
我有这个示例代码 公共静态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”部分移出状态以删除代码重复: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
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 forcontainsKey
,它将删除更多的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#编写。