0

このような「make_members」メソッドがあるとします。

sub make_members {  
    my ($number_members) = @_;
    my $rows = SomeDBIModule->select(); 
    my $count = @$rows;             
    for ( my $i = $count + 1; $i < $count + 1 + $number_members; $i++ ) {
          $rows->insert(
              name => "name".$i, 
              type => "A",
              created_at => time,                 
         );                    
   }                                                        
 } 

ここまでは順調ですね。ここで、メソッドが入力として受け取ることができると想像してください。ユーザーの数は、必要なタイプ a、タイプ b、およびタイプ c です。

sub make_members {  
    my ($number_members, $n_members_type_a, $n_members_type_b, $n_members_type_c) = @_;
    #....

これを書いて最初に頭に浮かぶのは、3 つのループを作成することです。最初の1つ

     for ( my $i = $count + 1; $i < $count + 1 + $n_members_type_a; $i++ ){
          $rows->insert(
              name => "name".$i, 
              type => "A",
      #....

$count + 1 と $n_members_type_b の間の 2 つ目。$count + 1 と $n_members_type_c の間の 3 つ目。

それは長すぎてひどいように見えます。これを書くより良い方法はありますか?

4

2 に答える 2

2

「3 つ以上、a を使用for」。

別のループ内にパックするだけです

sub make_members {
  my %number_members_for_type;
  @number_members_for_type{qw/A B C/} = @_;
  my $rows = ...;
  while (my ($type, $num) = each %number_members_for_type) {
    for my $i ( @$rows + 1 .. @$rows + $num ) {
      $rows->insert(
        name => "name$i",
        type => $type,
        ...
      )
    }
  }
}

これは、 like と呼ばれることを前提としていmake_members($n_type_a, $n_type_b, $n_type_c)ます。

引数にハッシュを使用すると、これを適切にスケーリングできます。

ハッシュが引数として渡される場合、これを一般化できます。nameプロパティが一意の ID である必要があり挿入がこの関数によってのみ行われる場合、それも同様にエレガントに管理できます。

sub make_inserter {
  my ($rows) = @_;
  my $id_counter = @$rows;
  return sub {
    my %type2nums = @_;
    while (my ($type, $num) = each %type2nums) {
      for my $i ($id_counter + 1 .. $id_counter + $num) {
        $rows->insert(
          name => "name$i",
          type => $type,
          ...
        );
      }
      $id_counter += $num;
    }
  };
}

...

# Careful! Do not make an inserter for the same handle twice!
my $make_members = make_inserter(SomeDBIModule->select);
$make_members->(A => 2, B => 3);

ハッシュキーの順序は定義されていないため、キーの順序が重要な場合は、むしろこれを行う必要があります。

  ... # as before
  return sub {
    while (my ($type, $num) = splice @_, 0, 2) {
      ... # as before
    }
  };
于 2013-08-27T07:09:27.230 に答える