6

この行がどのように機能するかを誰かが説明できますか?

return $y < 0 ? - pip2 : pip2 if $x == 0;

$y <0が返される場合でも、いつ、-pip2何が返されるのでしょうか。$y >= 0$x != 0

この行はこの関数からのものです:

sub _atan {
    my( $y, $x ) = @_;

    return $y < 0 ? - pip2 : pip2 if $x == 0;
    return atan( $y / $x );
}
4

4 に答える 4

20

接尾辞「if」は、条件が真の場合にのみreturnステートメントが実行されることを意味します。

return $y < 0 ? - pip2 : pip2 if $x == 0;

と同じです

if ($x == 0)
{
    return $y < 0 ? - pip2 : pip2 ;
}

?:三項演算子に戸惑う場合は、これを通常のifステートメントとして書き直して、これを生成することもできます。

if ($x == 0)
{
    if ($y<0)
    {
        return -pip2;
    }
    else
    {
        return pip2;
    }
}
于 2009-09-14T10:48:05.940 に答える
7

それと同じ

if($x == 0){
  if($y<0){
    return -pip2;
  }else{
    return pip2;
  }
}

整関数は次のようになります。

sub _atan {
  my( $y, $x ) = @_;
  if($x == 0){
    if($y<0){
      return -pip2;
    }else{
      return pip2;
    }
  }else{
    return atan( $y / $x );
  }
}
于 2009-09-14T10:43:15.397 に答える
6

これは、読みにくいコードの良い例です。

コードサンプルを書き直すいくつかの異なる方法を比較して、簡潔さを維持し、読みやすさを向上させる方法を見てみましょう。

この三元のみのバージョンは簡潔にするために勝ちますが、それでも読むのは難しいです:

sub _atan {
    my( $y, $x ) = @_;

    return $x == 0 ? ($y < 0  ? -pip2 : pip2)
                   : atan( $y / $x );  
}

連鎖条件演算子(?:)は、後続の演算子がelseの位置にある場合にのみ読み取り可能であることがわかりました。

sub _atan {
    my( $y, $x ) = @_;

    return $x != 0 ? atan( $y / $x ) : 
           $y < 0  ? -pip2           : pip2;  
}

まだ簡単ですが、読みやすさが向上しています。

しかし、ifとを使用するのはunlessどうですか?それらを使用して、簡潔で読みやすいコードを作成することもできますか?

その性質上、単純なif/elseアプローチはより冗長になります。

sub _atan {
    my( $y, $x ) = @_;

    my $atan;
    if( x == 0 ) {
        if( $y < 0 ) {
            $atan = -pip2;
        }
        else {
            $atan = pip2;
        }
    }
    else {
        $atan = atan( $y / $x )
    }            

    return $atan;  
}

上記をたどって、結果がどうなるかを確認するのは簡単です。したがって、読みやすさは優先されますが、簡潔さが損なわれます。

のステートメント修飾子形式を使用して、コードのチャンクに短絡ロジックを追加するためのクリーンな方法を提供することunlessがわかりました。if

sub _atan {
    my( $y, $x ) = @_;

    return atan( $y / $x )
        unless $x == 0;

    return -pip2 if $y < 0;

    return pip2;  
}

これは簡潔で読みやすいですが、私には必要以上の収益があるように思えます。

したがって、条件演算子をミックスに導入すると、次のようになります。

sub _atan {
    my( $y, $x ) = @_;

    return atan( $y / $x )
        unless $x == 0;       

    return $y < 0  ? -pip2 : pip2;  
}

このフォームは、上記のフォームのいずれかと同じくらい簡潔ですが、はるかに理解しやすいです。

sub _atan {
    my( $y, $x ) = @_;

    return atan( $y / $x )
        unless $x == 0;

    return $y < 0  ? -pip2 : pip2;  
}

ネストされたif/else句は理解しにくい場合があります。決定コードを構造化する際に少し注意を払うことで、基礎となるロジックの簡潔な表現を維持しながら、読みやすさ、したがって保守性を大幅に向上させることができます。

ここで修正されるコードの臭いは、条件演算子(?:)とステートメント修飾子形式のバロックの組み合わせでしたif。テストの順序を並べ替え、条件付きロジックの表現方法を慎重に選択することで、簡潔さを維持し、コードを明確にすることができました。

于 2009-09-14T20:47:20.707 に答える
2

問題を解決するために使用される行が多すぎると、コードの保守が困難になります(常にスクロールする必要があります)。ネストされたifを使用したソリューションは、4倍長くなります。4分の1の画面で作業することを想像してみてください。私のお気に入りの構文は次のとおりです。

sub _atan {
    my ($y, $x) = @_;
    return atan ($y / $x) if $x != 0;
    return $y < 0  ? -pip2 : pip2;
}

接尾辞演算子を次の行に配置すると、それらを使用する利点が減少します。この行の順序(@daotoadで提案)を使用すると、より単純な行に接尾辞の条件を設定できます。

最初の構文も素晴らしいですが、以前の投稿の提案されたネストされたifを含むコードで作業したくありません。

于 2012-04-23T13:32:04.103 に答える