เหตุใดฉันจึงควรใช้คลาสที่กำหนดพารามิเตอร์หุ่นเชิด


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

คลาส / parametrized มีวิธีการ / เมื่อ / ทำไมช่วยเมื่อสถานการณ์นี้? คุณใช้คลาสที่กำหนดพารามิเตอร์เพื่อจัดโครงสร้างโมดูลหุ่นเชิดของคุณอย่างไร


2
หมายเหตุสำหรับทุกคนที่พบตัวอย่างนี้รหัสนี้แสดงการค้นหาตัวแปรทั่วโลกที่ได้รับอนุญาตใน Puppet เวอร์ชัน <3.0 ใน Puppet> 3.0 คุณไม่สามารถเข้าถึงตัวแปรที่อยู่นอกขอบเขตและต้องใช้เนมสเปซเพื่อเข้าถึงตัวแปร ในตัวอย่างนี้คุณจะต้องใช้$bar::file_nameและ$::file_ownerเข้าถึงตัวแปรเหล่านั้นตามลำดับ อย่างไรก็ตามเมื่อใช้คลาส parametrized ตัวแปรที่ส่งผ่านไปยังคลาสผ่านพารามิเตอร์จะกลายเป็นตัวแปรที่กำหนดขอบเขตแบบโลคัล
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คลาสอื่นสำหรับแต่ละโหนด

เอกสารเกี่ยวกับวิวัฒนาการทางภาษาของ Puppet และแน่นอนว่าคู่มือภาษามีตัวอย่างที่ดีเกี่ยวกับวิธีใช้คลาสที่กำหนดพารามิเตอร์และเหตุผลที่อยู่เบื้องหลังโครงสร้างภาษานี้:


8

วิธีที่ดีที่สุดในการคิดเกี่ยวกับสิ่งนี้คือการเริ่มต้นตั้งแต่เริ่มต้นแทนที่จะเริ่มต้นด้วยการรู้สำนวนหุ่นกระบอก

สิ่งที่คุณพยายามทำในตอนแรกคือการส่งผ่านพารามิเตอร์ไปยังคลาส - คุณให้ข้อมูลที่ต้องการเพื่อตัดสินใจว่าจะทำตัวอย่างไรเช่นเดียวกับการส่งอาร์กิวเมนต์ไปยังฟังก์ชัน สมมติว่านี่เป็น Perl และคุณมีฟังก์ชันที่เรียกว่า multiply_squares คุณต้องการเรียกว่าmultiply_squares(3, 4)ไม่ตั้งค่าตัวแปรส่วนกลางบางอย่างเป็น 3 และ 4 แล้วอ่านจากข้างในฟังก์ชั่น!

แต่ในอดีตรหัสหุ่นกระบอกต้องทำเช่นนั้นกับตัวแปรทั่วโลกหรือขอบเขตไดนามิกเนื่องจากความจำเป็นที่จะต้องเกิดขึ้นก่อนที่ภาษาจะได้รับการออกแบบให้ทำ โดยส่วนตัวแล้วฉันคิดว่าเมื่อคลาสที่มีพารามิเตอร์ได้รับการพัฒนามากขึ้นและนำไปใช้อย่างกว้างขวางมากขึ้นพวกเขาจะทำให้ปัญหาขอบเขตตัวแปรเป็นเรื่องที่ผ่านมาโดยทั่วไปเพราะการมีเครื่องมือที่เหมาะสมสำหรับงานจะช่วยลดแฮ็กทั้งชั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.