بد نيست كه من در مورد برنامه نويسي شيئ گرا و همچنين ساختار زبانهاي Class based كمي توضيح بدم و با اجازه از فريد توضيحاتش رو كامل كنم و تعريف كلاسيك تري رو از class ارائه بدم.
ساختار برنامه نويسي شيئ گرا:
برنامه نويسي شيئ گرا يا OOP تعريف جديدي در دنياي برنامه نويسي نيست البته اگه اونو با شيوه هاي قديمي برنامه نويسي (structured programming) مقايسه كنيم بسيار جديد تره. در شيوه هاي قديمي در برنامه هاي ساخت يافته و در بهترين حالت برنامه شامل توابع يا function هاي متعدد خواهد بود كه اين توابع مي توانند routine هاي برنامه را در دست گرفته و يا مقداري را براي routine اصلي برگردانند. اين شيوه Top-Down ناميده مي شود و هدف آن شكستن برنامه به جزو هاي كوچكتر مي باشد كه از بالا به پايين اجرا خواهند شد.
C يك زبان از اين نوع مي باشد كه كليه كار ها در آن توسط توابع انجام مي شود شايد مهمترين تغيير C با ++C را هم بتوان امكان برنامه نويسي OO در ++C دانست.
در شيوه هاي نوين كه OO كار آمد ترين اونهاست برنامه شامل قسمت هاي گوناگوني مي باشد كه با يكديگر از طريق متدهاي مختلف ارتباط برقرار مي كنند. اين قسمتها Object ناميده مي شوند. Object ها از روي قالبها يا به عبارتي نمونه هاي اوليه اي ساخته مي شوند كه Class ناميده مي شود، چيزي شبيه قالب شيريني براي ايجاد كردن خود شيريني. در واقع مفهوم و يا شيوه كار كردن با Class كاملا با function ها متفاوته، به علاوه class ها هيچ چيزي رو برنمي گردونند، تنها مي توان از روي اونها نمونه هاي حقيقي كه Object ناميده مي شوند ايجاد كرد. در ادامه توضيحات كامل تري در مورد class مي دهم.
هدف اصلي OO ايجاد شيوه اي بسيار شبيه طبيعت و يا شيوه هاي انساني براي برنامه نويسان بوده است.
بعضي از مزيتهاي استفاده از OO اينها هستند:
- قابل فهم بودن بيشتر برنامه در پروژه هاي بزرگ
- امكان debug كردن و پيدا كردن خطا در برنامه به شيوه اي بسيار راحت تر
- امكان استفاده از چندين برنامه نويس در يك پروژه بدون نگراني نسبت به كد ها
- امكان دوباره استفاده كردن از بك كد در برنامه هاي مختلف
- امكان ايجاد برنامه هاي پيچيده با استفاده از به هم آميختن برنامه هاي ساده تر
- كد برنامه زيبا تر و يا پتانسيل ايجاد كد زيبا تر
يك مثال ساده يك اتومبيل مي باشد كه شامل قسمتهاي بسيار گوناگون مي باشد:
- هر قسمت از اتومبيل به صورت مجرد و به تنهايي عهده دار انجام وظيفه خاصي مي باشد و اين قسمتها با استفاده از متد هاي قابل فهم خود با يكديگر ارتباط برقرار مي كنند
- در صورتي كه مشكلي براي هر قسمت بوجود آيد پيدا كردن آن بسيار آسان تر است
- افراد گوناگوني در ايجاد يك اتومبيل دخيل هستند. براي مثال تخصص افرادي كه CD player رو ايجاد مي كنند كاملا جدا از تخصص افرادي است كه سيستم سوخت رساني را مي سازند
- يك CD player رو مي توان در اتومبيل هاي متفاوت استفاده كرد
- يك CD player رو مي توان تركيبي از قسمتهاي ساده تر مانند IC ها، قسمتهاي مكانيكي، برق رساني و ... دانست كه هر كدام از اين اجزا به نوبه خود به قسمت هاي ساده تر تقسيم مي شوند
Class based و Object based
زبانهاي OO را مي توان به دو دسته Class based و Objec based تقسيم كرد. مطالب بسيار زيادي در مورد تفاوت اين دو شيوه وجود داره كه از حوصله اين مطلب خارجه و من فقط اشاره كوچكي ميكنم:
در زبانهاي Object based مانند JavaScript كه از استاندارد ECMA-Script پيروي مي كند كليه اجزاي برنامه به نوعي Object هستند. شايد دركش كمي مشكل باشه ولي در اين زبانها تمامي متغير ها، type ها مانند Number , Boolean, String ، و حتي Class ها و function ها به نوعي Object هستند.
اين زبانها را گاها prototype based هم مي نامند و علت اون استفاده از يك object خاص به نام prototype در سيستم تعريف كردن class ها مي باشد كه نقش بسيار مهمي را در اين مدل زبانها بازي مي كند.
در زبانهاي Class based مانند Delphi ، C# , Java كه ساختار محكم تري دارند همانطور كه از اسمشون پيداست مفهوم class از Object كاملا جدا مي باشد، اين زبانها معمولا Strict Type هستند بدين معني كه براي كليه متغير ها بايد type مشخصي تعريف شود و بر خلاف زبانهاي Object based در اينجا type ها مفهومي كاملا مجرد مي باشند
بحث هاي زيادي در مورد دو ساختار وجود داره و اينكه هر كدوم چه برتري هايي دارند ولي مساله اصلي اينه كه هر دو اين زبانها قابليت هاي كامل OO را دارند و در هر دو مفهوم Object و Class به شكل استاندارد وجود دارد.
ركن هاي اصلي كليه زبانهاي OO عبارتند از:
- encapsulation يا مخفي سازي، بدين صورت كه class ها بايد از دارايي ها ي دروني خود محافظت كنند و فقط اين متد ها هستند كه قابل دستيابي هستند. مثلا در مثال CD player هيچ كس نبايد از محتويات و طريقه كاركرد داخلي آن اطلاعي داشته باشد و يا بتواند در آن تغييري دهد، چيزي كه افراد نياز دارند فقط متد هاي دستيابي به CD player است مانند اينكه
چگونه يك CD را play كنيم و يا چگونه track بعدي را انتخاب كنيم
- inheritance يا ارث بري، به معني اينكه class ها مي توانند بعضي از مشخصات و يا متد ها را از يك class ديگر ارث ببرند، مثلا يك گربه سفيد بعضي خواص را از class گربه ها به ارث مي برد مثل اينكه همه گربه ها گوشت خوارند، class گربه ها مي تواند خواصي را از class پستانداران به ارث ببرد مثل اينكه پستانداران بچه به دنيا مي آورند، حتي class پستانداران مي تواند از class جانداران ارث بري داشته باشد مانند تنفس كردن. نتيجه اينكه گربه سفيد گوشتخوار است، بچه به دنيا مي آورد و تنفس مي كند.
- polymorphisim يا چند گانگي، بدين صورت كه مثلا همه جانداران متدي به نام تنفس دارند كه بين همه مشترك است ولي هر كدام به نحو خاص خود اين كار را انجام مي دهد. درختان، ماهي ها و پستانداران هر كدام به نحوي اين كار را انجام مي دهند. در نتيجه برنامه نويس نگراني جهت تنفس Object ها ندارد و هميشه مثلا متد breath را براي تنفس بكار مي برد گر چه اين متد براي هر گروه متفاوت است
ActionScript
نكته قابل توجه در AS اين است كه AS هم يك زبان class based و هم يك زبان object based مي باشد. در واقع AS1 يك زبان object based و AS2 يك زبان class based مي باشد. از نظر قابليت و كارايي هر دو زبان يكسان مي باشند همچنين هر دو كاملا OO هستند و كليه كارايي هاي سيستم هاي OO را دارا هستند.
تنها تفاوت در شيوه ايجاد و آشنايي برنامه نويس مي باشد ضمن اينكه AS2 در پروژه هاي بزرگ تا حدي كامل تر است و برنامه هاي آن ساختار قوي تري دارند ولي در %95 از برنامه هاي فلش AS2 چيزي جز تعداد كد بيشتر براي برنامه و طولاني تر شدن مدت برنامه نويسي نخواهد داشت. همچنين AS2 نيازمند آشنايي برنامه نويس با بعضي از pattern هاي OO است كه براي برنامه نويس هاي آشنا با زبانهاي class based كار را راحت تر مي كند در غير اين صورت برنامه نوشته شده با AS2 مي تواند از برنامه نوشته شده با AS1 گيج كننده تر و از نظر كيفي ناقص تر باشد.
شوه استفاده از class در ActionScript
در AS1 براي ايجاد يك class از keyword function استفاده مي گردد. قابل توجه اينكه اين class با function هاي عادي تفاوت دارد.
يك مثال ساده ايجاد يك class براي گربه سفيد مي باشد. تا هنگامي كه از روي اين class يك object ساخته نشود گربه سفيدي ايجاد نخواهد شد. پس از ايجاد مي توانيم متد getName را براي object گربه صدا بزنيم تا اسم آنرا برگرداند:
کد:
function WhiteCat(name)
{
this.getName=function()
{
return this._name;
};
this._name=name;
};
myCat=new WhiteCat("maloos");
trace(myCat.getName());
در AS2 نوشتن همان كد كمي سخت تر است. sysntax برنامه نويسي در AS2 دقيقا مانند Java مي باشد. ابتدا بك فايل با پسوند as ايجاد مي كنيم و اسم آنرا دقيقا معادل اسم class قرار مي دهيم (در هر فايل as تنها يك class قرار مي گيرد) كد قرار گرفته در اين class بدين صورن خواهد بود:
کد:
class WhiteCat
{
function WhiteCat(name:String)
{
_name=name;
};
public function getName():String
{
return _name;
};
private var _name:String;
};
حالا يك فايل fla در كنار فايل as ايجاد كرده و مراحل ايجاد object و استفاده از آنرا در آن مي نويسيم:
کد:
myCat=new WhiteCat("maloos");
trace(myCat.getName());
استفاده از package ها
يكي از مفاهيم بسيار خوب در Java امكان دسته بندي class ها در package ها مي باشد كه چيزي شبيه به دسته بندي فايل ها در folder هاست. در AS2 مفهوم package كاملا وجود دارد و در پروژه هاي بزرگ بسيار هم كاربرد دارد. براي استفاده از package ها بايد class ايجاد شده را دقيقا در شاخه اي با همان ساختار قرار داده و در فايل fla آدرس ClassPath را برابر آن شاخه قرارا دهيم (نحوه اين كار را در ادامه توضيح خواهم داد)
براي مثال همان مثال قبل را با قرار دادن class مربوطه در package به نام com.cat مي نويسيم:
کد:
class com.cat.WhiteCat
{
function WhiteCat(name:String)
{
_name=name;
};
public function getName():String
{
return _name;
};
private var _name:String;
};
حال تنها چيزي كه بايد به فايل fla اضافه كنيم دستور import براي مشخص كردن package و class مربوطه مي باشد.
مثلا
;import com.cat.WhiteCat
كلاس WhiteCat را در برنامه اصلي import مي كند و يا :
;*.import com.cat
كليه كلاس هاي موجود در package com.cat را در برنامه آماده مي سازد و نكته قابل توجه اينجاست كه اين import كردن حجم اضافي را بر برنامه تحميل نمي كند. تنها كد هاي استفاده شده در فايل swf نهايي قرار مي گيرند.
براي تنظيم ClassPath مراحل زير را انجام مي دهيم:
اگر مثلا com\cat\WhiteCat.as در c:\classes قرار دارد. در فايل fla به
File \ Publish Settings \ Flash \ActionScript Version : Settings
رفته و آدرس c:\classes را به ClassPath هاي جاري اضافه مي كنيم.
مفهوم كامل OO بسيار فراتر از توضياتي است كه در بالا نوشتم و حداقل نيازمند يك كتاب 1000 صفحه اي است كه اگر شيوه هاي OO و refractories و Design Pattern و UML رو هم به اون اضافه كنيم چندين كتاب لازمه. اميدوارم تونسته باشم توضيحي هر چند كم در مورد OO داده باشم.