چهارشنبه ۲۸ آذر ۰۳

شی گرایی

ایزی پای لرن یه وبلاگ تخصصی در مورد زبان قدرتمند پایتون هستش

شی گرایی

۲۴۴ بازديد

برنامه‌نویسی شی‌گرا (Object-Oriented Programming) یا به اختصار OOP یک الگو یا شیوه‌ی تفکر در برنامه‌نویسی است که برگرفته از دنیای واقعی بوده و از دهه ۱۹۶۰ میلادی مطرح گشته است. به زبانی که از این الگو پشتیبانی کند، «زبان شی‌گرا» گفته می‌شود. ایده‌ی شی‌گرایی در پاسخ به برخی از نیازها که الگوهای موجود پاسخ‌گوی آن‌ها نبودند به وجود آمد؛ نیازهایی مانند: توانایی حل تمامی مسائل پیچیده (Complex)، «پنهان‌سازی داده» (Data Hiding)، «قابلیت استفاده مجدد» (Reusability) بیشتر، وابستگی کمتر به توابع، انعطاف بالا، کپسوله سازی و...

رویکرد برنامه‌نویسی شی‌گرا «از پایین به بالا» (Bottom-Up) است؛ یعنی ابتدا واحدهایی کوچک از برنامه ایجاد می‌شوند و سپس با پیوند این واحدها، واحدهایی بزرگتر و در نهایت شکلی کامل از برنامه به وجود می‌آید. برنامه‌نویسی شی‌گرا در قالب دو مفهوم «کلاس» (Class) و «شی» (Object) ارائه می‌گردد. هر کلاس واحدی از برنامه است که تعدادی داده و عملیات‌ را در خود نگه‌داری می‌کند و هر شی نیز حالتی (State) مشخص از یک کلاس می‌باشد.

در برنامه‌نویسی شی‌گرا، هر برنامه در قالب موجودیت‌های کوچکی که در واقع همان اشیا هستند و با یکدیگر تعامل دارند در نظر گرفته می‌شود. برای داشتن این اشیا می‌بایست ابتدا کلاس‌های برنامه را تعریف نماییم؛ هر کلاس «رفتار» (Behavior) و «صفات» (Attributes) اشیایی که قرار است از آن ایجاد شوند را تعریف می‌کند. از یک کلاس می‌توان هر تعداد که بخواهیم شی ایجاد نماییم. هر شی بیانگر یک «حالت» یا یک «نمونه» (Instance) از کلاس خود است.

شی‌گرایی در اصل یک تفکر برنامه‌نویسی است. به عنوان مثال وسیله‎‌ی نقلیه را در نظر بگیرید. وسیله‎‌ی نقلیه در یک کلاس بالاتر قرار می‌گیرد و خود به چند زیرکلاس تقسیم می‌شود. مانند وسیله‌ی چرخ‌دار و  بدون چرخ. همانطور که در تصویر مشاهده می‌کنید.

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

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

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

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

به کلاسی که از آن ارث‌بری می‌شود ”Parent Class“ یا ”Base Class“ (کلاس پایه) یا ”Superclass“ و به کلاسی که اقدام به ارث‌بری می‌کند ”Child Class“ (کلاس فرزند) یا ”Derived Class“ یا ”Subclass“ گفته می‌شود.

ارث‌بری توسط «نسبت هست-یک» (IS-A Relationship) بیان می‌شود؛ این نسبت می‌گوید کلاس فرزند یک نوع از چیزی است که کلاس پایه هست. کلاس A از کلاس B ارث‌بری دارد؛ در این حالت می‌گوییم: A is a type of B، یعنی درست است اگر بگوییم: «سیب» یک نوع «میوه» است یا «خودرو» یک نوع «وسیله نقلیه» است ولی توجه داشته باشید که این یک ارتباط یک‌طرفه از کلاس فرزند به کلاس پایه است و نمی‌توانیم بگوییم: «میوه» یک نوع «سیب» است یا «وسیله نقلیه» یک نوع «خودرو» است.

کلاس‌ها می‌توانند مستقل باشند ولی هنگامی که وارد رابطه‌های وراثت می‌شوند، یک ساختار سلسله مراتب (Hierarchy) به شکل درخت را تشکیل می‌دهند. برای نمونه به ساختار سلسله مراتب وراثت پایین که مربوط به برخی اشکال هندسی است توجه نمایید، پیکان‌ها نشانگر نسبت is-a هستند.


در برنامه‌نویسی شی‌گرا نسبت دیگری نیز با عنوان «نسبت دارد-یک» (HAS-A Relationship) وجود دارد که بیانگر مفهومی به نام «ترکیب» (Composition) است که شکل دیگری از قابلیت استفاده‌ی مجدد کد می‌باشد ولی مفهومی متفاوت با وراثت دارد. این نسبت زمانی بیان می‌شود که درون یک کلاس (مانند: C) از کلاس دیگری (مانند: D) نمونه‌سازی شده باشد؛ یعنی شی کلاس C درون خودش شی‌ای از کلاس D را داشته باشد؛ در این حالت می‌گوییم: C has a D. به یاد دارید خواندیم کلاس خودرو از کلاس‌های کوچکتری ساخته شده است؛ مثلا کلاس موتور - یعنی درون این کلاس یک شی از کلاس موتور ایجاد شده است، اکنون می‌توانیم بگوییم: «خودرو» یک «موتور» دارد.



چندریختی:

مفهوم چندریختی بیانگر توانایی کلاس فرزند در تعریف متدهایی است که در کلاس پایه موجود می‌باشند. برای نمونه دو کلاس «ماهی» و «گربه» را که هر دو آن‌ها از کلاسی به نام «حیوانات» ارث‌بری دارند را در نظر بگیرید؛ در کلاس حیوانات متدی با عنوان «غذا خوردن» که عملی مشترک در میان تمام حیوانات است وجود دارد ولی از آنجا که چگونگی انجام آن در ماهی و گربه متفاوت است، بنابراین هر دو این کلاس‌ها نیاز دارند تا متد «غذا خوردن» مخصوص خود را داشته باشند - در این جاست که این متد در کلاس‌های فرزند بازتعریف می‌شود، به این عمل ”Method Overriding“ گفته می‌شود. با Override کردن یک متد، متد کلاس پایه زیر سایه متد مشابه در کلاس فرزند قرار می‌گیرد و از نظر اشیا کلاس فرزند پنهان می‌شود.

-------------------------------------------------
برای مشاهده‌ی مطالب بیشتر در کانال تگرام ایزی پای لرن عضو شوید.

برنامه نویسی شی گرا در جاوا اسکریپت

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

چرا باید OOP یاد گرفت؟

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

علاوه بر این می‌توانید یک رابط کاربری ساده ای درست کنید آن هم با مخفی کردن پیچیدگی های غیر ضروری ( چون نیازی نیست تمام مراحل برنامه نویسی قابل دیدن باشه که باعث پیچیدگی بشه) و با شی گرایی از شر کد های زائد خلاص میشیم و کد های تمیز تری داریم.

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