提问人:Jack_of_All_Trades 提问时间:7/10/2013 最后编辑:Slater VictoroffJack_of_All_Trades 更新时间:7/10/2013 访问量:88
正确选择循环与函数与对象/类 [已关闭]
Proper selection of loops versus function versus object/class [closed]
问:
在编写程序时,我作为一个业余程序员的理解是,有三种方法可以完成大部分事情:
- 创建循环
- 创建和使用函数
- 创建和使用对象
我在这里使用 javascript 来问我的问题,因为我在大约 2-3 周前学习了它。与我在大学里习惯的 python 或 MatLab 相比,这有点奇怪,但这不是重点。我经常想,在特定的应用中,三个中应该有什么好的选择,所以我想知道你的建议。
我想创建一个数组列表,以便随后用于绘图。该程序应该取方程的系数、增量步长和 x 值的边界。下面是代码(对不起,如果我在更改为适合 SO 时错过了下面的内容,但它在前段时间可以工作!
function array_creator(input_coeff,inc, boundary){
var bound=boundary||[0,1];
var eqn_deg=input_coeff.length-1;
var increment=inc;
var x_init=bound[0];
var y_val=0;
var graph_array=[];
while (x_init<=bound[1]){
for(var i=0;i<input_coeff.length;i++){
y_val=y_val+input_coeff[i]*Math.pow(x_init,eqn_deg);
eqn_deg--;
}
new_arr=[x_init,y_val];
eqn_deg=input_coeff.length-1;
y_val=0;
graph_array.push(new_arr);
x_init=x_init+increment;
}
return graph_array;
}
在上面的代码中,我有一个嵌套循环,它进入了while,但我习惯于编写嵌套深度超过3-4的代码,一周后我无法挖掘自己的程序。所以我的问题是,我什么时候应该知道是时候实现单独的功能而不是嵌套或知道创建对象的时间了。在清晰度和效率方面,将一个大循环函数分解为多个函数的收益和损失是什么?在什么时候创建对象变得至关重要,或者只是当我必须再次重复使用相同的代码时。
当你拥有的唯一工具是锤子时,一切看起来都像钉子一样。当我在 MatLab 之后开始学习 python 时,我对 OO 方法印象深刻,以至于无论是否需要,我都会在各种情况下创建类。我想许多 SO 新手会很高兴在这个编程基础上找到一些系统的方法。
答:
就个人而言,就循环而言,我有一个硬性截止值,即三个。如果我命中了三个嵌套循环(不计算 if/else 条件或 try/catch 条件),那么我知道是时候将其分解为单独的函数了。
就权衡而言,只要您正在运行的函数快速连续运行多次(例如在循环的较低层中),就不会有任何性能损失。进行函数调用总是有轻微的开销,但幸运的是,计算机真的很聪明,它们可以调用这些东西,其中缓存是一个极快的内存区域(阅读:SRAM)。这将识别您的函数调用并将其加载到缓存中。由于访问缓存中已有的内容实际上是免费的(读取时间为几ns),因此您不会为这些额外的函数调用付出任何性能损失。temporal caches
不过,类的使用非常依赖于语言。在 javascript 中,一切都已经是一个对象,所以你真的不应该担心将函数包装在类中,尽管同样会有轻微的开销。但是,对于像 Java 这样的语言,您应该努力创建大量的小类。JVM针对多个类之间的通信进行了极大的优化,JIT编译器不应该加载类中涉及的任何额外的“goo”,除非你真的需要它。
不过,一般来说,性能并不是你应该做出大部分决定所依据的(性能非常 80/20,你通常需要的只是 80 分,不要做任何明显愚蠢的事情。你真的应该尝试遵循一种模式,使你的代码对其他开发人员来说尽可能可读。很难定义一个硬性规定,因为在这个问题上有很多阵营。不过,总的来说,对于一个刚入门的程序员来说,我的建议是查看大量代码并尝试理解正在发生的事情。如果可以,请尝试以更具可读性的格式重写部分代码。Github 上有足够多的开源代码,应该很容易做到。
此外,好的编程实践一直是意见,只是人们有时非常同意。
评论