2

コードをサブルーチンに入れるか、Perlスクリプトの主要部分に入れるかをどのように決定しますか?

コードを再利用する必要がある場合は、サブルーチンに入れることは理解していますが、再利用しない場合はどうなりますか?コードをグループ化して読みやすくするためにサブルーチンを配置するのは良い習慣ですか?

例(メイン):

my ($num_one, $num_two) = 1, 2;
print $num_one + $num_two;
print $num_one - $num_two;

例(サブルーチン内):

 my ($num_one, $num_two) = 1, 2;
 add($num_one, $num_two);
 subtract($num_one, $num_two);

 sub add {
     my ($num_one, $num_two) = @_;
     return $num_one + $num_two;
 }

 sub subtract {
     my ($num_one, $num_two) = @_;
     return $num_one - $num_two;
 }    

これは単純な例ですが、より複雑なコードの場合(subaddとsubsubtractのコードが多い場合)、サブルーチンにグループ化するのは理にかなっていますか?

ありがとう!

4

4 に答える 4

4

subsを使用すると、自己文書化の要素が追加されることを付け加えたいと思います。3行のサブを作成することにより、1つを置き換えることができます

my $sum;
my $count;
for (@levels) {
   next if $_ >= 10;
   ++$count;
   $sum += $_;
}

my $avg = $sum / $count;

my $avg = avg grep $_ >= 10, @levels;

「avg」が何をするかを推測する方がはるかに簡単で、ループが発生します。2番目のバージョンではフィルターを見逃すことはありません。

ちなみに、これはsubsは小さなコードでも有効であり、subsを使用すると、一度だけ呼び出したとしても、実際には少ないコードで済みます。この場合、空白以外の行が2つ少なくなります。

sub avg {
   my $acc;
   $acc += $_ for @_;
   return $acc / @_;
}

PS-初期化コードを除いて、コードをトップレベルに置くことは避けています。語彙の範囲を制限し、関心の分離を行うために、トップレベルのコードをブロックに入れました。

{
   my ($num_one, $num_two) = (1, 2);
   add($num_one, $num_two);
   subtract($num_one, $num_two);
}
于 2012-06-14T16:14:18.143 に答える
4

コードがサブルーチン内にあると、コードの再利用が容易になることを指摘しました。サブルーチンを使用する理由は他に少なくとも3つあると思います。

  1. サブルーチンが適切に記述されている場合(つまり、グローバル変数を使用せず、明確に定義されたリターンポイントがあり、小さい-確かに画面いっぱいのコードにすぎない)、次の作業を行うことができます。コードの残りの部分を気にせずに、サブルーチン内のコード。これにより、コードの保守が容易になります。
  2. 適切な名前のサブルーチンを使用すると、コードを簡単に追跡できます。メインの実行ラインが6ダースの適切な名前のサブルーチンを呼び出すだけの場合、プログラムが何を実行するかはすぐにわかります。
  3. サブルーチン内のコードは、サブルーチン外のコードよりもテストがはるかに簡単です。サブルーチンが別のライブラリにある場合はさらに良いです。テストスイートは、ライブラリをロードして各サブルーチンを順番に試し、正しい効果があることを確認できます。

これらの点は明らかにすべて単純化されています。しかし、彼らは私のコードの大部分がサブルーチンにある理由を説明するのにいくらか役立ちます。

于 2012-06-14T15:37:54.450 に答える
2

原則として、コードのシーケンスを複数回繰り返す場合は、subを使用します。スクリプトまたはアプリが複雑になるにつれて、論理的な編成と読みやすさのためにリファクタリングする際にさまざまな工夫を凝らします。洗練、洗練、洗練。:)

于 2012-06-14T15:24:36.173 に答える
2

はい、サブルーチンが1回だけ呼び出された場合でも、プログラムをサブルーチンに分割することをお勧めします。読みやすさが向上するからです。'for'ループまたは'if'ステートメントがあり、その中にコードが3ページ以上あると想像してください。論理フローが理解しにくくなります。ただし、サブルーチン(他のサブルーチンを呼び出す)がある場合は、メインループまたはメインが1ページに簡単に収まる場合は、読みやすく、保守しやすくなります。

また、今日、そのコードは1回しか呼び出されていないことを考慮してください。ただし、6か月後には、コードを再利用する必要がある場合があります。その場合は、サブルーチンを解除するだけです。

したがって、可能であれば常にサブルーチンを使用してください。

于 2012-06-14T15:42:38.143 に答える