انگلیسیفرانسویاسپانیایی

فاویکون OnWorks

perlootut - آنلاین در ابر

اجرای perlootut در ارائه دهنده هاست رایگان OnWorks از طریق Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS

این دستور perlootut است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.

برنامه:

نام


perlootut - آموزش برنامه نویسی شی گرا در پرل

تاریخ


این سند در فوریه 2011 ایجاد شد و آخرین ویرایش عمده در فوریه بود.
2013.

اگر در آینده این مطلب را می خوانید، این امکان وجود دارد که وضعیت این هنر را داشته باشد
تغییر کرد. توصیه می کنیم با خواندن سند perlootut در آخرین استیبل شروع کنید
انتشار پرل، به جای این نسخه.

شرح


این سند مقدمه ای بر برنامه نویسی شی گرا در پرل ارائه می دهد. آن آغاز می شود
با مروری کوتاه بر مفاهیم پشت طراحی شی گرا. سپس معرفی می کند
چندین سیستم OO مختلف از CPANhttp://search.cpan.org> که در بالای چه چیزی می سازند
پرل فراهم می کند.

به‌طور پیش‌فرض، سیستم OO داخلی پرل بسیار کم است و شما را به انجام بیشتر کارها می‌سپارد.
این مینیمالیسم در سال 1994 بسیار منطقی بود، اما در سال‌های پس از Perl 5.0 ما شاهد
تعدادی از الگوهای رایج در Perl OO ظاهر می شود. خوشبختانه، انعطاف پذیری پرل به a
اکوسیستم غنی از سیستم های Perl OO شکوفا می شود.

اگر می خواهید بدانید که Perl OO چگونه در زیر هود کار می کند، سند perlobj توضیح می دهد
جزئیات شن و ماسه.

این سند فرض می کند که شما از قبل اصول دستور Perl، متغیر را درک کرده اید
انواع، اپراتورها و تماس های زیر روال. اگر هنوز این مفاهیم را درک نکرده اید، لطفا
ابتدا perlintro را بخوانید. همچنین باید اسناد perlsyn، perlop و perlsub را مطالعه کنید.

شی گرا بنیادها


اکثر سیستم های شی دارای تعدادی مفاهیم مشترک هستند. احتمالاً اصطلاحاتی مانند این را شنیده اید
"کلاس"، "شیء، "روش" و "ویژگی" قبل از آن. درک مفاهیم باعث می شود
خواندن و نوشتن کدهای شی گرا بسیار آسان تر است. اگر قبلاً با آن آشنا هستید
این عبارات، شما همچنان باید این بخش را مرور کنید، زیرا هر مفهوم را به صورت عباراتی توضیح می دهد
اجرای OO پرل.

سیستم OO پرل مبتنی بر کلاس است. OO مبتنی بر کلاس نسبتاً رایج است. این توسط جاوا، C++ استفاده می شود،
سی شارپ، پایتون، روبی و بسیاری از زبان های دیگر. پارادایم های شی گرایی دیگری نیز وجود دارد
همچنین. جاوا اسکریپت محبوب ترین زبان برای استفاده از پارادایم دیگری است. OO جاوا اسکریپت
سیستم مبتنی بر نمونه اولیه است.

شیء
An هدف یک ساختار داده ای است که داده ها و برنامه های فرعی را که بر روی آنها کار می کنند با هم ترکیب می کند
آن داده ها داده های یک شی نامیده می شود خواص، و زیر برنامه های آن نامیده می شود روش.
یک شی را می توان به عنوان یک اسم (یک شخص، یک وب سرویس، یک کامپیوتر) در نظر گرفت.

یک شی نشان دهنده یک چیز مجزا است. به عنوان مثال، یک شی ممکن است نشان دهنده a باشد
فایل. ویژگی های یک شی فایل ممکن است شامل مسیر، محتوا و آخرین آن باشد
زمان اصلاح اگر یک شی برای نشان دادن ایجاد کنیم / etc / hostname روی ماشینی به نام
"foo.example.com"، مسیر آن شی خواهد بود "/ etc / hostname"، محتوای آن خواهد بود
"foo\n" و آخرین زمان اصلاح 1304974868 ثانیه از ابتدا خواهد بود
از دوران

متدهای مرتبط با یک فایل ممکن است شامل "rename()" و "write()" باشد.

در پرل بیشتر اشیا هش هستند، اما سیستم های OO که ما توصیه می کنیم شما را از این کار باز می دارند
نگران این موضوع در عمل، بهتر است ساختار داده داخلی یک شی را در نظر بگیرید
مات.

طبقه
A کلاس رفتار دسته ای از اشیاء را تعریف می کند. کلاس نام یک دسته است
(مانند "File")، و یک کلاس نیز رفتار اشیاء را در آن دسته تعریف می کند.

همه اشیا متعلق به یک کلاس خاص هستند. مثلا ما / etc / hostname شی متعلق به
کلاس "فایل". وقتی می خواهیم یک شی خاص بسازیم، با کلاس آن شروع می کنیم و
ساختن or نمونه کردن یک شی یک شی خاص اغلب به عنوان یک نام شناخته می شود نمونه
یک کلاس

در پرل، هر بسته ای می تواند یک کلاس باشد. تفاوت بین بسته ای که یک کلاس است و
یکی که نیست بر اساس نحوه استفاده از بسته است. در اینجا "اعلامیه کلاس" ما برای
کلاس "فایل":

فایل بسته;

در پرل کلمه کلیدی خاصی برای ساخت یک شی وجود ندارد. با این حال، اکثر ماژول های OO
در CPAN از متدی به نام "new()" برای ساخت یک شی جدید استفاده کنید:

my $hostname = File->new(
مسیر => '/ etc / hostname',
محتوا => "foo\n"،
last_mod_time => 1304974868،
);

(در مورد آن عملگر "->" نگران نباشید، بعداً توضیح داده خواهد شد.)

برکت

همانطور که قبلاً گفتیم، اکثر اشیاء پرل هش هستند، اما یک شی می تواند نمونه ای از هر کدام باشد
نوع داده پرل (اسکالر، آرایه و غیره). تبدیل یک ساختار داده ساده به یک شی است
انجام شده توسط برکت آن ساختار داده با استفاده از تابع "bless" پرل.

در حالی که ما قویاً به شما پیشنهاد می کنیم که اشیاء خود را از ابتدا نسازید، اما باید این را بدانید
مدت برکت. مبارک ساختار داده (معروف به "یک مرجع") یک شی است. ما گاهی می گوییم
که یک شیء "برکت در یک کلاس" شده است.

هنگامی که یک مرجع برکت داده شد، تابع "blessed" از ماژول هسته Scalar::Util
می توانید نام کلاس آن را به ما بگویید. این زیر روال کلاس یک شی را پس از عبور از an برمی گرداند
شیء، و در غیر این صورت نادرست.

استفاده از Scalar::Util 'blessed';

print blessed($hash); # unef
print blessed($hostname); # فایل

سازنده

A سازنده یک شی جدید ایجاد می کند. در پرل، سازنده کلاس فقط روش دیگری است،
بر خلاف برخی از زبان های دیگر، که نحوی را برای سازنده ها ارائه می کنند. اکثر کلاس های پرل استفاده می کنند
"new" به عنوان نام سازنده آنها:

my $file = File->new(...);

مواد و روش ها
قبلاً یاد گرفتید که الف روش زیر برنامه ای است که روی یک شی عمل می کند. تو می توانی
روش را به عنوان چیزهایی که یک شی می تواند در نظر بگیرید do. اگر یک مفعول اسم باشد، پس
متدها افعال آن هستند (ذخیره، چاپ، باز).

در پرل، متدها به سادگی زیر روال هایی هستند که در بسته یک کلاس زندگی می کنند. روش ها هستند
همیشه برای دریافت شی به عنوان اولین آرگومان آنها نوشته می شود:

اطلاعات چاپی فرعی {
من $self = shift;

چاپ "این فایل در ", $self->path, "\n";
}

$file->print_info;
# فایل در / etc / hostname

چیزی که یک روش را خاص می کند این است چگونه آن نام. عملگر پیکان ("->") به پرل می گوید
ما یک روش فراخوانی می کنیم.

وقتی یک متد فراخوانی می کنیم، پرل متد را ترتیب می دهد دعوت کننده به عنوان تصویب شود
استدلال اول دعوت کننده یک نام فانتزی برای چیزی است که در سمت چپ فلش قرار دارد. در
invocant می تواند یک نام کلاس یا یک شی باشد. همچنین می‌توانیم آرگومان‌های اضافی را به آن ارسال کنیم
روش:

اطلاعات چاپی فرعی {
من $self = shift;
my $prefix = shift // "این فایل در ";

print $prefix, ", ", $self->path, "\n";
}

$file->print_info("فایل در " قرار دارد);
# فایل در آدرس قرار دارد / etc / hostname

خواص
هر کلاس می تواند خود را تعریف کند خواص. وقتی یک شی را نمونه سازی می کنیم، مقادیری را به آن اختصاص می دهیم
آن صفات به عنوان مثال، هر شی "File" یک مسیر دارد. صفات گاهی هستند
نام املاک.

پرل سینتکس خاصی برای ویژگی ها ندارد. در زیر هود، ویژگی ها اغلب به عنوان ذخیره می شوند
کلیدها در هش زیرین شی، اما نگران این نباشید.

توصیه می کنیم فقط از طریق به ویژگی ها دسترسی داشته باشید اکسسور مواد و روش ها. اینها روش هایی هستند که
می تواند مقدار هر ویژگی را دریافت یا تنظیم کند. قبلاً این را در "print_info()" دیدیم
به عنوان مثال، که "$self->path" را فراخوانی می کند.

شما همچنین ممکن است شرایط را ببینید گیرنده و ستر. این دو نوع اکسسوری هستند. یک گیرنده
مقدار ویژگی را دریافت می کند، در حالی که یک تنظیم کننده آن را تنظیم می کند. اصطلاح دیگر ستتر است جهش دهنده

مشخصه ها معمولاً به صورت فقط خواندنی یا خواندنی-نوشتنی تعریف می شوند. ویژگی های فقط خواندنی فقط می توانند
هنگامی که شی برای اولین بار ایجاد می شود تنظیم شود، در حالی که ویژگی های خواندن-نوشتن را می توان در هر زمان تغییر داد
زمان.

مقدار یک ویژگی ممکن است خود شی دیگری باشد. مثلا به جای برگشتن
کلاس "File" می تواند یک شیء DateTime را برگرداند
نشان دهنده آن ارزش

ممکن است کلاسی داشته باشید که هیچ ویژگی قابل تنظیم عمومی را نشان ندهد. نه
هر کلاس دارای ویژگی ها و متدهایی است.

پلی مورفیسم
پلی مورفیسم یک روش فانتزی برای گفتن این است که اشیاء از دو کلاس مختلف یک اشتراک دارند
API. به عنوان مثال، ما می توانیم کلاس های "File" و "WebPage" داشته باشیم که هر دو دارای یک هستند
روش "print_content()". این روش ممکن است خروجی متفاوتی برای هر کلاس تولید کند، اما
آنها یک رابط مشترک دارند.

در حالی که این دو کلاس ممکن است از بسیاری جهات متفاوت باشند، وقتی صحبت از "print_content()" می شود.
روش، آنها یکسان هستند. این بدان معناست که می‌توانیم متد "print_content()" را فراخوانی کنیم
روی یک شی از هر کلاس، و we نکن داشته باشد به دانستن چی کلاس la هدف متعلق به!

چند شکلی یکی از مفاهیم کلیدی طراحی شی گرا است.

وراثت
وراثت به شما امکان می دهد یک نسخه تخصصی از یک کلاس موجود ایجاد کنید. وراثت اجازه می دهد
کلاس جدید از متدها و ویژگی های کلاس دیگر استفاده مجدد می کند.

به عنوان مثال، ما می توانیم یک کلاس "File::MP3" ایجاد کنیم که ارث می برد از "پرونده". یک
"فایل::MP3" هست یک بیش خاص نوع "فایل". همه فایل‌های mp3 فایل هستند، اما همه فایل‌ها نیستند
فایل های mp3 هستند.

ما اغلب به روابط ارثی به عنوان اشاره می کنیم پدر و مادر کودک یا "superclass/subclass"
روابط گاهی اوقات می گوییم که کودک دارای یک هست یک رابطه با پدر و مادرش
کلاس.

"پرونده" یک است سوپرکلاس از "File::MP3"، و "File::MP3" یک است زیر کلاس از "پرونده".

فایل بسته::MP3;

استفاده از "پرونده" والد؛

ماژول والد یکی از چندین روشی است که پرل به شما امکان می دهد وراثت را تعریف کنید
روابط

پرل اجازه وراثت چندگانه را می دهد، به این معنی که یک کلاس می تواند از چندین به ارث ببرد
والدین. در حالی که این امکان پذیر است، ما قویاً آن را توصیه می کنیم. به طور کلی می توانید استفاده کنید
نقش برای انجام هر کاری که می توانید با ارث چندگانه انجام دهید، اما به روشی تمیزتر.

توجه داشته باشید که هیچ اشکالی در تعریف چندین زیر کلاس از یک کلاس وجود ندارد. این
هم رایج و هم بی خطر است. برای مثال، ممکن است "File::MP3::FixedBitrate" را تعریف کنیم و
کلاس های "File::MP3::VariableBitrate" برای تمایز بین انواع مختلف فایل های mp3.

برجسته روش و روش حل

وراثت به دو کلاس اجازه می دهد تا کد را به اشتراک بگذارند. به طور پیش فرض، هر متد در کلاس والد
در کودک نیز موجود است. کودک به صراحت می تواند باطل کردن روش یک والدین به
پیاده سازی خود را ارائه دهد. به عنوان مثال، اگر یک شی "File::MP3" داشته باشیم، آن را دارد
متد "print_info()" از "File":

my $cage = File::MP3->new(
path => 'mp3s/My-Body-Is-a-Cage.mp3',
محتوا => $mp3_data،
last_mod_time => 1304974868،
title => 'بدن من یک قفس است'،
);

$cage->print_info;
# فایل در mp3s/My-Body-Is-a-Cage.mp3 است

اگر بخواهیم عنوان mp3 را در احوالپرسی وارد کنیم، می‌توانیم روش را لغو کنیم:

فایل بسته::MP3;

استفاده از "پرونده" والد؛

اطلاعات چاپی فرعی {
من $self = shift;

چاپ "این فایل در ", $self->path, "\n";
چاپ "عنوان آن "، $self->title، "\n" است;
}

$cage->print_info;
# فایل در mp3s/My-Body-Is-a-Cage.mp3 است
# عنوان آن My Body Is a Cage است

فرآیند تعیین اینکه چه روشی باید استفاده شود نامیده می شود روش حل. چی
پرل ابتدا به کلاس شی نگاه می کند (در این مورد "File::MP3"). اگر آن کلاس
متد را تعریف می کند، سپس نسخه آن کلاس از متد فراخوانی می شود. اگر نه، پرل به نظر می رسد
در هر کلاس والدین به نوبت. برای "File::MP3"، تنها والد آن "File" است. اگر "فایل::MP3"
متد را تعریف نمی کند، اما "File" تعریف می کند، سپس Perl متد را در "File" فراخوانی می کند.

اگر "File" از "DataSource" به ارث برده شود، که از "Thing" به ارث رسیده است، آنگاه Perl نگه می دارد
در صورت لزوم به دنبال "بالا زنجیره" باشید.

فراخوانی صریح متد والد از فرزند امکان پذیر است:

فایل بسته::MP3;

استفاده از "پرونده" والد؛

اطلاعات چاپی فرعی {
من $self = shift;

$self->SUPER::print_info();
چاپ "عنوان آن "، $self->title، "\n" است;
}

بیت "SUPER::" به پرل می گوید که به دنبال "print_info()" در کلاس "File::MP3" باشد.
زنجیره ارثی وقتی کلاس والد را که این متد را پیاده سازی می کند، متد را پیدا می کند
نامیده میشود.

قبلاً به ارث چندگانه اشاره کردیم. مشکل اصلی وراثت چندگانه این است
که وضوح روش را بسیار پیچیده می کند. برای جزئیات بیشتر به perlobj مراجعه کنید.

کپسوله سازی
کپسوله سازی این ایده است که یک شی مات است. وقتی توسعه دهنده دیگری از شما استفاده می کند
کلاس، آنها نیازی به دانستن ندارند چگونه اجرا شده است، فقط باید بدانند چی دارد

کپسولاسیون به چند دلیل مهم است. اول، به شما اجازه می دهد تا آن را جدا کنید
عمومی API از پیاده سازی خصوصی. این بدان معنی است که شما می توانید آن پیاده سازی را تغییر دهید
بدون شکستن API

دوم، زمانی که کلاس ها به خوبی کپسوله شوند، زیرکلاس بندی آنها آسان تر می شود. در حالت ایده آل، الف
subclass از همان APIها برای دسترسی به داده های شی استفاده می کند که کلاس والد آن استفاده می کند. در واقعیت،
کلاس‌بندی فرعی گاهی شامل نقض کپسوله‌سازی می‌شود، اما یک API خوب می‌تواند آن را به حداقل برساند
نیاز به انجام این کار

قبلاً اشاره کردیم که اکثر اشیاء پرل به صورت هش در زیر هود پیاده سازی می شوند. در
اصل کپسوله سازی به ما می گوید که نباید به این تکیه کنیم. در عوض، ما باید
از روش های دسترسی برای دسترسی به داده های آن هش استفاده کنید. سیستم های شی که ما توصیه می کنیم
در زیر همه، تولید روش‌های دسترسی را خودکار می‌کند. اگر از یکی از آنها استفاده می کنید، باید
هرگز نباید مستقیماً به شیء به عنوان هش دسترسی داشته باشید.

ترکیب
در کدهای شی گرا، اغلب متوجه می شویم که یک شی به یک شی دیگر ارجاع می دهد. این هست
نام ترکیب، و یا یک دارد رابطه.

قبلاً اشاره کردیم که دسترسی‌دهنده «last_mod_time» کلاس «File» می‌تواند یک
شیء DateTime. این یک نمونه کامل از ترکیب است. حتی می توانستیم جلوتر برویم و
دسترسی‌های «مسیر» و «محتوا» را نیز به اشیاء برگردانند. کلاس "فایل" خواهد بود
پس بیا مرکب از چندین شی دیگر

نقش
نقش چیزی هستند که یک کلاس هستند میکند، به جای چیزی که آن را is. نقش ها هستند
نسبتاً برای پرل جدید است، اما نسبتاً محبوب شده اند. نقش ها هستند اعمال می شود به کلاس ها
گاهی می گوییم که کلاس ها مصرف نقش.

نقش ها جایگزینی برای وراثت برای ارائه چندشکلی هستند. فرض کنیم داریم
دو کلاس "رادیو" و "کامپیوتر". هر دوی این موارد دارای کلید روشن/خاموش هستند. ما می خواهیم که
مدلی که در تعاریف کلاس ما وجود دارد.

می‌توانیم هر دو کلاس را از یک والد مشترک، مانند «Machine» به ارث ببریم، اما نه همه
ماشین ها دارای کلید روشن/خاموش هستند. ما می توانیم یک کلاس والد به نام "HasOnOffSwitch" ایجاد کنیم، اما
که بسیار مصنوعی است رادیو و کامپیوتر تخصص این والدین نیستند.
این پدر و مادر واقعاً خلقت نسبتاً مضحکی است.

اینجاست که نقش ها وارد می شوند. ایجاد نقش "HasOnOffSwitch" بسیار منطقی است و
آن را برای هر دو کلاس اعمال کنید. این نقش یک API شناخته شده مانند ارائه "turn_on()" را تعریف می کند.
و متدهای "turn_off()".

پرل هیچ روش داخلی برای بیان نقش ها ندارد. در گذشته، مردم فقط گاز می گرفتند
گلوله و از ارث چندگانه استفاده کرد. امروزه چندین انتخاب خوب در CPAN وجود دارد
با استفاده از نقش ها

چه زمانی به استفاده کنید OO
شی گرایی بهترین راه حل برای هر مشکلی نیست. که در پرل بهترین تمرین
(کپی رایت 2004، منتشر شده توسط O'Reilly Media, Inc.)، دامیان کانوی فهرستی از
معیارهایی که باید هنگام تصمیم گیری در مورد اینکه آیا OO مناسب مشکل شما است استفاده کنید:

· سیستم در حال طراحی بزرگ است یا احتمالاً بزرگ می شود.

· داده ها را می توان در ساختارهای واضح جمع کرد، به خصوص اگر حجم زیادی وجود داشته باشد
مقدار داده در هر مجموع

· انواع مختلف تجمیع داده ها یک سلسله مراتب طبیعی را تشکیل می دهند که استفاده را تسهیل می کند
وراثت و چندشکلی

· شما تکه ای از داده ها دارید که عملیات های مختلف زیادی روی آن اعمال می شود.

· شما باید همان عملیات کلی را روی انواع داده های مرتبط انجام دهید، اما با
تغییرات جزئی بسته به نوع خاصی از داده هایی که عملیات اعمال می شود
به.

· این احتمال وجود دارد که بعداً باید انواع داده های جدید را اضافه کنید.

· تعاملات معمولی بین قطعات داده به بهترین وجه توسط اپراتورها نشان داده می شود.

· اجرای اجزای منفرد سیستم احتمالاً تغییر خواهد کرد
زمان.

· طراحی سیستم قبلاً شی گرا است.

· تعداد زیادی از برنامه نویسان دیگر از ماژول های کد شما استفاده خواهند کرد.

PERL OO سیستم های


همانطور که قبلاً نیز اشاره کردیم، سیستم OO داخلی پرل بسیار کم است، اما کاملاً هم
قابل انعطاف. در طول سال ها، بسیاری از مردم سیستم هایی را توسعه داده اند که بر روی Perl ساخته شده است
سیستم داخلی برای ارائه ویژگی ها و راحتی بیشتر.

اکیدا توصیه می کنیم از یکی از این سیستم ها استفاده کنید. حتی مینیمال ترین آنها
بسیاری از دیگ های تکراری را حذف می کند. واقعا دلیل خوبی برای نوشتن شما وجود ندارد
کلاس ها از ابتدا در پرل.

اگر به جرات نهفته در این سیستم ها علاقه مند هستید، perlobj را بررسی کنید.

گوزن شمالی
موس خود را به عنوان یک "سیستم شی پست مدرن برای Perl 5" معرفی می کند. نترس،
برچسب "پست مدرن" پاسخی است به توصیف لری از پرل به عنوان "اولین پست مدرن"
زبان کامپیوتر".

"Moose" یک سیستم OO کامل و مدرن را ارائه می دهد. بزرگترین تأثیر آن Common Lisp است
Object System، اما ایده هایی را نیز از Smalltalk و چندین زبان دیگر به عاریت گرفته است.
"موس" توسط استوان لیتل خلق شد و به شدت از کار او بر روی Perl 6 OO الهام گرفته است.
طرح.

در اینجا کلاس "File" ما با استفاده از "Moose" است:

فایل بسته;
استفاده از گوزن؛

has path => ( is => 'ro' );
دارای محتوا => ( is => 'ro' );
has last_mod_time => ( is => 'ro' );

اطلاعات چاپی فرعی {
من $self = shift;

چاپ "این فایل در ", $self->path, "\n";
}

"Moose" تعدادی ویژگی را ارائه می دهد:

· شکر اعلامی

"Moose" لایه ای از "قند" را برای تعریف کلاس ها فراهم می کند. آن شکر است
فقط مجموعه ای از توابع صادر شده است که بیان نحوه کار کلاس شما را ساده تر و ساده تر می کند
خوش طعم تر این به شما امکان می دهد توصیف کنید چی کلاس شما به جای اینکه مجبور باشید بگویید
پرل چگونه برای اجرای کلاس شما

زیرروال "has()" یک ویژگی را اعلام می کند و "Moose" به طور خودکار ایجاد می کند
ابزارهای دسترسی برای این ویژگی ها همچنین از ایجاد یک متد "new()" برای
شما. این سازنده در مورد ویژگی هایی که شما اعلام کرده اید می داند، بنابراین می توانید آنها را تنظیم کنید
هنگام ایجاد یک "فایل" جدید.

· نقش های ساخته شده در

"Moose" به شما امکان می دهد نقش ها را به همان روشی که کلاس ها را تعریف می کنید تعریف کنید:

بسته HasOnOfSwitch.
استفاده از Moose::Role;

has is_on => (
=> 'rw' است،
isa => 'Bool',
);

زیر روشن کردن {
من $self = shift;
$self->روشن است(1)؛
}

خاموش کردن فرعی {
من $self = shift;
$self->روشن است(0)؛
}

· یک سیستم نوع مینیاتوری

در مثال بالا، می توانید ببینید که "isa => 'Bool'" را به "has()" منتقل کردیم.
ایجاد ویژگی "is_on" ما. این به "موس" می گوید که این ویژگی باید a باشد
مقدار بولی اگر بخواهیم آن را روی یک مقدار نامعتبر تنظیم کنیم، کد ما با خطا مواجه می شود.

· درون نگری و دستکاری کامل

ویژگی های درون نگری داخلی پرل نسبتاً کم است. "گوزن" در بالای آن می سازد
آنها را تشکیل می دهد و یک لایه درون نگری کامل برای کلاس های شما ایجاد می کند. این به شما اجازه می دهد بپرسید
سوالاتی مانند "کلاس File چه متدهایی را پیاده سازی می کند؟" همچنین به شما امکان تغییر می دهد
کلاس های شما به صورت برنامه ای

· خود میزبان و قابل توسعه

"Moose" خود را با استفاده از API درون نگری خود توصیف می کند. علاوه بر اینکه یک ترفند جالب است،
این بدان معنی است که شما می توانید "Moose" را با استفاده از خود "Moose" گسترش دهید.

· اکوسیستم غنی

یک اکوسیستم غنی از پسوندهای "Moose" در CPAN تحت MooseX وجود دارد
<http://search.cpan.org/search?query=MooseX&mode=dist> فضای نام. علاوه بر این، بسیاری از
ماژول ها در CPAN قبلاً از "Moose" استفاده می کنند و مثال های زیادی برای یادگیری در اختیار شما قرار می دهد
از جانب.

· بسیاری از ویژگی های بیشتر

"موس" ابزار بسیار قدرتمندی است و ما نمی توانیم همه ویژگی های آن را در اینجا پوشش دهیم. ما
شما را تشویق می کند تا با خواندن مستندات "گوزن"، ابتدا بیشتر بیاموزید
گوزن::دستیhttp://search.cpan.org/perldoc?Moose::دستی>.

البته «گوزن» بی نقص نیست.

"Moose" می تواند بارگذاری کد شما را کندتر کند. «گوزن» خودش کوچک نیست و یک خیلی
از تولید کد زمانی که کلاس خود را تعریف می کنید. این تولید کد به این معنی است که شما
کد زمان اجرا تا جایی که می تواند سریع است، اما زمانی که ماژول های شما اول هستند هزینه آن را پرداخت می کنید
لود شده.

زمانی که سرعت راه‌اندازی مهم است، مانند a.، این ضربه زمان بارگذاری می‌تواند مشکل ساز باشد
اسکریپت خط فرمان یا یک اسکریپت CGI "وانیلی ساده" که باید هر بار بارگیری شود
اجرا شده.

قبل از اینکه وحشت کنید، بدانید که بسیاری از افراد از "موس" برای ابزارهای خط فرمان و موارد دیگر استفاده می کنند
کد حساس به راه اندازی ما شما را تشویق می کنیم قبل از اینکه نگران باشید، ابتدا "موز" را امتحان کنید
سرعت راه اندازی

"Moose" همچنین وابستگی های مختلفی به ماژول های دیگر دارد. بیشتر اینها پایه کوچک هستند
ماژول های تنهایی که تعدادی از آنها از "موس" جدا شده اند. خود "گوزن" و برخی
از وابستگی های آن، به یک کامپایلر نیاز دارد. اگر نیاز به نصب نرم افزار خود بر روی سیستم دارید
بدون کامپایلر یا در صورت داشتن هر وابستگی ها یک مشکل است، پس ممکن است "موس" مشکلی نداشته باشد
مناسب تو.

صدای گاو

اگر "Moose" را امتحان کردید و متوجه شدید که یکی از این مشکلات شما را از استفاده از "Moose" منع می کند،
ما شما را تشویق می کنیم که Moo را در نظر بگیرید. "Moo" زیر مجموعه ای از "Moose" را پیاده سازی می کند
عملکرد در یک بسته ساده تر برای اکثر ویژگی هایی که اجرا می کند، پایان
کاربر API است یکسان به "Moose"، به این معنی که می توانید کاملاً از "Moo" به "Moose" تغییر دهید
به راحتی.

"Moo" بیشتر API درون نگری "Moose" را پیاده سازی نمی کند، بنابراین زمانی که
در حال بارگذاری ماژول های شما علاوه بر این، هیچ یک از وابستگی های آن به XS نیاز ندارد، بنابراین می تواند باشد
بر روی ماشین های بدون کامپایلر نصب می شود.

یکی از قانع کننده ترین ویژگی های "Moo" قابلیت همکاری آن با "Moose" است. وقتی کسی
سعی می کند از API درون نگری "Moose" در یک کلاس یا نقش "Moo" استفاده کند، این به طور شفاف است.
تبدیل به یک کلاس یا نقش "گوزن". این کار استفاده از "Moo" را آسان‌تر می‌کند
کد را در یک پایه کد "Moose" و بالعکس.

به عنوان مثال، یک کلاس "Moose" می تواند یک کلاس "Moo" را با استفاده از "extends" یا مصرف یک "Moo" زیر کلاس قرار دهد.
نقش با استفاده از "با".

نویسندگان "موس" امیدوارند که روزی بتوان "مو" را با بهبود "موس" منسوخ کرد.
به اندازه کافی، اما در حال حاضر جایگزین ارزشمندی برای "موز" ارائه می دهد.

کلاس::دستیار
Class::Accessor نقطه مقابل قطبی "Moose" است. این ویژگی های بسیار کمی را ارائه می دهد، و اینطور نیست
خود میزبانی

با این حال، پرل بسیار ساده و خالص است و هیچ وابستگی غیر اصلی ندارد. آن را نیز
برای ویژگی هایی که پشتیبانی می کند یک API «موز مانند» در صورت تقاضا ارائه می دهد.

حتی اگر کار زیادی انجام نمی دهد، همچنان ترجیح داده می شود که کلاس های خود را از آن بنویسید
خراش

در اینجا کلاس "File" ما با "Class::Accessor" آمده است:

فایل بسته;
استفاده از Class::Accessor 'antlers';

has path => ( is => 'ro' );
دارای محتوا => ( is => 'ro' );
has last_mod_time => ( is => 'ro' );

اطلاعات چاپی فرعی {
من $self = shift;

چاپ "این فایل در ", $self->path, "\n";
}

پرچم واردات "شاخ" به "Class::Accessor" می گوید که می خواهید ویژگی های خود را تعریف کنید.
با استفاده از نحو شبیه "Moose". تنها پارامتری که می توانید به "has" بدهید "is" است. ما
اگر «Class::Accessor» را انتخاب می‌کنید، توصیه می‌کنیم که از این نحو شبیه به Moose استفاده کنید
به این معنی است که اگر بعداً تصمیم به رفتن به "موز" بگیرید، مسیر ارتقای هموارتری خواهید داشت.

مانند "Moose"، "Class::Accessor" متدهای دسترسی و سازنده ای را برای شما ایجاد می کند
کلاس.

کلاس::کوچک
در نهایت Class::Tiny را داریم. این ماژول واقعاً مطابق با نام خود است. فوق العاده ای دارد
حداقل API و مطلقاً هیچ وابستگی به پرل اخیر وجود ندارد. با این حال، ما فکر می کنیم این مقدار زیادی است
استفاده آسان تر از نوشتن کد OO خود از ابتدا است.

یک بار دیگر کلاس "فایل" ما در اینجا آمده است:

فایل بسته;
استفاده از Class::Tiny qw( مسیر محتوای last_mod_time );

اطلاعات چاپی فرعی {
من $self = shift;

چاپ "این فایل در ", $self->path, "\n";
}

خودشه!

با "Class::Tiny"، همه ابزارهای دسترسی خواندن و نوشتن هستند. این یک سازنده برای شما تولید می کند
و همچنین دسترسی هایی که تعریف می کنید.

همچنین می توانید از Class::Tiny::Antlers برای نحوی شبیه به "Moose" استفاده کنید.

نقش::کوچک
همانطور که قبلاً اشاره کردیم، نقش ها جایگزینی برای وراثت ارائه می دهند، اما پرل این کار را نمی کند
هر گونه پشتیبانی نقش داخلی داشته باشید. اگر می خواهید از Moose استفاده کنید، با یک ابزار کامل همراه است
اجرای نقش با این حال، اگر از یکی از دیگر ماژول های OO توصیه شده ما استفاده می کنید، می توانید
هنوز از نقش‌ها با Role::Tiny استفاده می‌شود

"Role::Tiny" برخی از ویژگی های مشابه با سیستم نقش موس را ارائه می دهد، اما بسیار زیاد
بسته کوچکتر مهمتر از همه، هیچ نوع اعلان ویژگی را پشتیبانی نمی کند، بنابراین
شما باید این کار را با دست انجام دهید با این حال، مفید است و با "Class::Accessor" به خوبی کار می کند.
و "Class::Tiny"

OO سیستم خلاصه
در اینجا خلاصه ای کوتاه از گزینه هایی که پوشش دادیم آورده شده است:

· گوزن شمالی

"گوزن" حداکثر گزینه است. دارای بسیاری از ویژگی ها، یک اکوسیستم بزرگ، و یک
پایگاه کاربر پر رونق ما همچنین به طور خلاصه به Moo پرداختیم. "Moo" "Moose" Lite است، و a
جایگزین معقول زمانی که Moose برای برنامه شما کار نمی کند.

· کلاس::دستیار

"Class::Accessor" بسیار کمتر از "Moose" عمل می کند، و اگر پیدا کنید جایگزین خوبی است
"گوزن" قریب به اتفاق. این مدت طولانی است و به خوبی آزمایش شده است. آن را نیز
دارای حداقل حالت سازگاری "Moose" است که باعث می شود از "Class::Accessor" به سمت دیگر حرکت کنید
"گوزن" آسان است.

· کلاس::کوچک

"Class::Tiny" گزینه حداقلی مطلق است. هیچ وابستگی ندارد و تقریباً هیچ
نحو برای یادگیری این یک گزینه خوب برای یک محیط فوق العاده مینیمال و برای پرتاب است
بدون نگرانی در مورد جزئیات، به سرعت چیزی را با هم جمع کنید.

· نقش::کوچک

اگر خودتان را پیدا کردید، از «Role::Tiny» با «Class::Accessor» یا «Class::Tiny» استفاده کنید.
با در نظر گرفتن ارث چندگانه اگر با «گوزن» بروید، نقش خودش را دارد
پیاده سازی.

دیگر OO سیستم های
به معنای واقعی کلمه ده ها ماژول دیگر مرتبط با OO در CPAN علاوه بر مواردی که در اینجا توضیح داده شده است، وجود دارد.
و اگر با کد افراد دیگر کار می کنید، احتمالاً با یک یا چند مورد از آنها برخورد خواهید کرد.

علاوه بر این، تعداد زیادی کد در طبیعت، تمام OO خود را "با دست" و فقط با استفاده از Perl انجام می دهند
ویژگی های داخلی OO اگر نیاز به حفظ چنین کدی دارید، باید perlobj را بخوانید
دقیقاً درک کنید که OO داخلی پرل چگونه کار می کند.

نتیجه گیری


همانطور که قبلاً گفتیم، سیستم حداقل OO پرل منجر به انبوهی از سیستم های OO در CPAN شده است.
در حالی که شما هنوز می توانید به فلز لخت رها شوید و کلاس های خود را با دست بنویسید، وجود دارد
واقعاً دلیلی برای انجام این کار با پرل مدرن وجود ندارد.

برای سیستم های کوچک، Class::Tiny و Class::Accessor هر دو حداقل سیستم های شی را ارائه می دهند
که از دیگ بخار اولیه برای شما مراقبت می کند.

برای پروژه‌های بزرگ‌تر، Moose مجموعه‌ای غنی از ویژگی‌ها را ارائه می‌کند که به شما امکان می‌دهد روی آن تمرکز کنید
پیاده سازی منطق کسب و کار شما

ما شما را تشویق می‌کنیم که با Moose، Class::Accessor، و Class::Tiny برای دیدن بازی کنید و ارزیابی کنید.
کدام سیستم OO برای شما مناسب است.

با استفاده از خدمات onworks.net از perlootut آنلاین استفاده کنید


سرورها و ایستگاه های کاری رایگان

دانلود برنامه های ویندوز و لینوکس

دستورات لینوکس

Ad