۱۳۸۹ آذر ۵, جمعه

برنامه نویسی شیء گرا (Object Oriented Programming - OOP)

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

شاید این سوال کمی مبهم به نظر برسد، ولی احتمالا در ادامه مطلب متوجه خواهید شد که منظور من از طرح این سوال چه بود. راهی که امروز برنامه نویسان برای حل اینگونه مسائل استفاده می کنند این است که به همه این وسایط نقلیه به عنوان یک شیء نگاه می کنند، به این معنی که برای مثال همه وسایط نقلیه را به عنوان یک شیء در نظر می گیرند و همه خصوصیات مشترک آنها را یکجا تعریف می کنند. برای مثال همه وسایط نقلیه حرکت می کنند پس متغیر های مرتبط با حرکت بین همه آنها مشترکند مثل سرعت و جهت حرکت (یا در واقع بردار سرعت)، شتاب و جهت آن (یا بردار شتاب) و همینطور موقیت فعلی با توجه به محورهای مختصات (x,y,z). شاید بتوان متغیر های مشترک دیگری نیز بین آنها پیدا کرد مثل وزن، حداکثر سرعت، مقاومت در برابر باد و ... .
برنامه نویس همه اینها را به عنوان خصوصیات مشترک وسایط نقلیه در نظر می گیرد و در یک بسته به نام کلاس تعریف می کند.
البته متغیرها تنها چیزهایی نیستند که می توان در یک کلاس تعریف کرد، ولی فعلا به همین بسنده می کنیم و به بحث ادامه می دهیم.
حال نوبت به تعریف وسایط نقلیه ای که روی زمین حرکت می کنند می رسد. از این دسته می توان به اتومبیل ها و کامیونها اشاره کرد. خصوصیات مشترک همه اینها کدامند؟ اصطکاک با زمین شاید یکی از آنها باشد. حداکثر تعداد دنده ها و همینطور دنده جاری نیز می توانند جزء این متغیر ها باشند. برنامه نویس این متغیر ها را در یک کلاس دیگر تعریف می کند اما حتما یادتان هست که این کلاس همه خصوصیات کلاس بالاتر (وسایط نقلیه) که در بالا ذکر شد را دارند. به همین دلیل این کلاس (وسایط نقلیه زمینی) همه خصوصیات کلاس بالاتر را به ارث می برد. به همین ترتیب می توان کلاسهای دیگر مثل وسایل نقلیه هوایی و آبی را تعریف کرد و سپس زیر مجموعه های هرکدام (مثلا کامیون و اتومبیل به عنوان زبر مجموعه های وسایط نقلیه زمینی).

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

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

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

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

یک شی (Object)  ممولا یک مفهوم در دنیای واقعی مثل کالا، شخص، حساب بانکی و ... را نشان می دهد. می توان گفت که شیء یک نمونه (Instance) از کلاس است، اگر شخص یک کلاس باشد، آقای "علی احمدی" یک شیء است.
زیر کلاسها معمولا خاص تر از کلاسهای والد هستند و به طور دقیق تر خصوصیات یک شیء را بیان می کنند. مثل کلاس وسایط نقلیه به عنوان والد و کلاس وسایط نقلیه زمینی به عنوان کلاس فرزند در مثال بالا. به این خاصیت ارثبری (Inheritance) گفته می شود.

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

تقریبا تمام زبانهای برنامه نویسی امروزی از برنامه نویسی شیء گرا به طور کامل پشتیبانی می کنند. C++ مهمترین آنهاست و اگر مایل به راحتی بیشتر درطراحی نرم افزار ها هستید و بیشتر به برنامه های تجاری تحت ویندوز فکر می کنید، C#.net یا VB.net گزینه های مناسبی برای شما می باشند. شاید یاد گرفتن VB.net راحت تر از C#.net باشد، باز هم تاکید می کنم که شاید!، اما توصیه من به شما این است که اگر برنامه نویسی به هیچ زبانی را بلد نیستید، با C# شروع کنید چون هم مدت زمان کمتری را صرف یادگیری این زبان می کنید (نسبت به C++) و هم اگر در آینده بخواهید C++ را یاد بگیرید و کمی پیشرفته تر کار کنید، به دلیل نزدیکی قواعد نحوی دو زبان بسیار راحت تر خواهید بود. ضمنا کسی که C#.net را بلد است، به دلیل Platform یکسان آن با VB.net براحتی می تواند آن را نیز یاد بگیرد، گرچه نیازی به این کار نخواهد بود. اگر یکی از زبانهای .net را یاد گرفته باشید نیاز زیادی به یادگیری سایر آنها پیدا نخواهید کرد، چون تقریبا توانایی های یکسانی دارند. در ضمن C# به طرز باور نکردنی به Java نزدیک است و اگر نیاز به یادگیری Java داشتید پس از یادگیری C# کار چندان سختی پیش رو ندارید.

در پستهای بعد سعی خواهم کرد زبانهای برنامه نویسی را با هم مقایسه کنم.

امیدوارم این مطلب مفید بوده باشد.

موفق باشید.

هیچ نظری موجود نیست:

ارسال یک نظر