Java foreach语句中的块是否必须只有一行长?
我正在读一本名为罗伯特·C·马丁(Robert C.Martin)的书,在他的书中,他给出了许多有用的技巧,告诉我们如何编写好的Java代码 其中一个建议是: if语句、else语句、for语句等中的块 on应该是一行。也许这行应该是一个函数 呼叫这不仅使封闭函数保持较小,而且 由于在 块可以有一个很好的描述性名称 对我来说,这是一个非常奇怪的提示,因为从以下代码:Java foreach语句中的块是否必须只有一行长?,java,coding-style,Java,Coding Style,我正在读一本名为罗伯特·C·马丁(Robert C.Martin)的书,在他的书中,他给出了许多有用的技巧,告诉我们如何编写好的Java代码 其中一个建议是: if语句、else语句、for语句等中的块 on应该是一行。也许这行应该是一个函数 呼叫这不仅使封闭函数保持较小,而且 由于在 块可以有一个很好的描述性名称 对我来说,这是一个非常奇怪的提示,因为从以下代码: public Map<String, List<Issue>> mapComponentToIssueLi
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;
}
公共地图组件到列表(列表问题){
Map Map=newhashmap();
针对(问题:问题){
String componentName=issue.getComponents().iterator().next().getString(“名称”);
if(映射容器(组件名称)){
map.get(componentName).add(issue);
}否则{
列表=新的ArrayList();
列表。添加(发布);
map.put(组件名称、列表);
}
}
返回图;
}
利用这个原理,我得到了:
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");
}
公共地图组件到列表(列表问题){
Map componentNameIssueListMap=新HashMap();
针对(问题:问题){
使用组件名称和发布列表填充Map(组件名称发布列表,发布);
}
返回组件名称IssueListMap;
}
私有void populatemApWithComponenNamesandSuSelects(映射组件名称IssuseListMap,Issue Issue){
String componentName=getFirstComponentName(问题);
if(组件名称IssueListMap.containsKey(组件名称)){
componentNameIssueListMap.get(componentName).add(issue);
}否则{
putIssueListWithNewKeyToMap(组件名称IssueListMap,issue,组件名称);
}
}
私有void putIssueListWithNewKeyToMap(映射组件名IssueListMap、Issue Issue、字符串组件名){
列表=新的ArrayList();
列表。添加(发布);
componentNameIssueListMap.put(componentName,列表);
}
私有字符串getFirstComponentName(问题){
返回问题.getComponents().iterator().next().getString(“名称”);
}
所以基本上代码的大小增加了一倍。它有用吗?-也许吧
在我的示例中,什么代码被称为clean?我做错了什么?你们对此怎么看?坦率地说,我认为这个建议很愚蠢,因为它太极端了 就我个人而言,如果我要对你的函数做任何修改,我会这样修改:
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;
}
如果以上内容出现在多个地方,我肯定会这么做。否则,可能不会(至少最初不会)。我认为简化条件本身更有意义。而不是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;
}
哦,那个建议近乎荒谬。请扔掉那本书。或者烧掉它。(后者更安全;没有人能读到它)。哦,不,它有关联,因为总有一天我可能不得不解开一堆由作者写的乱七八糟的东西。烧掉它:-D+1因为烧掉了,我也读了那本该死的书,我还在做噩梦。我当时年轻又笨。另外:酒精。:)这是一个伪装的亡灵名词,我,我,干净的密码。我看不懂作者的心思,但我怀疑这是他的意思。除此之外,他所说的是“在
else
语句中的块”。我想这在降低复杂性方面是有意义的,但这应该适用于任何代码块,而不仅仅是if语句。如果代码块不是直接的,那么在方法中提取它会使代码更容易阅读和理解。
public void method(){
...
if( conditionsAreTrue() ) {
dosomething();
}
...
}
boolean conditionsAreTrue(){
return mycondition1 && mycondition2 && mycondition3 && mycondition4 && mycondition5 && mycondition6 && mycondition7 && mycondition8;
}