2011-06-28 107 views
1

以下代码是否清晰易读?java代码样式问题 - for循环

public void createDatabase() throws SQLException, IOException { 
    SQLiteDatabase database = dbStore.getDatabase(); 
    LineNumberReader scriptInputReader = new LineNumberReader(new InputStreamReader(getClass().getResourceAsStream(SCRIPT_CREATE))); 
    for(String line; (line = scriptInputReader.readLine()) != null;) { 
     database.execSQL(line); 
    } 
} 

我写了很多“for”循环,就像上面那样。对我来说,它看起来很清楚 - 它显示了循环中使用的临时变量(“行”),限制了它的作用域并指出循环何时结束(当“readLine”返回“null”时)。我不知道其他的程序员会恨我的那些...

或者这一个:

SQLiteDatabase database = dbStore.getDatabase(); 
    Cursor cursor = database.query("PINS", new String [] {"ID", "X", "Y"}, null, null, null, null, "ID"); 
    if(cursor.moveToFirst()) { 
     for(; !cursor.isAfterLast(); cursor.moveToNext()) { 
      (...) 
     } 
    } 
    cursor.close(); 

是东西像上面只是“整洁”,或者已经是Java的困惑?

+0

既然我知道谁使用AF程序员或者大多数人会使用,如果我想你可以逃避它,但这些例子看起来像是使用while循环的东西。 – fvu

+0

@fvu:我非常确定,如果我通过Java SDK评分,我可以找到几个使用类似繁重编码风格的“官方”示例。所以我觉得这很主观。 – Voo

+0

我有时甚至写(;;){/*...*/ if(something)break; /*...*/}但这显然是错误的,我只在做原型时才这样做。这对我来说就像是一种习惯;) – Chris

回答

4

我喜欢你做了什么,但我会做一个小的变化:

for(String line = scriptInputReader.readLine(); line != null; line = scriptInputReader.readLine()) { 
    database.execSQL(line); 
} 

这分离循环终止条件迭代的动作。此外,与“while”版本不同,它将line变量的范围限制为循环缩小范围,尽可能是良好的编码实践。另外,代码风格检查器通常会将测试中嵌套的分配视为“不良风格”。要清楚,你的代码有点像这样:

for (int i = -1; ++i < max;) { // don't do this: increment action inside condition section 
    // some code 
} 
+3

是的,我没有使用for循环的问题,但在没有理由的条件下使用赋值是一种邪恶的邪恶风格。 – Voo

+0

好吧,在条件中检查赋值的规则是我从checkstyle/PMD配置中删除的第一件事情之一 - 正是因为这个用例;) –

+1

我喜欢保持清晰循环终止的想法,比如“line!= null”并清除迭代操作“readLine()”。我认为这看起来比我最初的循环更好。 – Chris

1

我会用一个while循环

String line = scriptInputReader.readLine(); 
while(line != null){ 
    //do stuff 
    line = scriptInputReader.readLine(); 
} 
7

我会选择:

String line = null; 
while((line = scriptInputReader.readLine()) != null) { 
    ... do stuff with line 
} 

这是明确和直接的。

+0

将'line'设置为'null'的初始化器是虚假的。 –

+0

是的......但是......由于在循环结束后线仍然被分配,所以这会泄漏一点内存。这也会在循环之后的范围内保留变量名 - 它可能与相同方法中的其他变量(不同变量类型)冲突。 把整个东西放在额外的括号里对我来说似乎是极端的) – Chris

+0

@Kirk Woll - >真的,我把它当作是稍后阅读它的人的指南,我没有忘记初始化它,就像“是的,我打算在这里有一个非初始化值“。 –

1

我会感觉更放心一会儿。

第一个不是很糟糕,因为它很容易理解循环的作用,但是如果在循环中添加更多逻辑并且操作复杂化,它将变得更加困难(因为人们会想:'嘿,如果他只想读一个他会用一会儿的文件,所以一定有一些技巧')。

第二个(在工作中做的,在循环中没有代码)很糟糕,可能在不久的将来有人会说:'嘿,这里有一个循环,内容被删除,但他们忘了删除循环!我可以通过完全删除'来优化这一点)。

0

我认为这里有两种不同的思想流派。 Jarek Potiuk所示的那种喜欢用于/ while循环以用于不同目的(即,当你事先知道你的循环的范围时,应该使用for循环(for(; i < arr.length(); i ++))while while while is preferred for unlimited situations。

但是接下来还有另一种思路,它只使用一种循环,而在for循环中因为它更通用。例如Java SDK在无限的情况下(例如链表)使用for循环。 但是,那么你应该像Bohemian那样真的写for循环 - 更清晰。

0

当您不知道何时会终止循环时,有些人宁愿使用while循环。例如通过文件读取。

亚雷克Potiuk的解决方案工作,但我更喜欢这样的事情:

String line = scriptInputReader.readLine(); 
while(line != null) 
{ 
    ... do stuff with line 
    line = scriptInputReader.readLine(); 
} 

它是多一点点的代码,但我有波希米亚同意:

代码风格检查通常考虑 分配嵌套的测试中为 “穷人式”

+0

我是代码检查员的忠实粉丝。真。我在我的公司介绍了他们25人以上。我爱他们。只要他们推广的代码更好....我们最近审查了checkstyle/PMD的规则,并删除了一系列造成更多伤害而不是优点的规则。在条件下的任务是其中之一。 –

+0

@Jarek yeap!并在svn钩子中运行它们来拒绝所有违反代码风格指令的提交,这样会使程序员的生活变得糟糕;)pozdrawiam :) – Chris