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

مقدمه ای بر متد Object – Oriented (شی گرایی)

شی گرایی (Object – Oriented) لغتی است که امروزه در صنعت طراحی سایت و توسعه نرم افزار، باب شده است. شرکت ها به سرعت حرکت می کنند تا خود را با این تکنولوژی جدید سازگار کنند و آن را در برنامه های موجود خود وارد نمایند. در حقیقت، بیشتر برنامه ها امروزه با شی گرایی توسعه می یابند. اما شی گرایی به چه معنا است؟ مند شی گرایی (OOP) یک راه متفاوت مشاهده برنامه هاست. با متد شی گرایی، شما یک برنامه را به قطعات بسیار کوچک یا آبجکت هایی تقسیم می کنید، که تا اندازهای مستقل از یکدیگر می باشند. به آن مانند ساختمانی از بلوک ها نگاه کنید.

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

تفاوت متد شی گرایی با روش سنتی توسعه چیست؟

در روش سنتی، روش توسعه به همراه اطلاعاتی که سیسم نگهداری خواهد کرد به خودمان وابسته است.  در این روش، ما از کاربران می پرسیم که چه اطلاعاتی را نیاز دارند، پایگاه داده ای را طراحی میکنیم که اطلاعات را نگه دارد، صفحاتی را تهیه می کنیم تا اطلاعات را بگیرد، و گزارش هایی را چاپ می کنیم تا اطلاعات را برای کاربر نمایش دهد. به عبارت دیگر، ما بر روی اطلاعات متمرکز می شویم و کمتر توجه می کنیم که چه کاری با این اطلاعات انجام شده سن یا رفتار سیستم چگونه است. این روش data-centric (مبتنی بر داده) نامیده شده است و برای ایجاد هزاران سیستم در سال، ایجاد شده است.

مدل سازی Data-centric مخصوص طراحی پایگاه داده و گرفتن اطلاعات خیلی مهم می باشد. اما انتخاب این روش در زمان طراحی برنامه های تجاری با مشکلاتی همراه است. یک چالش بزرگ این است که درخواست های سیستم چندین بار تغییر خواهند کرد. سیستمی که از روش data-centric استفاده می نماید، می تواند به آسانی تغییر در پایگاه داده را مدیریت نماید. اما اجرای تغییرات در قوانین تجاری یا رفنار (behavior) سیستم آن قدر آسان نمی باشد. متد شی گرایی در پاسخ به این مشکل، ایجاد شده است. با متد شی گرایی هم بر اطلاعات و هم بر رفتار متمرکز می شویم. در نتیجه اکنون میتوانیم سیستم هایی را ایجاد نماییم د انعطاف پذیر شده اند تا اطلاعات و یا رفتار را تغییر دهند .

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

  • نهان سازی (Encapsulation)
  • وراثت (Inheritance)
  • چند ریختی (Polymtrphism)

Encapsulation (نهان سازی)

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

در نتیجه، همه تغییرات سیستم بانکی مربوط به حساب ها، می توانند به آسانی در آبجکت حساب انجام شوند.

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

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

اساسا ما محل تمام جاهایی که از عملیات برداشت از حساب، در سیستم استفاده شده است را نمی دانیم. بنابراین باید به هرجایی نگاه کنیم و وقتی که آن را پیدا کردیم، باید یک سری تغییرات را ایجاد کنیم درخواست جدید را یکپارچه نماییم. اگر واقعأ كار بدرستی انجام شده باشد، احتمالا ۸۰% موارد برداشت از حساب را در سیستم پیدا کرده ایم. با یک سیستم نهان سازی، ما نیازی به استفاده از روش اجباری برای تجزیه و تحلیل نداریم. ما به مدل سیستم خود نگاه میکنیم و به آسانی جایی که رویداد برداشت از حساب پنهان شده بود را پیدا می کنیم. بعد از اینکه عملیات را در حساب قرار دادیم، یک بار درخواستمان را فقط در آن آبجکت تغییر می دهیم، و کار ما تمام شده است.

یک مفهوم مشابه نهان سازی، Information Hiding (پنهان سازی اطلاعات) می باشد. پنهان سازی اطلاعات، توانایی است که جرئیات مبهم یک آبجکت را از دنیای خارج پنهان می نماید. در یک آبجکت، دنیای خارج به معنی هر چیزی خارج از همان آبجکت است حتی اگرچه دنیای خارج شامل بقیه سیستم باشد. پنهان سازی اطلاعات (Information Hidling) همان مزیت نهان سازی (Encapsolation) را فراهم میکند: انعطاف پذیری.

Inheritance (وراثت)

Inheritance (وراثت) دومین مفهوم اساسی شی گرایی میباشد. در سیستم های شی گرا ، وراثت به شما اجازه می دهد تا آبجکت های جدید را بر پایه آبجکت های قدیمی ایجاد کنید. آبجکت child (فرزند) ویژگیهای یک آبجکت parent (والد) را به ارث می برد. شما می توانید نمونه هایی از وراثت را در دنیای طبیعی ببینید.

هزاران نوع مختلف از پستانداران مانند سگ ها، گربه ها، انسانها، نهنگ ها و غیره وجود دارند. هر یک از اینها ویژگی های مشخصی دارند که منحصر به فرد بوده و این ویژگیهای مشخص مانند داشتن مو، خونگرم بودن و غذادادن به بچه ها، در کل گروه مشترک می باشند. در اصطلاحات شی گرایی، یک آبجکت بنام mammal (پستاندار) وجود دارد که ویژگیهای مشترک را نگه می دارد. این آبجکت والد (parent) آبجکت های فرزندی (child) مانند گربه، سگ، انسان، نهنگ و غیره می باشد. آبجکت سگ (dog) ویژگیهای آبجکت پستاندار (mammal) را به ارث می برد، مانند دویدن در دایره ها (حلندها) و ریختن آب از لب و لوچه. متد شی گرایی ایده وراثت را از دنیای طبیعی گرفته است.

یکی از مزایای اصلی وراثت، سهولت در نگهداری است. وقتی چیزی تغییر می کند و بر همه پ می نارد. فقط آبجکت والد نیاز به تغيير دارد و ابجکتهای فرزند به طور خودکار تغییرات را به اده پستانداران به طور ناگهانی خونسرد شونده فقط آبجکت پستاندار (mammal) باید تغییر نماید نهنگ و دیگر آبجکت های فرزند به طور خودکار ویژگی جدید خونسردبودن پستانداران را به ارث می برند. در یک سیستم شی گرا یک مثال برای وراثت میتواند پنجره ها باشند.

سیستمی بزرگ دارای ۱۲۵ تابلو داریم. روزی، یک مشتری درخواست یک پیغام انصراف بر روی همه تابلوها را می دهد. در یک سیستم بدون وراثت، ما كار خسته کننده ای داریم که باید به هر یک از این ۱۲۵ تابلو رفته و تغییر را در آن ایجاد کنیم. اگر سیستم ما شی گرا باشد، ما همه تابلوها را از یک والد مشترک به ارث می بریم. بنابراین فقط نیاز داریم تا به آبجکت والد رفته و یکبار آن را تغییر دهیم.

در یک سیستم بانکداری، ممکن است از وراثت برای انواع مختلفی از حساب هایی که داریم استفاده نماییم. بانک فرضی ما دارای چهار نوع مختلف حساب می باشد. جاری، پس انداز، کارت اعتباری ، سپرده گذاری. این انواع مختلف حساب ها شباهت هایی نیز دارند. هر کدام دارای یک شماره حساب، نرخ بهره و نام مالک می باشد. بنابراین می توانیم یک آبجکت والد بنام account (حساب) را ایجاد نماییم تا ویژگی های مشترک همه این حساب ها را نگهداری کنیم.

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

تغییرات آبجکت والد بر روی همه فرزندان اثر خواهد گذاشت، اما بچه ها آزاد هستند که بدون برهم زدن آرامش فرزند دیگر یا والدشان تغییر نمایند.

Polymorphism (چند ریختی)

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

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

بدون چند ریختی، کد تابع draw (رسم) ممکن است مانند زیر باشد.

با چند ریختی، كد draw (رسم) باید توسط تابع ()drawme برای آبجکت طراحی شده فراخوانی شود. مانند این مثال:

هر شکل دایره، خط، مستطیل و غیره) باید تابع ()drawMe را داشته باشد تا شکل به خصوصی را بکشد.

یکی از مزایای چندریختی مانند دیگر اصول شی گرایی، سهولت نگهداری است.

زمانی که لازم است تا برنامه یک مثلث را رسم نماید، چه اتفاقی می افتد؟ در موردی که از چندریختی استفاده نشده است یک تابع ()drawTriangle جدید به آبجکت shape (شکل) اضافه شده است. همچنین تابع ()DrawMe آبجکت shape تغییر کرده است تا با نوع جدید شکل سازگار شود. با چند ریختی ما یک آبجک triangle (مثلث) جدید را درون تابع ()drawMe ایجاد می کنیم تا خودش را رسم نماید. تابع ()draw عملگرهای طراحی را اجرا می نماید اصلا نباید تغییر کند.