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

Как правило, при работе со сложными кукольными модулями я устанавливаю переменные на уровне узла или внутри класса. например.

node 'foo.com' {
  $file_owner = "larry" 
  include bar 
}

class bar { 
  $file_name = "larry.txt"
  include do_stuff
}

class do_stuff {
  file { $file_name:
    ensure => file,
    owner  => $file_owner,
  }
}

Как /когда /почему параметризированные классы помогают в этой ситуации? Как вы используете параметризованные классы для структурирования ваших марионеточных модулей?

12 голосов | спросил robbyt 27 FebruaryEurope/MoscowbSun, 27 Feb 2011 01:38:09 +0300000000amSun, 27 Feb 2011 01:38:09 +030011 2011, 01:38:09

2 ответа


12

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

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

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

ответил joschi 27 FebruaryEurope/MoscowbSun, 27 Feb 2011 18:04:41 +0300000000pmSun, 27 Feb 2011 18:04:41 +030011 2011, 18:04:41
8

Лучший способ подумать об этом - прийти к нему с самого начала, а не начинать с того, что уже знает икону Кукольного.

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

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

ответил nfagerlund 27 FebruaryEurope/MoscowbSun, 27 Feb 2011 22:28:20 +0300000000pmSun, 27 Feb 2011 22:28:20 +030011 2011, 22:28:20

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132