【问题标题】:Proper selection of loops versus function versus object/class [closed]正确选择循环与功能与对象/类[关闭]
【发布时间】:2013-07-10 12:53:05
【问题描述】:

在编写程序时,作为一个业余程序员,我的理解是,可以通过三种方式来完成大部分事情:

  • 创建循环
  • 创建和使用函数
  • 创建和使用对象

我在这里使用 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 新手会很高兴找到一些关于此编程基础的系统方法。

【问题讨论】:

  • 所以这个问题即将以它是基于意见的论点结束......嗯......从什么时候开始良好的编程实践知识开始基于意见?
  • 版主可能认为您的问题对于 StackOverflow 来说过于宽泛。预计人们提出的实际问题已经包括解决问题的尝试。也许您可以考虑修改您的问题?
  • @Jack_of_All_Trades “良好的编程实践”是一种观点,有些人不同意它们。 StackOverflow 通常适用于答案不是意见的问题。它要么有效且满足提问者的要求,要么无效且满足提问者的要求。诸如“此代码的哪个版本看起来更好?”之类的东西。或“我应该做 x 以使其更具可读性吗?”正在征求意见。然而,这并不是说你的问题不好问,只是 StackOverflow 可能不适合它。

标签: language-agnostic coding-style


【解决方案1】:

就我个人而言,就循环而言,我的硬截止是三个。如果我遇到了三个嵌套循环(不计算 if/else 条件或 try/catch 条件),那么我知道是时候将其分解为单独的函数了。

就权衡而言,只要您正在运行的函数快速连续运行多次(如在循环的较低层中),就不会有任何性能损失。进行函数调用总是会有一些开销,但幸运的是计算机真的很聪明,它们有这些东西调用temporal caches,其中缓存是非常快速内存的区域(阅读:SRAM) .这将识别并将您的函数调用加载到缓存中。由于访问已经在缓存中的内容实际上是免费的(读取时间为几 ​​ns),因此您实际上不会为这些额外的函数调用付出任何性能损失。

虽然类的使用非常依赖于语言。在 javascript 中,一切都已经是一个对象,所以你真的不应该担心在类中包装函数,尽管会有一点开销。然而,对于像 Java 这样的语言,您应该努力创建大量的小类。 JVM 对多个类之间的通信进行了极大的优化,并且 JIT 编译器不应加载类中涉及的任何额外“goo”,除非您确实需要它。

但总的来说,性能并不是您做出大多数决定的依据(性能是非常高的 80/20,而您通常需要的只是不做任何明显愚蠢的事情的 80。)您真的应该尝试遵循使您的代码对其他开发人员尽可能可读的模式。很难定义一个硬性和快速的规则,因为这个主题有很多阵营。不过,总的来说,对于初学者来说,我的建议是查看大量代码并尝试了解正在发生的事情。如果可以,请尝试以更易读的格式重写部分代码。 Github 上有足够多的开源代码,应该很容易做到。

良好的编程实践也一直是意见,只是人们有时非常同意。

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多