مفهوم شیئ گرایی در زبان های برنامه نویسی

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

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

برای درک بهتر مفهوم شیئ گرایی، به ذکر مثال دیگری می پردازیم. در مثال دوم، از خود کامپیوتر یا لپ تاپ شما به عنوان نمونه استفاده خواهیم کرد. سیستم شما یک شیئی است که می توانند چندین شیئ دیگر را در خود جای دهد مثل هارد، سی پی یو، رم و … . سیستم شما دارای یکسری Attribute یا خصیصه می باشد که آن را از دیگر کامپیوتر ها مجزا می سازد مثلاً دارای سی پی یو هشت هسته ای می باشد. در عین حال، کامپیوتر شما دارای یکسری Behavior یا عملکرد نیز می باشد (معادل فارسی این واژه رفتار است اما به منظور انتقال بهتر مفهوم، معنای عملکرد در اینجا در نظر گرفته شده است.) به طور مثال کامپیوتر شما می تواند یک فایل صوتی را پخش کند که این رفتار مختص یک شیئ از نوع کامپیوتر است اما دیگر اشیاء در دنیای واقعی مثل یخچال دارای چنین رفتاری نمی باشند.

در واقع در برنامه نویسی شیئی گرا، اشیاء داری سه ویژگی می باشند: اول این که هر شیئ دارای یک Identity یا هویت خاص خود است (به طور مثال دو انسان که به منزله شیئ هستند را در نظر بگیرید. درست است که هر دو دارای یکسری خصایص مثل داشتن دست و پا و قدرت تفکر و غیره می باشند و در عین حال عملکردهای مشابهی نیز دارند مثل حرف زدن، دویدن و … اما دارای دو هویت مجزا می باشند مثلاً احسان و نیما.) ویژگی دوم مربوط به Attribute یا خصیصه می باشد. مثلاً قد احسان ۱۸۵ سانتی متر است اما قد نیما ۱۷۶ سانتی متر می باشد. ویژگی سوم مربوط به Behavior یا رفتار آن شیئ است. مثلاً احسان می تواند به خوبی پیانو بنوازد اما نیما برنامه نویس خوبی است.

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

در برنامه نویسی به این کار اصطلاحاً Instantiation یا نمونه سازی گفته می شود. ما در برنامه نویسی شیئ گرایی برای ایجاد اشیاء اول نیاز به برخورداری از کلاس داریم اما نکته ای که این جا می بایست مد نظر قرار دهیم این است ما به عنوان برنامه نویس الزماً مجبور نیستیم که کلیه کلاس ها را خودمان بنویسیم چرا که بسیاری از کلاس ها از قبل در دل زبان برنامه نویسی مورد استفاده جای داده شده اند و ما به راحتی با استفاده کردن از کلاس یا کلاس های مد نظر می توانیم از قابلیت های آن بهره مند شویم. چنانچه بخوایم کلاس خود را هم بنویسیم همواره می بایست چهار مورد Abstraction, Polymorphism, Inheritance, Encapsulation را مد نظر قرار دهیم که می توان آن ها را به عنوان ویژگی های شیئ گرایی قلمداد کرد.

به خاطر داشته باشید

به منظور به خاطر سپردن این چهار عنصر اصلی ساخت کلاس، می توان حرف اول هر یک از چهار کلمه را گرفته و کلمه A PIE به معنی یک کلوچه را به خاطر سپرد.

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

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

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

نکته

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

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

اصطلاح Polymorphism به معنی چند فرمی است و برای روش شدن این مطلب به ذکر مثالی اکتفا می کنیم. به طور مثال حیوان سگ را در نظر بگیریم. این حیوان چنانچه داده ای از جنس بوی آدم غریبه به حس بویایی اش منتقل شود «واق واق» می کند. چنانچه داده ای از جنس گوشت به حس بویایی اش منتقل شود بزاق دهانش ترشح می شود و چنانچه داده ای از جنس بوی صاحبش به حس بویایی اش منتقل شود دم تکان می دهد. در هر سه حالت این حس بویایی سگ است که فعالیت می کند و تنها تفاوت در نوع داده ای است که به حس بویایی سگ منتقل می شود. در زبان برنامه نویسی جاوا علامت + دقیقاً چنین ویژگی دارا است. چنانچه ما دو متغییر از جنس عددی را با علامت + جمع کنیم حاصل جمع آن دو عدد را به ما خواهد داد. مثلاً ۱۲ = ۷ + ۵ اما اگر دو متغییر از جنس String یا رشته را با یکدیگر جمع کنیم آن دو کلمه را در کنار یکدیگر قرار خواهند گرفت مثل Hello + World = HelloWorld.

 

دیدگاه‌تان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *