То, почему я должен использовать марионетку, параметризовало класс?

А-ч, это должно использовать файл сокета вместо порта.

mysql --socket=/home/user1/opt/mysqld/mysql.sock -uroot добился цели.

12
задан 28 February 2011 в 05:58
2 ответа

Параметризованные классы являются конструкцией языка, чтобы помочь Вам структурировать свой код лучше. Это предотвращает Вас от чрезмерного использования глобальных переменных (как в Вашем примере).

Предположите включение еще 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 класс для каждого узла.

Документ об эволюции языка Марионетки и конечно руководство языка обеспечивает некоторые хорошие примеры того, как использовать параметризованные классы и объяснение позади этой конструкции языка:

12
ответ дан 2 December 2019 в 21:34

Лучший способ думать об этом состоит в том, чтобы прибыть в него с начала вместо того, чтобы запуститься с уже знания Марионеточных идиом.

Что Вы пытаетесь сделать, во-первых параметры передачи в класс — Вы даете ему информацию, в которой он нуждается, чтобы решить, как вести себя, точно так же, как передающие аргументы функции. Скажите, что это было жемчугом, и у Вас была функция, вызванная multiply_squares. Вы назвали бы его как multiply_squares(3, 4), не устанавливает некоторые глобальные переменные на 3 и 4 и затем читают их из функции!

Но исторически, Марионеточный код должен был сделать это с глобальными переменными или динамическим контекстом, потому что потребность сделать это возникла, прежде чем язык был разработан, чтобы сделать это. Лично, я думаю когда-то, что параметризованные классы становятся более развитыми и более широко развернутыми, они в основном сделают переменные проблемы объема предметом прошлого, потому что имение в наличии правильного инструмента для задания устранит целый слой пугающих взломов.

8
ответ дан 2 December 2019 в 21:34

Теги

Похожие вопросы