Чому я повинен використовувати параметризований клас ляльок?


12

Як правило, працюючи зі складними модулями ляльок, я встановлюватиму змінні на рівні вузла або всередині класу. наприклад,

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,
  }
}

Як / коли / чому параметризовані класи допомагають у цій ситуації? Як ви використовуєте параметризовані класи для структури своїх лялькових модулів?


2
Зауважимо для всіх, хто знайде цей приклад, цей код показує глобальні перегляд змінних, які були дозволені у ляльковій версії <3.0. У Puppet> 3.0 ви не можете отримати доступ до змінних поза межами області, і ви повинні використовувати простір імен для доступу до змінних. У цьому прикладі вам доведеться використовувати $bar::file_nameта $::file_ownerотримати доступ до цих відповідних змінних. Однак при використанні параметризованих класів змінні, що передаються в клас через параметри, стають локально змінними.
robbyt

Відповіді:


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клас для кожного вузла.

Документ про еволюцію мови Лялечки та, звичайно, посібник з мов, дають кілька хороших прикладів використання параметризованих класів та обгрунтування цієї мовної конструкції:


8

Найкращий спосіб подумати над цим - це прийти до цього з самого початку, а не починати з того, що вже знає ідіоми лялечки.

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

Але історично кодовий код мав це робити з глобальними змінними або динамічною сферою, тому що потреба в цьому виникла ще до того, як мова була призначена для цього. Особисто я думаю, що коли параметризовані класи стануть дедалі більше розвиненими та широко розгорнутими, вони в основному зроблять проблему із змінним обсягом справою минулого, адже наявність потрібного інструменту для роботи усуне цілий шар страхітливих хак.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.