مقدمه: حتماً شنیدهاید که میگویند جاوا زبانی شیءگرا است. در این فصل میخواهیم این عبارت را بسط داده و منظور از شیءگرایی را توضیح دهیم.
تا کنون برای حل مسائل از شیوه سنتی تقسیم و غلبه (یا همان تفرقه بیانداز و حکومت کن) استفاده میکردیم. در این شیوه، ابتدا مسأله اصلی را شناسایی کرده و بعد آن را به چندین مسأله کوچکتر تقسیم میکنیم. این کار را برای هر کدام از مسألههای کوچکتر تکرار میکنیم و آن قدر این کار را ادامه میدهیم تا هر مسأله به یک مسأله اتمی تبدیل شود: مسألهای که دیگر نمیتوان آن را به چندین مسألهی کوچکتر تقسیم کرد. سپس این مسائل کوچک حل شده را با هم ادغام میکنیم تا مسأله اصلی حل شود.
بزرگترین مشکل این روش حل مسأله این است که هیچکدام از این مسائل کوچکتر مستقل نیستند و هر کدام از آنها به یک یا چند زیر مسأله دیگر وابستگی دارند. اگر بخواهید تغییری در یکی از آنها ایجاد کنید، به سادگی نمیتوانید اثر این تغییر را در سایر زیر برنامهها پیدا کنید. یکی دیگر از مشکلات این روش این است که در صورت بروز خطا در برنامه کشف علت خطا بسیار سخت و در برخی موارد تقریباً غیر ممکن است. همین دو ایراد و اشکال به قدری اهمیت دارند که ما به درستی روش تقسیم و غلبه در حل مسائل شک کنیم و به دنبال روشی دیگر برای حل مسائل باشیم.
یکی از روشهای حل مسأله که به عنوان جایگزین روش سنتی «تقسیم و غلبه» معرفی شده است، روش «شیءگرایی» است. در روش شیءگرایی، نگاه به مسأله به طور کامل دگرگون میشود. به جای یافتن یک مسأله و تقسیم آن به زیر مسألههای کوچکتر، «چیز» هایی که در مسأله وجود دارند و روابط بین آنها را شناسایی میکنیم. «چیز» میتواند هر چیزی باشد: یک انسان، یک برنامه رایانهای، یک قایق یا … این «چیز» همان «شیء» است.
به عنوان مثال اگر بخواهیم سیستم کنترل یک بندر کشتیرانی را بنویسیم اشیای مسأله ما چه چیزهایی هستند؟ کشتیها، اسکلهها، مأموران کنترل، یدک کشها و غیره. رابطه بین این اشیا هم مهم است. کشتی باید در اسکله پهلو بگیرد، بار خود را تخلیه کند، اسکله را ترک کند. یدک کشها کشتیها را تا اسکله میکشند و … همانطور که میبینید اگر اشیا را به درستی شناسایی کنیم و روابط بین آنها را به دقت بررسی کنیم، راهحلی برای مسأله خواهیم داشت.
مهمترین عناصر در حل مسائل به روش «شیءگرایی» اینها هستند:
- شیء
- کلاس
- روابط بین کلاسها
در ادامه این فصل این سه مفهوم را بیشتر توضیح خواهیم داد.
شیء: «هر چیزی یک شیء است». شاید سادهتر از این نتوان یک شیء را تعریف کرد. اگر به اطراف خود نگاه کنید اشیا را میبینید: انسانها، حیوانات، گیاهان، ساختمانها، رایانهها، دستگاههای تلفن، تلویزیون، موبایل، اجاق گاز و مانند آنها.
اگر به صورت مسألهای که قرار است آن را حل کنید، به دقت بنگرید، چیزهایی میبینید: آدمها، سیستمهای رایانهای، زمانسنجی که اجرای برنامه را کنترل میکند، دستگاههای الکترونیکی، تجهیزات سختافزاری، ماشینها، ساختمانها و … هر کدام از اینها یک شیء هستند.
هر شیء چندین ویژگی دارد: هر انسانی وزن و قد و … دارد. رایانهها سرعت و میزان حافظه مشخصی دارند، تلویزیونها اندازه صفحه نمایش مشخص دارند و … مقادیر این ویژگیها دو شیء را از هم متمایز میکند. به اینها «ویژگی» یا Attribute گفته میشود.
اشیا همانطور که ویژگیهای خاص خود را دارند، رفتارهای خاص خود را نیز دارند. برای مثال یک توپ بازی غلت میخورد، میترکد و … خودرو شتاب میگیرد، ترمز میکند، بوق میزند و … لامپ خاموش میشود، روشن میشود، تلویزیون صدایش کم یا زیاد میشود، شبکه را عوض میکند و …
به گفته Booch (یکی از طراحان اصلی شیءگرایی)، «هر شیء وضعیت، رفتار و شناسه دارد». منظور از «وضعیت» همان ویژگیها است. از شناسه برای تمایز اشیای هم نوع استفاده میشود. برای مثال اگر دو خودرو کاملاً مشابه هم باشند باید بتوان به طریقی دو نمونه را از هم متمایز کرد. درباره خودرو میتوان از شماره پلاک به عنوان شناسه استفاده کرد زیرا هیچ دو خودرویی در جهان شماره پلاک یکسان ندارند.
کلاس: تا به حال نقشه یک ساختمان یا خودرو را دیدهاید؟ یک مهندس عمران با نگاه به نقشه ساختمان میتواند آن را تصور کرده و سپس بر اساس جزئیات نقشه، یک ساختمان را بسازد. به همین ترتیب مهندس مکانیک با استفاده از نقشههای یک خودرو، میتواند یک نمونه از آن خودرو را بسازد. «کلاس» هم در برنامه نویسی شیءگرا همانند نقشه است.
ترجمه صحیح کلمه «کلاس» در فارسی شاید همان «رده» باشد. ردههای جانوران را احتمالاً شنیدهاید: رده ماهیان، چارپایان و غیره. شاید بتوان گفت اولین کسی که مفهوم کلاس را به این معنی به کار برده است، فیلسوف یونانی، ارسطو بوده است.
اگر به اشیا با دقت نگاه کنیم متوجه شباهتهایی در آنها میشویم. برای مثال اگر به خودروهای سواری دقت کنیم، همه آنها چهارچرخ، یک فرمان، یک ترمز، یک گاز و … دارند. بنابراین میتوانیم خودروهای سواری را در یک «رده» یا «کلاس» قرار دهیم.
«کلاس» الگویی برای ساخت شیء است. کلاس بیان میکند که اشیایی که از روی آن ساخته میشوند چه ویژگیها و رفتاری داشته باشند.
روابط بین کلاسها: کلاسها میتوانند با هم رابطه داشته باشند. برخی از این روابط ساده و برخی نیز پیچیدهاند. در اینجا برای درک بهتر مفاهیم شیءگرایی به تعدادی از این روابط اشاره خواهیم کرد.
وراثت: کلاسها میتوانند ویژگیها و رفتار را از یکدیگر به ارث ببرند. برای مثال اگر کلاس «خودرو» را در نظر بگیریم، میتوانیم کلاس «خودروهای سواری» را تعریف کنیم. این کلاس کلیه ویژگیها و رفتار کلاس «خودرو» را به ارث میبرد و البته میتواند رفتار و ویچگیهای جدید نیز به آن بیافزاید. به این رابطه وراثت (Inheritance) گفته میشود. اگر بخواهیم این رابطه را به کمک نمودارهای UML بیان کنیم به شکل زیر است:
وراثت میتواند طول بیشتری داشته باشد. برای مثال میتوان کلاس «خودروهای سواری شاسی بلند» را تعریف کرد که از کلاس خودروهای سواری ارث ببرد. این رابطه را «… است» (… is a …) نیز مینامند. طبق این نامگذاری، رابطه بالا به صورت «خودروی سواری یک خودرو است» خوانده میشود. درباره وراثت در فصل یازدهم بیشتر خواهیم گفت.
ترکیب (Composition): یکی دیگر از روابطی که بین کلاسها وجود دارد رابطه «ترکیب» است. در این رابطه، یک کلاس شامل یک کلاس دیگر است. برای مثال فرض کنید برای «موتور خودرو» کلاسی ساختهایم. به این ترتیب کلاس «خودرو» شامل یک «موتور» است. این رابطه به کمک نمودارهای UML به شکل زیر است:
این رابطه را «… دارد» (… has a …) نیز مینامند. طبق این نامگذاری، رابطه بالا به صورت «خودرو یک موتور خودرو دارد» خوانده میشود.
قوانین Alan Kay: زبان SmallTalk اولین زبان شیءگرای موفق است. Alan Kay پنج ویژگی زبان SmallTalk را به عنوان اصول شیءگرایی تهیه کرده است. این پنج ویژگی یا قانون عبارتند از:
- هر چیزی یک شی است. میتوان شیء را یک «متغیر» بزرگ تصور کرد. شیء هم مانند متغیر دادهها را نگهداری میکند. اما علاوه بر آن میتوانیم از آن بخواهیم که برخی رفتارها را نیز از خود بروز دهد. همانطور که پیش از این نیز گفتیم، در مدلهای دنیای واقعی نیز هر چیزی یک شیء است و برنامه ما نیز از این قاعده مستثنا نیست.
- یک برنامه مجموعهای از اشیا است که با استفاده پیامرسانی به یکدیگر میگویند که چه کار باید بکنند. برای این که از یک شیء بخواهیم یکی از رفتارهایش را انجام دهد، میتوان پیامی را برای آن ارسال کرد. اگر بخواهیم دقیقتر بگوییم یک «پیام» فراخوانی یکی از متدهای متعلق به شیء است.
- هر شیءای دارای حافظهای است که از سایر اشیا ساخته شده است. همانطور که در رابطه «ترکیب» گفتیم، یک شیء میتواند «شامل» یک یا چند شیء دیگر باشد. به این ترتیب ما میتوانیم شیءای شامل تعدادی اشیای دیگر بسازیم و پیچیدگی «برنامه» را در سادگی «اشیا» پنهان کنیم.
- هر شیءای یک «نوع» دارد. همانطور که در فصل ششم «انواع دادهها در زبان جاوا» گفتیم که هر متغیری در جاوا یک «نوع» دارد، اشیا نیز از این قاعده مستثنا نیستند. در واقع «نوع» همان کلاس است و به بیان دقیقتر هر شیء از روی یک «کلاس» ساخته میشود.
- تمام اشیای همنوع میتوانند پیامهای یکسانی دریافت کنند. منظور از «اشیای همنوع» اشیایی هستند که از روی یک کلاس ساخته شدهاند. در واقع معنی این قانون این است که همه اشیای همنوع رفتارهای یکسانی دارند. برای مثال تمام اشیای ساخته شده از روی کلاس «خودروی سواری» میتوانند «گاز بدهند»، «ترمز بگیرند» و … این قانون شامل رفتارهای ارث برده شده از کلاسهای دیگر نیز میشود.
ادامه دارد …
خیلی شیوا و خوب بود . استفاده کردم . لطفا ادامه دهید.
سلام، خوشحالم که مطالب مفید بوده براتون. به زودی آموزش های جاوا رو ادامه می دم.
سلام مهندس منتظر مطالب جالبتون هستیم هروز تو سایتتون میچرخیما
سلام
به زودی مطالب جدید رو منتشر می کنم.
سلام مهندس جان
واقعا بصورت خیلی عالی مفاهیم رو توضیح دادید. خواهش میکنم ادامه آموزش هاتون روی سایت قرار بدید.منتظر هستیم.
ممنون