2016-12-16 13 views
0

私は、私が見た中で最も人形の例で使用される重複の膨大な量であるように思わ何を避けたい取得:すべての人形クラスのパラメータ

class foo(
    String arg1 = '', 
    String arg2 = '' 
){ 
    # [email protected] is like [email protected] in POSIX shell 
    [email protected] {|k, v| if k[v] != '' { contain $v } } 
} 
ような、より実用的なものに

class foo(
    String arg1 = '', 
    String arg2 = '', 
    ... 
){ 
    if arg1 != '' { 
     ... 
    } 
    if arg2... 
} 

+2

キーが重要でない場合、引数は配列ではなく、それらの名前付きクラスをすべて含めるために 'contains $ values'を使うだけですか?この例は少し工夫されているようですが、より良い答えを出すために実際のマニフェストを見ることは有用でしょう。 –

+0

コンテンツの不足のためにブール条件式をラムダイテレータにリファクタリングすることで、ここで達成しようとしていることは本当に不明です。 –

+0

@DominicCleal \t良い例:https://github.com/example42/control-repo/blob/production/site/profile/manifests/base/linux.pp具体的には条件文へのパラメータの複製。 – nwmcsween

答えて

1

私が知っている[email protected]に相当する構造体がないので、私はすべてのデータを別々のパラメータの代わりにハッシュに入れることをお勧めします。すなわち

class foo(
    String $pre_class, 
    Hash[Enum['network', 'mail'], String] $classes = {}, 
){ 

あなたも、キーを必要としないので、使用するタイプHash[Enum['network', 'mail', '...'], String]を持つ単一のパラメータは固定文字列パラメータの数に非常に相当しますので、実行されているパラメータのいずれかの検証は、ありませんハッシュのすべての内容で十分でしょう。 values()は、stdlib関数です。

contain(values($classes)) 
Class[$pre_class] -> Class[values($classes)] 

あなたがfilter() functionを使用し、その後、空の値を削除するために必要な場合:

$filtered_classes = $classes.filter |$type_name, $class_name| { $class_name != '' } 

私は与えられたクラスは非常に一般的なモジュールであるとは思わないことを追加する必要があります。これはプロファイルモジュールであり、非常に汎用的で再利用可能に設計されています。おそらく、より一般的なローカルで書かれたプロファイルモジュールは、クラス名がパラメータ値として与えられ、ハードコーディングされた振る舞いを持つほどです。

関連する問題