مقدمه ای بر برنامه نویسی شی گرا


مقدمه ای بر برنامه نویسی شی گرا

 

برنامه نویسی شی گرا در راستای حل مشکلاتی که دست به گریبان پروژه های نرم افزاری بزرگ بود، پا به عرصه وجود نهاد. در این پروژه ها برنامه نویسان زیادی درگیر اجرا و کدنویسی پروژه هستند. تصور کنید وقتی تعداد خطوط برنامه به ده ها یا هزاران خط کد برسد، هر تغییری که در خطی از برنامه داده شود، منجر به اثرات جانبی ناخواسته ای می شود.
هر زبان برنامه نویسی، نگرش متفاوتی به آبجکت ها دارد. PHP این نگرش را از زبان ++C به عاریه گرفته و نوع داده ای مهیا کرده است که می تواند در باطن خود و تحت یک شناسه، متغیرها و توابعی را شامل شود. وقتی PHP پا به عرصه وجود گذاشت و به ویرایش ۳ خود رسید، قادر به پشتیبانی از پروژه های با بیش از ۱۰۰ هزار خط کد را نداشت. با رشد تدریجی PHP و بالغ شدن Zend Engine، امکان نوشتن پروژه های عظیم با PHP میسر شد. البته جدا از اندازه پروژه، نوشتن اسکریپتها با بهره گیری از قدرت برنامه نویسی شی گرا و استفاده از کلاس ها، در استفاده مجدد از کدها کمک شایانی می کند و زمان و هزینه توسعه پروژه های بعدی را به مراتب کاهش می دهد و کار توسعه را دیگر کسل کننده و تکراری نخواهد کرد و زمان را برای توسعه ایده های جدید و تمرکز بر حل مشکلات دیگر بهینه می کند. در عین حال به اشتراک گذاردن کدها را هم امکان پذیر می کند.
ایده آبجکت ها از جمله مفاهیم بغرنج دانش کامپیوتر است. در نظر اول، درک آن مشکل به نظر می رسد، اما به محض اینکه مفهوم و فلسفه آن را متوجه شوید، دیگر به همه چیز به چشم آبجکت نگاه می کنید و سریعا خصوصیات و رفتارهای آن را در ذهن خود مجسم می کنید؛
اگر هنوز می خواهید در صف برنامه نویسان رویه ای و ماجولار بمانید، وقت خود را تلف نکنید و از ادامه خواندن مقاله منصرف شوید ولی اگر می خواهید امروزی و آتی نگر باشید، با من همراه باشید! ;)
به دوستان گروه اول یادآور می شوم، نوع داده خروجی برخی از توابع توکار(Built-in) از نوع آبجکت می باشد؛ البته توابع جایگزینی هم می توانید پیدا کنید که خروجی آنها از نوع آبجکت نباشند یا چاره دیگر این است که آبجکت را به آرایه Cast(تبدیل) کنید.
Coupling معیاری برای میزان وابستگی دو ماجول است. هر چه Coupling یا وابستگی کمتر باشد بهتر است. برای مثال می خواهیم ماجول هایی از یک پروژه موجود را در پروژه جدید استفاده کنیم. می خواهیم تغییر عمده ای در ماجولی صورت دهیم و دیگر نگران این نباشیم که تاثیر آن بر روی ماجول های دیگر به چه گونه است. راه حل پیروی از اصول Encapsulation یا کپسوله سازی است. به ماجولها به چشم یک واحد مستقل نگریسته می شود و ارتباط بین ماجولها از طریق واسطهایی ساخت یافته صورت می پذیرد. بنابراین ماجولها به کار همدیگر دخالت نمی کنند و با متغیرهای همدیگر کاری ندارند. بنابراین خیلی مودبانه از طریق توابع پاسخ خود را دریافت می کنند. کپسوله سازی اصولی است که می توان آن را در هر زبان برنامه نویسی بکار بست؛ البته اگر در کد نویسی انضباط و دیسیپلین داشته باشید. برنامه نویسی شی گرا با سبکی که در پیش گرفته، فرار از کپسوله سازی را تقریبا غیر ممکن می سازد.
همانطور که در قسمت اول مقاله گفته شده، در برنامه نویسی رویه ای، داده ها و توابع از یکدیگر جدا هستند. در برنامه نویسی شی گرا، داده ها، و توابعی که روی این داده ها کار می کنند، در کنار یکدیگر قرار می گیرند و تشکیل Object را می دهند. بنابراین آبجکت ها از دو چیز تشکیل شده اند: داده ها(که به آن Attributes یا Properties گفته می شود) و توابعی که روی این داده ها اعمالی انجام می دهند که به آنها Methods گفته می شود.
این آبجکت ها دارای خصوصیات و رفتارهایی هستند. از نقطه نظر کلی، متدها یا رفتارها، کارهایی است که یک آبجکت انجام می دهد و Propertyها یا خصیصیه ها، مشخصات و ویژگی های آبجکت هستند. از نقطه نظر برنامه نویسی، متدها همان توابع ما هستند و Propertyها همان متغیرهای ما. در یک سیستم شی گرای ایده آل، هر قسمت و بخش، یک آبجکت است.
یک آبجکت توسط کلاسی که از آن نمونه گیری شده تعریف می شود. یک کلاس هم Attributeها یا خصیصه هایی که یک شی(Object) دارد و هم متدهایی که بکار می برد را تعریف می کند. یک آبجکت نمونه ای از یک کلاس است.
وقتی یک کلاس تعریف می کنید، در واقع الگویی ایجاد می کنید تا آبجکت ها را از روی آن بسازید. برای اینکه این مفهوم ملموس تر شود مثالی می زنم. فرض کنید می خواهیم یک قوطی درست کنیم. ابتدا قالب ساز، بر اساس طرحی، قالب قوطی را می سازد و تمام انحناها و شکل و شمایل موجود را لحاظ می کند. حال که قالب اصلی ساخته شد، دیگر برای ساخت قوطی هیچ مشکلی وجود ندارد و می توان صدها یا هزاران قوطی با همان طرح و شکل ساخت. کلاس ها همانند همان قالب اولیه قوطی می مانند و آبجکت ها همانند قوطی های تولید شده. در یک کلاس تمام متغیرها و توابعی که یک نمونه آبجکت باید داشته باشد، در نظر گرفته می شود.
Instantiation یا نمونه گیری یک آبجکت جدید ایجاد می کند و تمام خصیصه های آن را مقدار دهی کرده و تابع سازنده(Constructor) آن را فرا می خواند. این تابع از آن جهت سازنده نامیده می شود که معمولا با مقدار دهی اولیه برخی خصیصیه ها آبجکت را قابل بهره برداری می کند. تابع سازنده یک کلاس در PHP 5 را می بایست ()constructor__ نام نهاد تا موتور Zend قادر به شناسایی آن باشد. (در موتور Zend نسخه ۱، تابع سازنده باید هم نام خود کلاس می بود.) به مثال زیر توجه کنید. یک کلاس ساده به نام User نوشته ایم، سپس از آن نمونه گیری کرده و دو متد آنرا به صورتی که مشاهده می کنید، فرا می خوانیم.

<?php
class User {
public $name;
public $birthday;
public function __constructor($name, $birthday)
{
$this->name = $name;
$this->birthday = $birthday;
}
public function hello()
{
return “Hello $this->name!\n”;
}
public function goodbye()
{
return “Goodbye $this->name!\n”;
}
public function age()
{
$ts = strtotime($this->birthday);
if ($ts === -1) {
return “Unknown”;
} else {
$diff = time() – $ts;
return floor($diff / (24*60*60*365));
}
}
}
$user = new User(‘Nima’, ’29 Sep 1983′);
echo $user->hello();
echo “You are {$user->age()} years old.\n”;
echo $user->goodbye();
?>

و در نهایت خروجی تکه کد بالا:

Hello Nima!

Yo are 20 years old.

Goodbye Nima!

تابع سازنده در مثال فوق بسیار ساده و ابتدایی بود. در تابع سازنده دو خصیصه name و birthday را مقداردهی اولیه کردیم. متدهای کلاس فوق نیز بسیار ساده اند. دقت کنید که this$ به طور خودکار در متدهای کلاس ساخته می شود و نماینده آبجکت User می باشد. برای دسترسی به یک خصیصه یا رفتار(متد) از نماد <- استفاده می کنیم. در صورت ظاهر، آبجکت را می توان یک آرایه Associative بعلاوه مجموعه ای از توابع در نظر گرفت. ولی برخی ویژگی های مهمی نیز می توان برای آن قائل شد:
توارث یا Inheritance: توارث به قابلیتی گفته می شود که بر حسب آن می توان از کلاس های موجود، کلاس های جدیدی را مشتق کرد و خصیصه ها و رفتارهای آنها را به ارث برد یا اینکه بر آن غلبه کرده و خصایص و رفتارهای جدید تعریف کرد. نمونه واقعی آن رابطه والد و فرزندی است. شما به عنوان فرزند پدر یا مادرتان، خصایص و رفتارهایی را از آنها به ارث برده اید و علاوه بر آنها برخی خصایص جدید و مخصوص به خود هم دارید.
کپسوله سازی یا Encapsulation: کپسوله سازی به قابلیت پنهان سازی داده ها از کاربران کلاس، گفته می شود. یعنی ما برخی خصایص یا رفتارها را از دید کسی که نمونه ای از کلاس ما را ایجاد کرده، مخفی می کنیم و تنها متدهای خاصی از کلاسمان به این خصایص می توانند دسترسی داشته باشند.

متدها یا رفتارهای خاص: همانطور که در این مطلب اشاره شد، کلاس ها توسط توابع سازنده امکان برپاسازی و قابل استفاده کردن آبجکت ها را فراهم می کنند. برای مثال خصایصی را مقداردهی اولیه می کنیم. بنابراین هر بار که آبجکت جدیدی می سازیم این تابع فراخوانده شده و کارهای ابتدایی را انجام داده و آبجکت را در واقع آماده کار می کند. علاوه بر تابع سازنده، یک کلاس بر حسب رخدادهای معینی می تواند رفتارهای خاصی از خود نشان دهد. برای مثال هنگامی که بخواهیم یک کپی از آبجکت مورد نظر ایجاد کنیم یا کارمان با یک آبجکت تمام شده و می خواهیم آن را نابود کنیم.(عمل تخریب سازی یا Destruction)
چندشکلی یا Polymorphism: وقتی دو کلاس متدهای خارجی یکسانی را بکار ببرند، باید بتوانند در عملکردهایی به جای یکدیگر به کار روند. از آنجا که درک کامل چند شکلی نیازمند دانش وسیعتری است، فعلا توضیح بیشتری در این مورد نمی دهیم.

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *