2

この質問は、Perl の可読性と優れた実践に関するものです。私が行ういくつかのチェックがあります:

  • 変数 $array_ref がある場合、その配列にテキスト「一致」と等しい要素が少なくとも 1 つあるかどうかを知る必要があるだけです。$array_ref が未定義であるか、または $array_ref が定義されている場合、それが参照する配列が空である可能性があります (または未定義でさえありますか?それは可能ですか?)

  • スカラーが 1 に等しいかどうかを確認します

  • 別のスカラーが「はい」に等しいかどうかを確認します

私が使用している現在のコードは次のとおりです。

 my $is_compatible = $array_ref and defined grep $_ eq 'match', @{$array_ref}
                     and $my_num = 1 and $my_text eq 'yes'.

これを修正して、より簡単に変更して読みやすくすることはできますか? また、$array_ref の値がどのようなものになるかについて考えられるすべてのユースケースに適合しますか?

4

2 に答える 2

7

を使用しないことから始めandます。それが与える視覚的な合図のために、記号演算子に固執したいと思います。名前付き演算子は通常、用語が見つかった場所にあり、and通常orはフロー制御に使用されます。これらのヒントは両方ともここでは間違っているので、それらのヒントを提供したくありません。

次の配置は非常に読みやすいです。その証拠は、使用=すべき場所でを使用したことが盲目的に明らかになったことです==

my $is_compatible = ( $array && grep $_ eq 'match', @$array )
    && $my_num == 1
    && $my_text eq 'yes';

サブを使いたい場合は、以下で十分です。

sub is_compatible {
   my ($array, $my_num, $my_text) = @_;
   return 0 if !$array || !grep $_ eq 'match', @$array;
   return 0 if $my_num != 1;
   return 0 if $my_text ne 'yes';
   return 1;
}

これらのアプローチは両方とも、似ているものは似ているように見え、異なるものは異なっているように見えるため、非常に効率的なコード スキャンが可能になります。

于 2012-07-19T01:06:44.703 に答える
3
sub is_compatible {
   my $array_ref = shift;
   defined( $array_ref )
       or return;
   ref $array_ref eq ref []
       or return;
   return unless grep $_ eq 'match', @$array_ref;

   my $my_num = shift;
   $my_num == 1
       or return;

   my $my_text = shift;
   $my_text eq 'yes'
       or return;

   return 1;
}
于 2012-07-18T23:53:47.143 に答える