داستان از این قراره که روزی یک نفر از دهی به شهر میاد و از قضای روزگار به یک کنسرت موسیقی میره. در بازگشت از شهر در راه به مطرب ده میرسه که داشته با پسرش ساز و دهل میزده. همین که مطرب رو می بینه بهش میگه که من توی شهر رفتم یک جایی به اسم کنسرت و کلی از همکارات رو یک جا دیدم. مطرب هم که تا به اون روز کنسرت ندیده و نشنیده بوده، با بهت می پرسه که کنسرت چیه؟
مرد دهاتی میگه که کنسرت یه جایی که اولش که رفتیم تو یه عده روی یه بلندی با سازهاشون نشسته بودند و هر کی برای خودش هی ساز میزد (حواستون که هست داشتند سازهاشون رو کوک می کردند). بعد یکی که اصلا ساز نداشت از در اومد تو و همه براش دست زدند. بعد هم روشو کرد به مطربهای روی بلندی و شروع کرد به دستور دادن که تو بزن و تو نزن، تو بزن، تو نزن و الی آخر. آخرشم به همشون گفت دیگه نزنید. بعد هم مردم براش دوباره دست زدند و اون هی دولا و راست میشد می گفت من نبودم اینا بودن من نبودم اینا بودن.»
این دقیقا تعریف یک سیستم شیگراست. دقیقا هدف یک سیستم شی گرا ایجاد هارمونی معنادار (collaboration) میان اجزاء مستقل سیستم برای دست یابی به یک کارکرد مشخص است. در صورتی که در سیستمهای ساخت یافته رویکرد ما دقیقا رویکرد حل مساله بود. مساله تعریف می شد و برنامه نویس مساله را هدف گرفته و برای حل آن با استفاده از یک سری دستورات خطی شروع به حل مساله میکرد. در منطق شی گرا اجزا یک سیستم الزاما تعلقی به سیستم ندارند و می توانند به همان صورت که به سایر سیستم ها سرویس می دهند به سیستم مورد نظر ما نیز سرویسی را ارایه کنند. تنها مساله توان طراح سیستم در ایجاد تشریک مساعی و یا به تعبیری همکاری مناسب میان اجزاء مختلف سیستم است.
منبع : در گذار عمر
نهان سازی (Encapsulation):
نهان سازی یک از مفاهیم شی گرایی است که شما بصورت مکرر در زندگی روزانه از آن استفاده می کنید . آیا شما پو ل، گواهینامه رانندگی و کارت اعتباری خود را در کیف پو لتان قرار می دهید ؟ آیا شما خودکار ها، کاغذها و کتاب های خود را در کیف تان قرار می دهید و به مدرسه می برید؟ اگر اینگونه باشد پس شما از نهان سازی استفاده می کنید. نهان سازی به معنی قرار دادن چیزهای مرتبط به هم در داخل یک شی جدید است.برای مثال یک حساب بانکی شامل: شماره حساب، نام مشتری، آدرس مشتری، نوع حساب و موجودی مشتری می باشد. همچنین برای یک حساب بانکی رفتارهای مانند باز کردن حساب، بستن حساب، برداشت از حساب و واریز به حساب وجود دارد. شما این اطلاعات را باهم در داخل یک شی حساب پنهان می کنید.
ائده اصلی که نهان سازی ارائه می دهد این است که رفتار یک شی باید تا حد ممکن دور از دید کاربر باشد. به عبارت دیگر تا زمانی که لازم نباشد، کاربر نباید متوجه شود که یک شی چگونه درخواست های او را انجام می دهد.
استفاده از یک شی :
تصور کنید که شما می خواهید به یک فرد رانندگی یاد بدهید برای اینکار شما یک سری از اطلاعات ضروری که باید آن فرد بداند را مشخص می کنید.به عنوان نمونه شما اطلاعاتی درباره ترمز ، دنده ، فرمان و آیینه را به او آموزش می دهید. اما آیا شما درباره نحوه کارکرد موتور ، نحوه عملکرد سیستم ترمز نیز مطالبی را به او یاد می دهید؟ نه، زیرا او نیازی ندارد که برای رانندگی کردن بداند که عملکرد داخلی ماشین چگونه است.
اطلاعاتی که ماشین در معرض نمایش قرار می دهد تا یک فرد بتواند از آن استفاده کند واسط ماشین (Interface) نامیده می شود.یک واسط راهی است تا شما با یک شی ارتباط برقرار کنید برای آنکه شما می خواهید از رفتارهای آن شی استفاده کنید. برای مثال هنگامیکه شما پای خود را روی پدال گاز ماشین قرار می دهید ، شما به او می گویید که سریعتر حرکت کند.
یک واسط همچنین به شما اجازه می دهد تا به اطلاعاتی از آن شی دسترسی پیدا کنید. برای مثال واسط کیلو متر شمار مقدار مسیری که به کیلومتر توسط آن ماشین طی شده است را نمایش می دهد.
آیا یک واسط به تنهایی کاری را انجام می دهد؟ نه، یک واسط به تنهایی کاری را انجام نمی دهد. یک واسط بدون پیاده سازی (implementation) هیچ کاری را انجام نمی دهد. شما می توانید با یک شی ارتباط برقرار کنید اما آن هیچ کاری انجام نمی دهد. برای مثال شما یک کنترل از راه دور تلویزیون را در نظر بگیرید اگر مدار داخلی این شی پیاده سازی نشده باشد ما با فشار دادن هر کدام از کلید ها هیچ عکس العملی را مشاهده نخواهیم کرد.
برای اینکه یک شی بتواند وظایف خود را انجام دهد، شما نیاز دارید که مکانیزمهای را فراهم کنید که به عملکردهای واسط جواب بدهد. برای مثال هنگامی که شما پدال گاز را فشار می دهید، رفتاری که پشت واسط قرار دارد ولی کاربر آنرا مشاهده نمی کند باعث خواهد شد که گاز بیشتری به موتور ارسال شود و ماشین شتاب بگیرد.
چند شکلی (Polymorphism):
چند شکلی به طور تکنیکی بدین معنی است که یک شی(thing) قابلیت دارد که شکل های مختلف به خود بگیرد.منظور از شی در جمله بالا یک متد می باشد. و منظور از شکل، رفتاری است که توسط آن متد انجام می شود.چند شکلی یعنی اینکه یک متد می تواند دارای رفتار های مختلف باشد.
ممکن است در ابتدا مفهوم چند شکلی گیج کننده باشد. اما این سر در گمی با یک مثال از دنیا واقعی می تواند، بطور کامل از بین برود. کلید روشن و خاموش کردن کامپیوتر خود را در نظر بگیرید، زمانیکه شما بخواهید کامپیوتر خود را روشن کنید دکمه را فشار می دهید و کامپیوتر روشن می شود. زمانیکه می خواهید کامپیوتر خود را خاموش کنید، دکمه را فشار می دهید و کامپیوتر خاموش می شود.
در مثال بالا متد فشار دادن کلید در شرایط مختلف، عملیات خاصی را انجام می دهد. این یعنی چند شکلی. یک مثال دیگر را بررسی می کنیم، تصور کنید که در یک فروشگاه به کالاها تخفيف داده می شود. اما برای انواع مختلف کالاها، نخفیف به روش متقاوتی محاسبه می شود. در این حالت ما یک متد تخفیف داریم اما در پیاده سازی نسبت به نوع کالا، عملیات متفاوتی را برای محاسبه تخفیف خواهیم داشت.
چند شکلی در اغلب موارد از طریق رابطه تعمیم(Generalization) پیاده سازی می شود.تصور کنید که یک سوپر کلاس به نام کالا داریم که دارای متدی به نام تخفیف می باشد. کلاس های مواد غذایی، پوشاک،کتاب و ... را در نظر بگیرید.این کلاس ها،زیر کلاس، کلاس کالا می باشند. که صفات و متد های آن را به ارث برده اند.اما نحوه محاسبه تخفیف در کلاس های مختلف با همدیگر متفاوت می باشد.در این حالت در هر زیر کلاس متد تخفیف نسبت به عملیاتی که باید انجام بدهد تا تخفیف را محاسبه کند باید بازنویسی شود اما با همان نام قبلی تخفیف.متد تخفیف در کلاس های مختلف معرف رفتار جداگانه ای هست اما تخت همان نام قبلی تخفیف.
رابطه تعمیم (Generalization):
شما زمانیکه در یک سوپر مارکت قدم می زنید. شما مواد غذایی را بر حسب ویژگهای آنها در قسمت های مختلف یک سوپر مارکت مشاهده می کنید. میوه ها و سبزیجات در یک قسمت فروشگاه، کوشت در قسمتی دیگر از فروشگاه و خشکبار را در قسمتی دیگر از فروشگاه پیدا می کنید. همه اینها مواد غذایی هستند، اما اینها انواع مختلفی از مواد غذایی هستند.عبارت های "تا حدی"(""Kind of)، "نوعی از" (""Type of) یک رابطه تعمیم را بین دو کلاس نشان میدهد.(برای مثال سیب نوعی از میوه است و میوه نیز نوعی از غذا است.) در بعضی مواقع عبارت "هست یک" بیانگر رابطه تعمیم است.(برای مثال سیب قرمز یک سیب هست.)
این نوع رابطه اغلب، وراثت(inheritance) نامیده می شود.مثال سیب را در نظر بگیرید. سیب نوعی میوه است پس سیب تمام ویژگیهای یک میوه را به ارث می برد.همچنان سیب (specialization) از میوه است زیرا آن تمام ویژگیهای میوه را به ارث می برد و همچنین سیب بعضی از ویژگیها را دارد که فقط متعلق به سیب می باشد و سیب را از دیگر میوه ها متمایز می کند.پس می توان گفت که میوه یک تعمیم (generalization) از هندوانه، سیب، هلو و همه دیگر اشیاء است که در این گروه قرار دارند.
وراثت در سیستم های شی گرا همانند به ارث بردن مشخصات رفتاری و بدنی از والدینتان است. مشخصات رفتاری و بدنی، همان صفات و رفتارهای یک کلاس هستند که یک کلاس از کلاس دیگر می تواند به ارث ببرد.وراثت زیستی یک مدل سلسله مراتبی بوجود می آورد که شما را قادر می سازد با دنبال کردن این سلسله مراتب و بالا رفتن در آن اجداد خودتان را بشناسد. در سیستم های شی گرا نیز دقیقا به ابن صورت است که شما می توانید با دنبال کردن این رابطه، کلاس مولد کلاس جاری را بدست آورید. سیب قرمز یک سیب است. پس کلاس مو لد سیب قرمز ، کلاس سیب است. سیب نوعی میوه است. پس کلاس مولد سیب، کلاس میوه است. سیب یک زیر کلاس(sub class) است. میوه یک سوپر کلاس(super class)است.
سوپر کلاس: یک سوپر کلاس، کلاسی است که دارای ویژگیهای است که بین دو یا چند کلاس مشترک است و آنها را با آن کلاس ها به اشتراک گذاشته است. سیب یک سوپر کلاس برای سیب قرمز است. همه صفات و رفتارهای مشترک بین سیب قرمز و سیب، در کلاس سیب تعریف شده است و سیب قرمز از آن صفات و رفتارها استفاده می کند.
زیر کلاس : یک زیر کلاس، کلاسی است که دارای ویژگیهای است که منحصر به آن کلاس می باشد همراه با ویژگیهای که در یک سوپر کلاس تعریف شده است و آنها را از آن سوپر کلاس به ارث می برد. یک کلاس می تواند هم سوپر کلاس باشد و هم یک زیر کلاس. کلاس سیب یک سوپر کلاس برای کلاس سیب قرمز است و یک زیر کلاس برای کلاس میوه است.
کلاس انتزاعی(class abstract ) : کلاس انتزاعی، کلاسی است که نمی تواند نمونه ای داشته باشد. یک کلاس انتزاعی باید توسط یک کلاس به ارث برده شود تا از صفات و رفتارهای آن استفاده شود.
کلاس (Class)
صفات و رفتارهای مربوط به شی یک کتاب را در قسمت اول مفاهیم شی گرایی بررسی کردیم، تمامی صفات و رفتارهای مربوط به این شی کتاب را دیگر کتابها نیز دارند پس شما می توانید یک مجموعه از قوانین را ایجاد کنید و برای همه کتابها نیز از آن استفاده کنید. مجموعه قوانین را کلاس می نامند. یک کلاس مجموعه ای از اشیاء است.اگر مجموعه ای از اشیاء دارای صفات و رفتارهای مشابه باشند، شما می توانید این اشیاء را در یک کلاس گروهبندی کنید.
یک کلاس یک الگو (template) است که صفات و رفتارهای یک شی واقعی را تعریف می کند. یک کلاس را همانند یک قالب شرینی با شکل حرف A در نظر بگیرید. قالب شرینی حرف A نیست اما چیزی را شبیه حرف A تعریف می کند. اگر شما یک حرف A را بخواهید ، قالب شرینی را بر روی خمیر شرینی قرار می دهید و یک حرف A بوجود می آورید ، اگر شما یک حرف A دیگر را بخواهید دوباره قالب را روی خمیر قرار می دهید و یک حرف دیگر A را بوجود می آورید و هر چند بار دیگر که بخواهید می توانید این فرایند را با همان قالب شرینی تکرار کنید.
پارگراف بالا درباره کلاس ها نیز صادق است. هنگامیکه شما یک شی را به نمایندگی از یک کلاس می خواهید ، شما یک نمونه (instance) از آن کلاس را ایجاد می کنید. یک نمونه شبیه حرف A است همانند هنگامیکه شما قالب شرینی را از روی خمیر بر می دارید.
هر نمونه شامل همان رفتارها و صفاتی است که در کلاس تعریف شده اند ، اگر چه هر نمونه یک کپی از صفات را برای خود دارد.
اشیاء انتزاعی (Abstract Objects) :
یک شی انتزاعی (Abstract Object) توصیفی از یک شی واقعی بدون در نظر کرفتن جزئیات آن شی است.
Abstract Object = Real Object – Details
(شی انتزاعی = شی واقعی - جزئیات)
به عنوان مثال ما برای یک شی فرد خصوصیاتی مانند نام ، نام خانوادگی ، قد و وزن را در نظر می گیریم و از بقیه صفات مربوط به آن صرفنظر می کنیم.
یک شی انتزاعی مدلی از شی واقعی است. یک شی واقعی همه صفات و رفتارهای تعریف شده یک شی انتزاعی را دارد همراه با جزئیات حذف شده از شی انتزاعی. برای مثال شی انتزاعی فرد یک مدل برای یک شخص واقعی است.شی انتزاعی می گوید که یک شخص واقعی باید یک نام ، نام خانوادگی ، قد و وزن داشته باشد. یک شخص واقعی مقادیر مرتبط با این صفات را مشخص می کند. مانند:
نام : بهروز
نام خانوادگی : بختیاری
قد : 175
وزن : 60
یک شی واقعی (Real Object) یک نمونه از شی انتزاعی است. شما می توانید بگوید که یک شخص واقعی یک نمونه از فرد انتزاعی است.
شی انتزاعی = یک مدل از شی واقعی
شی واقعی = یک نمونه از شی انتزاعی
انتزاعی کردن اشیاء واقعی :
برای مثال شما تصور کنید که می خواهید با یک فرد تماس بگیرید ، شما برای تماس با آن فرد نیاز ندارید که همه چیز را درباره او بدانید و فقط با دانستن نام و شماره تلفن طرف مقابل می توانید با او تماس بگیرید. شما می توانید نام پدر ، عادات و علایق آن قرد را بدانید و تمام اطلاعات دقیق و معتبر باشد ولی برای کاری که قرار است انجام بدهید نیاز به هیچ یک از این اطلاعات ندارید. شما برای انتزاعی کردن یک شی نیاز دارید فقط صفات و رفتارهای را از یک شی داشته باشید که برای انجام دادن کاری که قرار است انجام بدهید ضروری هستند و بقیه صفات و رفتارها را باید حذف کنید.
شما دنیا را چگونه می بینید ؟
شما دنیا را چگونه می بینید ؟ جواب این سوال بستگی به ذهنیت قبلی شما دارد. یک دانشمند ممکن است دنیا را یه صورت ساختارهای مولکولی ببیند. یک نفاش دنیا را در قالب اشکال و رنگ ها ببیند. و بعضی ها دنیا را به صورت مجموعه ای از اشیاء و مواد ببینند. شاید اولین چیزی که به ذهن شما خطور کند این باشد که این سوال چه ارتباطی با متدولوژی شی گرا دارد ؟ اما این نوع نگاه مهم است زیرا یک مهندس نرم افزار و برنامه نویس باید دنیا را در قالب اشیاء ببینند تا بتوانند آنها را در قالب برنامه های کامپیوتری شبیه سازی کنند.
یک شی چست ؟
یک شی می تواند یک موجودیت فیزیکی باشد ، مانند یک کتاب ، یک صندلی. شما می توانید یک کتاب را توصیف کنید ، آنرا بخوانید و آنرا بخرید.
یک شی می تواند یک موجودیت غیر فیزیکی و غیر قابل لمس (intangible) باشد ، مانند یک کار یا زمان. با اینکه یک کار چیزی است که شما بصورت فیزیکی نمی توانید آنرا لمس کنید اما می توانید آنرا توصیف کنید ، روی آن بحث کنید ، آنرا انجام بدهید و تکمیل کنید. هر چیزی که بتوانید آنرا توصیف کنید می تواند به عنوان یک شی در نظر گرفته شود.
یک کتاب ، یک صندلی ، یک کار و هر شی در دنیا واقعی بوسیله دو گروه از خصوصیات مشخصی می شوند :
- صفات(attributes) : صفات ویژگیهای یک شی را بیان می کند. در واقع یک صفت یک ویژگی از یک شی است مانند صفت نام برای یک فرد. صفات توصیف کننده یک شی هستند و با استفاده از مقادیر صفات می توان وضعیت فعلی یک شی را بدست آورد. برای مثال یک فرد می تواند دارای صفت تاهل باشد که با استفاده از مقدار این صفت می توان وضعیت تاهل آن فرد را در شرایط فعلی بدست آورد.
-
رفتار(behaviors): یک رفتار عملی است که یک شی توانایی انجام دادن آن را دارد. برای مثال یک شخص می تواند راه برود ، بدود ، بنشیند و هزاران کار دیگری که قادر به انجام دادن آن است که هر کدام از این کارها برای آن شخص یک رفتار محسوب می شود. یک سوال یک کتاب می تواند چه رفتاری داشته باشد. آیا یک کتاب قادر به انجام دادن کاری است تا به عنوان یک رفتار برای آن شی به حساب آید ؟ شی کتاب در حقیقت قادر به انجام هیچ کاری نیست. یک ناشر برای انتشار یک کتاب کارهای مانند ویرایش کتاب ، چاپ کتاب ، توزیع کتاب و در آخر فروش کتاب را انجام می دهد. این کارها توسط یک نفر بر روی کتاب انجام می گیرد. متدلوژی شی گرا به ما می گوید که این رفتارها را به جای فردی که این کارها را انجام می دهد را به شی کتاب تخصیص بدهیم.
