Arv*_*nem 4 java foreach for-loop premature-optimization
鉴于需要循环到任意int值,将值转换为数组并为每个数组转换,或仅使用传统的for循环是否更好的编程实践?
仅供参考,我正在计算6个骰子的多个投掷中的5个和6个结果("命中")的数量.我的任意int值是dicePool,它表示多次抛出的次数.
据我了解,有两种选择:
将dicePool转换为数组并为每个数组转换:
public int calcHits(int dicePool) {
int[] dp = new int[dicePool];
for (Integer a : dp) {
// call throwDice method
}
}
Run Code Online (Sandbox Code Playgroud)使用传统的for循环:
public int calcHits(int dicePool) {
for (int i = 0; i < dicePool; i++) {
// call throwDice method
}
}
Run Code Online (Sandbox Code Playgroud)我的观点是选项1是笨拙的代码并且涉及不必要的数组创建,即使for-each循环比选项2中的传统for循环更有效.
Gor*_*son 12
此时,速度并不重要(插入过早优化注释;).重要的是你能够多快地理解代码的作用,即调用方法的dicePool
时间.
第一种方法分配一个大小的数组dicePool
并迭代它的值,这恰好运行循环体dicePool
时间(我会假装你的意思int
而不是Integer
避免不相关的自动装箱问题).这对于运行代码的计算机而言可能效率低下,但更重要的是,对于人类阅读代码而言,这是低效的,因为它在概念上远离您想要完成的任务.具体来说,您强制读者考虑您刚刚创建的新数组,以及变量的值a
,即循环的每次迭代都将为0,即使这些都与您的最终目标无关.
任何查看第二种方法的Java程序员都会意识到你正在dicePool
通过i
"向上计数"来执行循环体时间dicePool
.虽然后一部分并不是特别重要,但开始正是你的意思.使用这种常见的Java习语可以最大限度地减少读者需要考虑的无关内容,因此它是最佳选择.
如有疑问,请简单操作.:d
归档时间: |
|
查看次数: |
584 次 |
最近记录: |