طراحی سایت | برنامه نویسی

آموزش طراحی سایت و برنامه نویسی

طراحی سایت | برنامه نویسی

آموزش طراحی سایت و برنامه نویسی

آیا شما متوجه شده اید که در مصاحبه های شغلی همیشه پرسش های کلیشه ای  پرسیده میشود و این همیشه در حال تکرار است. من مطمئن هستم که می دانید منظور من چیست. برای مثال سوال "پنج سال دیگر خودت را کجا می بینی؟" یا حتی بدتر : "به نظرتون بزرگترین نقطه ضعف شما چیست؟"

چقدر بد. از من سوال میکند که بزرگترین نقطه ضعفت چی هست و من باید پاسخ بدهم.

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

child

امروز می خواهم در مورد نوع مشابهی از این سوال ها در جهان برنامه نویسی صحبت کنم: "اصول اصلی برنامه نویسی شی گرا چیست؟"

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

چهار اصل برنامه نویسی شی گرا عبارتند از:  inheritance ،abstraction ،encapsulation و polymorphism.

child2

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

کپسوله سازی - Encapsulation 

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

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

فرض کنید یک بازی کوچک را ساخته ایم. در این بازی یک گربه و تعدادی انسان داریم که آنها با هم در ارتباط اند. ما می خواهیم encapsulation را اعمال کنیم، بنابراین ما تمام منطق "گربه" را به کلاس Cat اضافه می کنیم. چیزی شبیه شکل زیر :

cat

شما می توانید به گربه غذا دهید. اما نمیتوانید به صورت مستقیم حالت گرسنگی آن را تغییر دهید. وقتی به او غذا میدهید. گربه غذا را میخورد و این عمل باعث میشود گرسنگی آن رفع شود.

در شکل بالا حالت های مختلف گربه مثل hungry، mood و energy خصوصی (private) تعریف شده اند. همچنین کلاس گربه داری متد خصوصی ()meow است که گربه هر وقت دوست دارد میتواند خود آن را فراخوانی کند (میو میو کردن گربه). دیگر کلاس ها نمیتوانند این متد را فراخوانی کنند.

اما کلاس گربه دارای متد های عمومی دیگری هم هست که عبارت اند از : ()play و ()sleep و ()feed. هر کدام از این متدها میتوانند فیلد های کلاس گربه را تغییر دهند و متد ()meow آن را فراخوانی کنند. بنابراین به این شکل فیلد های خصوصی و عمومی به هم متصل میشوند. هم این ها تعریف مفهوم کپسوله سازی بود.

انتزاع - Abstraction

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

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

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

یک مثال واقعی از انتزاع در زندگی شما میتواند تلفن همراه شما باشد. در مورد چگونگی استفاده از تلفن خود فکر کنید:

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

وراثت - Inheritance

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

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

teacher

اگر برنامه ای داشته باشیم که دارای کلاس های معلم عمومی و خصوصی و همین طور دانش آموز باشد میتوان همان طور که در شکل بالا نشان داده است وراثت را پیاده سازی کرد.معلم خصوصی یک نوع معلم است و هر معلم یک نوع شخص است.

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

چند ریختی - Polymorphism

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

فرض کنید برنامه ای داریم که دارای کلاس های والد و فرزند است که بین آنها رابطه ی وراثت قرار دارد. گاهی اوقات نیاز داریم از ترکیبی از همه ی این کلاس ها استفاده کنیم و یا متدی داریم که در کلاس والد پیاده سازی شده است و حالا میخواهیم آن را در کلاس فرزند نیز داشته باشیم.این مشکل را می توان با استفاده از چند ریختی حل کرد.

به عبارتی دیگر چند ریختی اجازه میدهد از یک کلاس دقیقا مانند والدینش استفاده کنید. بنابراین دیگر مشکل ترکیب شدن انواع را با هم ندارید اما هر کلاس فرزند متد های خود را همان گونه که هستند حفظ می کند.

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

Polymorphism

 در اینجا اشکال هندسی مختلفی داریم که همه ی آنها از اینترفیس مشترک Figure برای پیاده سازی متد های خود استفاده میکنند. مثلث ، دایره و مستطیل  هر سه باید دو متد اینترفیس خود یعنی CalculateSurface و CalculateSurface را پیاده سازی کنند. که این پیاده سازی در هر کدام متفاوت است.

منبع لرن سورس

موافقین ۰ مخالفین ۰ ۹۸/۰۵/۰۳
شهربانو دوستی

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی