Параметризованные классы являются конструкцией языка, чтобы помочь Вам структурировать свой код лучше. Это предотвращает Вас от чрезмерного использования глобальных переменных (как в Вашем примере).
Предположите включение еще 20 классов в описание узла, и всем будут нужны некоторые переменные, устанавливаемые в глобальной декларации или объем узла. Также параметризованные классы позволяют Вам иметь параметры по умолчанию легко, таким образом, Вы могли использовать значение по умолчанию для $file_owner
вместо того, чтобы иметь необходимость обеспечить то же значение (например. larry
) в нескольких различных местах.
Ваш отрывок в качестве примера (с двумя дополнительными узлами) мог быть записан следующим образом:
node 'example.com' {
class { bar: }
}
node 'example.net' {
class { bar: owner = "harry" }
}
node 'example.net' {
class { bar: file_name = "barry.txt" }
}
class bar($owner = "larry", $file_name = "larry.txt") {
class { do_stuff: owner => $owner, file_name => $file_name }
}
class do_stuff($owner, $file_name) {
file { $file_name:
ensure => file,
owner => $owner,
}
}
С Вашим использованием глобальных переменных необходимо было бы объявить названную переменную $owner
в каждом узле и Вы не смогли бы перезаписать $file_name
переменная/параметр на узел. Вместо этого необходимо было бы объявить другого bar
класс для каждого узла.
Документ об эволюции языка Марионетки и конечно руководство языка обеспечивает некоторые хорошие примеры того, как использовать параметризованные классы и объяснение позади этой конструкции языка:
Лучший способ думать об этом состоит в том, чтобы прибыть в него с начала вместо того, чтобы запуститься с уже знания Марионеточных идиом.
Что Вы пытаетесь сделать, во-первых параметры передачи в класс — Вы даете ему информацию, в которой он нуждается, чтобы решить, как вести себя, точно так же, как передающие аргументы функции. Скажите, что это было жемчугом, и у Вас была функция, вызванная multiply_squares. Вы назвали бы его как multiply_squares(3, 4)
, не устанавливает некоторые глобальные переменные на 3 и 4 и затем читают их из функции!
Но исторически, Марионеточный код должен был сделать это с глобальными переменными или динамическим контекстом, потому что потребность сделать это возникла, прежде чем язык был разработан, чтобы сделать это. Лично, я думаю когда-то, что параметризованные классы становятся более развитыми и более широко развернутыми, они в основном сделают переменные проблемы объема предметом прошлого, потому что имение в наличии правильного инструмента для задания устранит целый слой пугающих взломов.