มูส (เพิร์ล)
Mooseเป็นส่วนขยายของ ระบบ วัตถุของภาษาการเขียนโปรแกรมPerl วัตถุประสงค์ที่ระบุไว้[ 1 ]คือการนำ คุณสมบัติภาษา การเขียนโปรแกรมเชิงวัตถุ สมัยใหม่ มาสู่ Perl 5 และทำให้การเขียนโปรแกรม Perl เชิงวัตถุมีความสอดคล้องกันมากขึ้นและไม่น่าเบื่อ
คุณสมบัติ
Moose สร้างขึ้นบนClass::MOPMetaObject Protocol (MOP) โดยใช้ MOP ทำให้ Moose สามารถตรวจสอบประเภท ได้อย่างสมบูรณ์ สำหรับคลาสทั้งหมดที่ใช้ Moose
ชั้นเรียน
Moose อนุญาตให้นักโปรแกรมเมอร์สร้างคลาส ได้ :
- คลาสจะมีแอตทริบิวต์ ตั้งแต่ศูนย์ถึงมากกว่าหนึ่ง รายการ
- คลาสจะมีเมธอดตั้งแต่ศูนย์เมธอดขึ้นไป
- คลาสหนึ่งๆ สามารถมีคลาสแม่ (หรือคลาสหลัก) ได้ตั้งแต่ศูนย์คลาสขึ้นไปคลาสจะสืบทอดคุณสมบัติจากคลาสแม่ของมัน Moose รองรับการสืบทอดแบบหลายทาง
- คลาสหนึ่งๆ อาจมีตัวแก้ไขเมธอดได้ตั้งแต่ศูนย์ตัวขึ้นไป ตัวแก้ไขเหล่านี้สามารถใช้กับเมธอดของคลาสเอง เมธอดที่สืบทอดมาจากคลาสบรรพบุรุษ หรือเมธอดที่กำหนดโดยบทบาทต่างๆ ได้
- คลาสทำหน้าที่ตั้งแต่ศูนย์บทบาทขึ้นไป (ซึ่งในภาษาโปรแกรมอื่นๆ เรียกว่าtrait )
- คลาสจะมีคอนสตรัคเตอร์และดีสตรัคเตอร์
- คลาสหนึ่งจะมีเมตาคลาส
คุณลักษณะ
แอตทริบิวต์คือคุณสมบัติของคลาสที่กำหนดแอตทริบิวต์นั้น
- คุณลักษณะทุกอย่างย่อมมีชื่อ และอาจมีลักษณะเฉพาะอื่นๆ อีกหลายประการ
- คุณลักษณะของแอตทริบิวต์อาจรวมถึงแฟล็กการอ่าน/เขียน ประเภทชื่อเมธอดการเข้าถึงการมอบหมายค่าเริ่มต้นและการเริ่มต้นแบบไม่ทันที
บทบาท
บทบาทใน Moose นั้นอิงตามคุณลักษณะโดยทำหน้าที่คล้ายกับมิกซ์อินแต่ประกอบขึ้นในแนวนอนแทนที่จะเป็นการสืบทอด นอกจากนี้ยังคล้ายกับอินเทอร์เฟซ อยู่บ้าง แต่ต่างจากบางการใช้งานของอินเทอร์เฟซตรงที่สามารถให้การใช้งานเริ่มต้นได้ บทบาทสามารถนำไปใช้กับอินสแตนซ์แต่ละตัวรวมถึงคลาสได้ด้วย
- บทบาทหนึ่งๆ จะมีคุณลักษณะตั้งแต่ศูนย์ถึงมากกว่าหนึ่งอย่าง
- บทบาทหนึ่งอาจมีเมธอดตั้งแต่ศูนย์ถึงมากกว่าหนึ่งเมธอด
- บทบาทหนึ่งมีตัวปรับแต่งวิธีการตั้งแต่ศูนย์ตัวขึ้นไป
- บทบาทหนึ่งๆ จะมีวิธีการที่จำเป็นอย่างน้อยศูนย์วิธีขึ้นไป
ส่วนขยาย
มีโมดูลเสริม Moose จำนวนมากบนCPAN ณเดือนกันยายน2555 มีโมดูล 855 โมดูลใน 266 การแจกจ่ายในเนมสเปซ MooseX [ 2 ]ส่วนใหญ่สามารถติดตั้งได้โดยเลือกด้วยโมดูล Task::Moose [ 3 ]
ตัวอย่าง
นี่คือตัวอย่างของคลาสPointและคลาสย่อยPoint3D :
แพ็คเกจพอยต์ ; ใช้มูส ; ใช้คาร์ป ; มี'x' => ( isa => 'Num' , is => 'rw' ); มี'y' => ( isa => 'Num' , is => 'rw' ); sub clear { my $self = shift ; $self- > x ( 0 ); $self- > y ( 0 ); } sub set_to { @_ == 3 หรือcroak "จำนวนอาร์กิวเมนต์ไม่ถูกต้อง" ; my $self = shift ; my ( $x , $y ) = @_ ; $self- > x ( $x ); $self- > y ( $y ); } แพ็คเกจPoint3D ; ใช้Moose ; ใช้Carp ; ขยาย'Point' ; มี'z' => ( isa => 'Num' , is => 'rw' ); หลังจาก'clear' => sub { my $self = shift ; $self- > z ( 0 ); }; sub set_to { @_ == 4 หรือcroak "จำนวนอาร์กิวเมนต์ไม่ถูกต้อง" ; my $self = shift ; my ( $x , $y , $z ) = @_ ; $self- > x ( $x ); $self- > y ( $y ); $self- > z ( $z ); } มีset_to()เมธอดใหม่ใน คลาส Point3Dดังนั้นเมธอดที่มีชื่อเดียวกันซึ่งกำหนดไว้ใน คลาส Pointจะไม่ถูกเรียกใช้ในกรณีของอินสแตนซ์Point3Dในทางกลับกัน เมธอดนั้นไม่ได้ถูกแทนที่ แต่ถูกขยายเพิ่มเติมในคลาสย่อย ดังนั้นทั้งสองเมธอดจึงทำงานตามลำดับที่ถูกต้องclear()
วิธีการนี้ใช้ส่วนขยายเช่นเดียวกันMooseX::Declare:
ใช้MooseX::Declare ; คลาสPoint { มี'x' => ( isa => 'Num' , is => 'rw' ); มี'y' => ( isa => 'Num' , is => 'rw' ); เมธอดclear { $self- > x ( 0 ); $self- > y ( 0 ); } method set_to ( Num $x , Num $y ) { $self- > x ( $x ); $self- > y ( $y ); } } class Point3D extends Point { has 'z' => ( isa => 'Num' , is => 'rw' ); หลังจากล้าง { $self- > z ( 0 ); } method set_to ( Num $x , Num $y , Num $z ) { $self- > x ( $x ); $self- > y ( $y ); $self- > z ( $z ); } } ดูเพิ่มเติม
- Raku (ภาษาโปรแกรม) § การเขียนโปรแกรมเชิงวัตถุ ซึ่งเป็นแรงบันดาลใจให้กับ Moose
- Catalyst (ซอฟต์แวร์)คือเฟรมเวิร์กสำหรับการพัฒนาเว็บแอปพลิเคชันโดยใช้ Moose
ลิงก์ภายนอก
- หน้าแรกของ Moose
- เอกสารเกี่ยวกับกวางมูส