0

プログラムを書くとき、趣味のプログラマーとしての私の理解では、ほとんどのことを達成するには 3 つの方法があります。

  • ループを作成する
  • 関数を作成して使用する
  • オブジェクトを作成して使用する

約 2 ~ 3 週間前に JavaScript について学習したので、ここで JavaScript を使用して質問しています。大学のpythonやMatLabで慣れていたものと比べると少し奇妙ですが、それは重要ではありません。私はよく、特定のアプリケーションで 3 つの中でどれを選択するのが適切かを考えるので、あなたの提案を知りたいと思いました。

後でプロットに使用する配列のリストを作成したかったのです。プログラムは、方程式の係数、インクリメンタル ステップ、および 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 の内側に入れ子になったループが 1 つありますが、入れ子の深さが 3 ~ 4 を超えるコードを書くことに慣れており、1 週間後には自分のプログラムを掘り下げることができません。したがって、私の質問は、ネストするのではなく、別の関数を実装する時期であることをいつ知っておくべきか、オブジェクトを作成する時期を知る必要があるかということです。明確さと効率の観点から、1 つの大きなループ関数を複数の関数に分割することのメリットとデメリットは何ですか? どの時点でオブジェクトの作成が不可欠になるのか、それとも同じコードを再利用しなければならないときなのか。

道具が金槌しかないと、すべてが釘に見えてしまいます。MatLab の後に Python を学び始めたとき、OO アプローチに感銘を受け、必要かどうかに関係なくあらゆる状況でクラスを作成していました。多くの SO 初心者は、このプログラミングの基礎に関する体系的なアプローチを見つけて喜んでいると思います。

4

1 に答える 1

1

個人的には、ループに関する限り、私は 3 つのハード カットオフを持っています。入れ子になった 3 つのループ (if/else 条件や try/catch 条件は数えません) に遭遇したことがある場合は、それを個別の関数に分割する必要があることがわかります。

トレードオフに関しては、実行している関数が (ループの下位層のように) 立て続けに何度も実行される限り、実際にはパフォーマンスが低下することはありません。関数呼び出しの作成には常にわずかなオーバーヘッドが伴いますが、幸いなことに、コンピューターは非常にスマートでtemporal cachesあり、キャッシュが非常に高速なメモリ (読み取り: SRAM) の領域である場合にこれらの呼び出しを行います。これにより、関数呼び出しが認識され、キャッシュに読み込まれます。キャッシュ内にすでにあるものへのアクセスは事実上無料であるため (読み取り時間は数ナノ秒)、これらの余分な関数呼び出しに対して実際にパフォーマンスの損失を支払うことはありません。

ただし、クラスの使用法は言語に大きく依存しますJavaScript では、すべてが既にオブジェクトであるため、関数をクラスでラップすることについて心配する必要はありませんが、やはりわずかなオーバーヘッドが発生します。ただし、Java のような言語の場合は、多数の小さなクラスを作成するように努める必要があります。JVM は、複数のクラス間で対話するために非常に最適化されており、JIT コンパイラーは、本当に必要でない限り、クラスに関連する余分な「グー」をロードするべきではありません。

ただし、一般的に、パフォーマンスは、ほとんどの決定に基づいて行うべきものではありません (パフォーマンスは非常に 80/20 であり、通常必要なのは、あからさまに愚かなことをしないという 80 だけです)。これにより、コードが他の開発者にとって可能な限り読みやすくなります。このテーマには多くの陣営があるため、厳密で迅速なルールを定義するのはかなり困難です。ただし、一般的に、初心者のプログラマーに対する私のアドバイスは、多くのコードを見て、何が起こっているのかを理解しようとすることです。可能であれば、コードの一部をより読みやすい形式に書き直すようにしてください。Github には十分な数のオープン ソース コードがあり、非常に簡単に実行できます。

また、優れたプログラミング手法は常に意見であり、人々が時々非常に同意するだけです。

于 2013-07-10T13:01:41.563 に答える