روی خط زندگی

گشت و گذار من در هنر نرم افزار

روی خط زندگی

گشت و گذار من در هنر نرم افزار

۲ مطلب در اسفند ۱۳۹۳ ثبت شده است

شاید اصلی ترین ایده در مفاهیم شی گرایی وراثت است. با وراثت می توان یک کلاس را به چندین کلاس توسعه داد بدون آنکه کلاس اصلی ما دستخوش تغییر شود. این یکی از بهترین اشکال برای Code Reuse می باشد. وقتی یک کلاس از کلاس دیگری به ارث می رود، بدون آنکه نیاز به کد نویسی باشد، کلیه رفتار ها و ویژگی های آن کلاس را به ارث می برد (البته با توجه به دسترسی های تعریف شده برای رفتار ها، تنها رفتار هایی با سطح دسترسی public و protected به ارث می روند).


در شکل زیر کلاس های Student و Employee از کلاس Person ارث بری کرده اند. به کلاس Person می گوییم Superclass و به کلاس های Student و Employee می گوییم Subclass.


یکی از مهترین فواید استفاده از وراثت آن است که با اعمال تغییرات در کلاس پدر، تمامی کلاس های فرزند که از کلاس پدر به ارث رفته اند، بدون هیچ کاری تغییرات را دریافت می کنند.

لازم به ذکر است که در برخی از زبان ها مانند ++C امکان ارث بری از چندین کلاس وجود دارد، در واقع یک کلاس فرزند می تواند چندین پدر داشته باشد!، ولی در زبان هایی مانند #C و Java هر کلاس تنها از یک کلاس می تواند ارث بری داشته باشد و امکان وراثت چندگانه وجود ندارد. لازم به ذکر است که وراثت چندگانه علی رقم آزادی عملی که به توسعه گر می دهد، مشکلاتی را ایجاد می کند (از جمله افزایش سطح پیچیدگی یا Complexity ) که بحث آن در این مقال نمی گنجد.

۰ نظر موافقین ۰ مخالفین ۰ ۲۱ اسفند ۹۳ ، ۲۰:۴۰
حسین گویا

یک مانیتور را تجسم کنید. برای روشن کردن این مانیتور چه می کنید؟ آیا کاری با خازن ها و برد الکترونیکی آن دارید؟ مسلما نه! تنها کاری که باید انجام دهید فشردن یک دکمه است و مانیتور به تبع آن روشن می شود!

کپسوله سازی، همان طور که از نامش پیداست به معنای دسته بندی و جمع کردن یک مجموعه از ویژگی ها و رفتار ها در قالب یک مجموعه واحد می باشد. اما این تمام ماجرا نیست. جمع کردن این موارد در کنار هم به تنهایی مفهوم کپسوله سازی را نمی دهد. نکته ای که این مفهوم را تکمیل می کند، نحوه دسترسی و دستیابی به اعضای داخلی این مجموعه است. یک شی یا یک کلاس به عنوان یک کپسول، سعی می کند تمام ارتباطات با اعضای داخلی خود را محدود کند و در واقع جهان بیرون از مجموعه از ارتباطات و اعضای داخل این مجموعه خبر نداشته باشند (به این مهم Information Hiding می گویند). یک کپسول تنها چیزهایی را به دنیایی بیرون ارائه می دهد که واقعا نیاز باشد. توجه داشته باشید در دنیای برنامه نویسی منظور از جهان بیرون، لزوما استفاده کنندگان از نرم افزار نمی باشد. مثلا وقتی یک کامپوننت (Component) را کپسوله می کنیم، استفاده کنندگان از این کامپوننت سایر کامپوننت ها و کلاس های دیگر می باشند و نه کاربر نهایی.


در یک کلاس، پیاده سازی سطوح دسترسی به اجزای کلاس را توسط Access Modifier ها نظیر public، private، protected اعمال می کنیم. برای انجام یک عمل مانند خاموش روشن کردن مانیتور، تنها به یک متد که کل این فرآیند را مدیریت می کند اجازه می دهیم که از بیرون قابل دسترسی باشد و سایر جزییات را از دید بیرون مخفی می کنیم. این عمل مصداق کامل ایجاد یک جعبه سیاه (Black Box) است. اگر تکنولوژی روشن و خاموش کردن مانیتور عوض شود ( به طور مثال تغییر تکنولوژی از پلاسما به LCD و بعد به LED) دکمه خاموش و روشن کردن مانیتور همچنان همان کار قبلی را می کند، بدون آنکه ما دغدغه ای از بابت این تغییر داشته باشیم.


شاید برای شما هم این سوال پیش بیاید که چرا باید کد هایی را که خودم نوشته ام از دید خودم یا دوستان همکارم پنهان کنم. توجه داشته باشید که مخفی کردن اجزای داخلی یک کلاس از جهان بیرونی، به منظور حفظ امنیت صورت نمی گیرد، بلکه دغدغه اصلی اینجا کاهش وابستگی (Dependency) اجزا یا کامپوننت های مختلف یک سیستم از یکدیگر است. 


۱ نظر موافقین ۰ مخالفین ۰ ۱۴ اسفند ۹۳ ، ۱۹:۰۱
حسین گویا