我正在读一本名为Clean Code -A Handbook of Agile Software Craftsmanship的书,由 Robert C. Martin 撰写,在他的书中,他提供了很多有用的技巧,如何编写优秀的Java代码。
其中一个提示是:
if语句,else语句,语句等中的块 应该是一行长。可能该行应该是一个函数 呼叫。这不仅保持封闭功能小,而且保持封闭功能 还添加了纪录片值,因为函数调用了 块可以有一个很好的描述性名称
对我来说这是非常奇怪的提示,因为从这段代码开始:
public Map<String, List<Issue>> mapComponentToIssueList(List<Issue> issues) {
Map<String, List<Issue>> map = new HashMap<String, List<Issue>>();
for (Issue issue : issues) {
String componentName = issue.getComponents().iterator().next().getString("name");
if (map.containsKey(componentName)) {
map.get(componentName).add(issue);
} else {
List<Issue> list = new ArrayList<Issue>();
list.add(issue);
map.put(componentName, list);
}
}
return map;
}
使用这个原则我得到了这个:
public Map<String, List<Issue>> mapComponentToIssueList(List<Issue> issues) {
Map<String, List<Issue>> componentNameIssueListMap = new HashMap<String, List<Issue>>();
for (Issue issue : issues) {
populateMapWithComponenNamesAndIssueLists(componentNameIssueListMap, issue);
}
return componentNameIssueListMap;
}
private void populateMapWithComponenNamesAndIssueLists(Map<String, List<Issue>> componentNameIssueListMap, Issue issue) {
String componentName = getFirstComponentName(issue);
if (componentNameIssueListMap.containsKey(componentName)) {
componentNameIssueListMap.get(componentName).add(issue);
} else {
putIssueListWithNewKeyToMap(componentNameIssueListMap, issue, componentName);
}
}
private void putIssueListWithNewKeyToMap(Map<String, List<Issue>> componentNameIssueListMap, Issue issue, String componentName) {
List<Issue> list = new ArrayList<Issue>();
list.add(issue);
componentNameIssueListMap.put(componentName, list);
}
private String getFirstComponentName(Issue issue) {
return issue.getComponents().iterator().next().getString("name");
}
所以基本上代码的大小增加了一倍。它有用吗? - 也许。
我的示例中的哪些代码是所谓的 clean ?我究竟做错了什么?你们怎么看待这个?
答案 0 :(得分:1)
就个人而言,如果我要对你的功能做任何事情,我会改变它:
public Map<String, List<Issue>> mapComponentToIssueList(List<Issue> issues) {
Map<String, List<Issue>> map = new HashMap<String, List<Issue>>();
for (Issue issue : issues) {
String componentName = issue.getComponents().iterator().next().getString("name");
List<Issue> list = map.get(componentName);
if (list == null) {
list = new ArrayList<Issue>();
map.put(componentName, list);
}
list.add(issue);
}
return map;
}
好处是:
list.add()
来电不会在两个地方重复。现在,如果你想要考虑一些因素,以下将是一个很好的候选人:
List<Issue> list = map.get(componentName);
if (list == null) {
list = new ArrayList<Issue>();
map.put(componentName, list);
}
如果以上出现在多个地方,我肯定会这样做。否则,可能不会(至少不是最初)。
答案 1 :(得分:1)
我认为简化条件本身更有意义。比if块的内容,即
public void method(){
...
if( mycondition1 && mycondition2 && mycondition3 && mycondition4 && mycondition5 && mycondition6 && mycondition7 && mycondition8 ) {
dosomething();
}
...
}
变为
public void method(){
...
if( conditionsAreTrue() ) {
dosomething();
}
...
}
boolean conditionsAreTrue(){
return mycondition1 && mycondition2 && mycondition3 && mycondition4 && mycondition5 && mycondition6 && mycondition7 && mycondition8;
}