2

perlcritic「サブにリターンがないのは間違っている」と言う場合、それらが本当に必要ない場合の代替手段は何ですか?

私は明らかに悪い習慣を 2 つ身につけました。

  • '$main::' 名前空間に変数を明示的に割り当てます。
  • 次に、サブでそれらの変数をいじります。

たとえば、私はするかもしれません..

#!/usr/bin/perl
use strict;
use warnings;

@main::array = (1,4,2,6,1,8,5,5,2);

&sort_array;
&push_array;
&pop_array;

sub sort_array{
    @main::array = sort @main::array;
    for (@main::array){
        print "$_\n";
    }
}

sub push_array{
    for ( 1 .. 9 ){
        push @main::array, $_;
    }
}

sub pop_array {
    for ( 1 .. 3 ){
        pop @main::array;
    }
}

私はいつもこれをしているわけではありません。しかし、上記では、操作を分離できるため、値をやり取りすることを心配する必要がなく、一般的にきれいに見えるので、理にかなっています。

しかし、私が言ったように、perl 評論家はそれが間違っていると言っています。

だから、私がやろうとしていることを解釈して、perl でこのスタイルのコーディングにアプローチするより良い方法を提案できる人はいますか? 例えば。私は一種のOOPをやっていますか?

4

2 に答える 2

1

関数が何も返さない場合は、return!を使用する必要はありません。

いいえ、オブジェクト指向の側面 (カプセル化、ポリモーフィズムなど) は使用しません。あなたがしていることは、手続き型プログラミングと呼ばれます。それは何も悪いことではありません。原子力発電所に関する私の仕事はすべてそのスタイルで書かれました。

問題は を使用@main::arrayすることであり、それを に省略できるという事実について話しているのではありません@::array。完全修飾名は厳密なチェックを逃れるため、はるかにエラーが発生しやすくなります。var 名の入力ミスは簡単には見つかりません。同じ変数名を使用すると、2 つのコードが衝突しやすくなります。

1つのファイルだけを使用している場合は、を使用できますが、複数のファイル/モジュールからアクセスしているため、my @array使用していると思います。モジュールに配置してエクスポートすることをお@main::array勧めします。our @array

package MyData;
use Exporter qw( import );
our @EXPORT = qw( @array );

our @array;

1;

変数名 (接頭辞や接尾辞など) に、これが多くのモジュールで使用される変数であることを示す何らかのヒントがあると便利です。


ちなみに、オブジェクトを作成したい場合は、次のようになります

package MyArray;

sub new {
   my $class = shift;
   my $self = bless({}, $class);
   $self->{array} = [ @_ ];
   return $self;
}

sub get_elements {
   my ($self) = @_;
   return @{ $self->{array} };
}

sub sort {
   my ($self) = @_;
   @{ $self->{array} } = sort @{ $self->{array} };
}

sub push {
   my $self = shift;
   push @{ $self->{array} }, @_;
}

sub pop {
   my ($self, $n) = @_;
   return splice(@{ $self->{array} }, 0, $n//1);
}

my $array = MyArray->new(1,4,2,6,1,8,5,5,2);
$array->sort;
print("$_\n") for $array->get_elements();
$array->push_array(1..9);
$array->pop_array(3);

インターフェイスを少し改善しました。(ソートは印刷すべきではありません。異なるものをプッシュして、3 つの要素以外をポップするとよいでしょう。)

于 2015-02-27T14:07:38.010 に答える