Mengapa saya harus menggunakan kelas parameter boneka?

12

Secara umum ketika bekerja dengan modul boneka kompleks, saya akan mengatur variabel di tingkat simpul atau di dalam kelas. misalnya,

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

Bagaimana / kapan / mengapa kelas parametrized membantu ketika situasi ini? Bagaimana Anda menggunakan kelas parameterisasi untuk menyusun modul boneka Anda?

robbyt
sumber
2
Catatan untuk semua yang menemukan contoh ini, kode ini menunjukkan pencarian variabel global yang diizinkan dalam versi Wayang <3.0. Di Wayang> 3.0, Anda tidak dapat mengakses variabel di luar cakupan, dan harus menggunakan namespace untuk mengakses variabel. Dalam contoh ini, Anda harus menggunakan $bar::file_namedan $::file_ownermengakses variabel-variabel tersebut. Namun, ketika menggunakan kelas parametrized, variabel yang dikirimkan ke kelas melalui parameter menjadi variabel cakupan lokal.
robbyt

Jawaban:

12

Kelas parameter adalah konstruksi bahasa untuk membantu Anda menyusun kode Anda lebih baik. Ini mencegah Anda menggunakan variabel global secara berlebihan (seperti pada contoh Anda).

Bayangkan Anda menyertakan 20 kelas lagi dalam deskripsi simpul Anda dan semua akan memerlukan beberapa variabel yang diatur dalam lingkup global atau simpul manifes. Juga kelas parameterisasi memungkinkan Anda untuk memiliki parameter default dengan mudah, sehingga Anda dapat menggunakan nilai default untuk $file_ownerdaripada harus memberikan nilai yang sama (misalnya larry) di beberapa tempat berbeda.

Cuplikan contoh Anda (dengan dua node tambahan) dapat ditulis sebagai berikut:

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

Dengan penggunaan variabel global, Anda harus mendeklarasikan variabel bernama $ownerdi setiap node dan Anda tidak akan bisa menimpa $file_namevariabel / parameter per node. Sebagai gantinya Anda harus mendeklarasikan barkelas lain untuk setiap node.

Dokumen tentang evolusi bahasa Wayang dan tentu saja panduan bahasa memberikan beberapa contoh yang baik tentang bagaimana menggunakan kelas parameter dan alasan di balik konstruksi bahasa ini:

Joseph
sumber
8

Cara terbaik untuk memikirkan hal ini adalah dengan melakukannya sejak awal alih-alih mulai dengan mengetahui idiom Wayang.

Apa yang Anda coba lakukan di tempat pertama adalah mengirimkan parameter ke dalam kelas - Anda memberikan informasi yang diperlukan untuk memutuskan bagaimana berperilaku, seperti halnya meneruskan argumen ke suatu fungsi. Katakan ini perl dan Anda memiliki fungsi yang disebut multiply_squares. Anda akan menyebutnya seperti multiply_squares(3, 4), tidak mengatur beberapa variabel global menjadi 3 dan 4 dan kemudian membacanya dari dalam fungsi!

Namun secara historis, kode Wayang harus melakukan itu dengan variabel global atau ruang lingkup dinamis, karena kebutuhan untuk melakukannya muncul sebelum bahasa dirancang untuk melakukannya. Secara pribadi, saya pikir begitu kelas parameter mendapatkan sedikit lebih berkembang dan lebih luas digunakan, mereka pada dasarnya akan membuat masalah ruang lingkup variabel sesuatu dari masa lalu, karena memiliki alat yang tepat tersedia untuk pekerjaan itu akan menghilangkan seluruh lapisan peretasan yang menakutkan.

nfagerlund
sumber