Neden bir kukla parametreli sınıf kullanmalıyım?


12

Genellikle karmaşık kukla modülleriyle çalışırken, düğüm düzeyinde veya bir sınıf içinde değişkenler ayarlayacağım. Örneğin,

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

Parametrelendirilmiş sınıflar bu durum nasıl / ne zaman / neden yardımcı olur? Kukla modüllerinizi yapılandırmak için parametreli sınıfları nasıl kullanıyorsunuz?


2
Bu örneği bulan herkese dikkat edin, bu kod, Kukla sürümü <3.0'da izin verilen genel değişken aramalarını gösterir. Kukla> 3.0'da, değişkenlerin kapsam dışına erişemezsiniz ve değişkenlere erişmek için ad alanını kullanmanız gerekir. Bu örnekte, ilgili değişkenlere erişmeniz $bar::file_nameve $::file_ownerbu değişkenlere erişmeniz gerekir. Ancak parametreli sınıfları kullanırken, parametreler yoluyla bir sınıfa geçirilen değişkenler yerel olarak kapsamlandırılmış değişkenler haline gelir.
robbyt

Yanıtlar:


12

Parametreli sınıflar, kodunuzu daha iyi yapılandırmanıza yardımcı olacak bir dil yapısıdır. Küresel değişkenleri aşırı kullanmanızı önler (örneğin örneğiniz gibi).

Düğüm açıklamanıza 20 sınıf daha eklediğinizi ve hepsinin manifestin global veya düğüm kapsamında bazı değişkenlerin ayarlanmasını gerektirdiğini düşünün. Ayrıca parametreli sınıflar kolayca varsayılan parametrelere sahip olmanızı sağlar, böylece birkaç farklı yerde $file_owneraynı değeri (örneğin larry) sağlamak yerine varsayılan bir değer kullanabilirsiniz .

Örnek snippet'iniz (iki ek düğüme sahip) aşağıdaki gibi yazılabilir:

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

Genel değişkenleri kullandığınızda, $ownerher bir düğümde adlandırılmış bir değişken bildirmeniz gerekir ve düğüm $file_namebaşına değişkenin / parametrenin üzerine yazamazsınız. Bunun yerine bar, her düğüm için başka bir sınıf bildirmeniz gerekir .

Kukla'nın dil gelişimi ve elbette dil rehberi belgesi, parametreli sınıfların nasıl kullanılacağı ve bu dil yapısının arkasındaki mantık hakkında bazı iyi örnekler sunmaktadır:


8

Bunu düşünmenin en iyi yolu, Kukla deyimlerini zaten bilmekle başlamak yerine baştan başlamaktır.

İlk etapta yapmaya çalıştığınız şey, parametreleri bir sınıfa geçirmektir - tıpkı bir işleve argüman iletmek gibi, nasıl davranacağına karar vermek için ihtiyaç duyduğu bilgileri veriyorsunuz. Bunun perl olduğunu ve multiply_squares adlı bir fonksiyonunuz olduğunu varsayalım. Bunu ister arayacağını multiply_squares(3, 4)3 ve 4'e bazı küresel değişkenleri ayarlayın ve sonra işlevi içinde onları okuyamaz!

Ancak tarihsel olarak, Kukla kodu bunu küresel değişkenlerle veya dinamik kapsamla yapmak zorundaydı, çünkü dilin bunu yapmak için tasarlanmadan önce yapılması ihtiyacı ortaya çıktı. Şahsen, parametreli sınıflar biraz daha geliştiğinde ve daha yaygın bir şekilde konuşlandırıldığında, temelde değişken kapsam sorunlarını geçmişte kaldıracaklarını düşünüyorum, çünkü iş için doğru araca sahip olmak korkutucu hack'lerin tüm katmanını ortadan kaldıracaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.