جلسه 5 مقدمه اي بر طراحی و برنامه سازي شیءگرا
مقدمه و مفاهیم پایه
- تیتر: چرا برنامهسازی شیءگرا؟ انقلابی در توسعه نرمافزار
- محتوا:
- نارساییهای رویکردهای رویهای (Procedural Programming).
- معرفی پارادایم شیءگرا به عنوان راهحل.
- تعریف دنیای واقعی با اشیاء (Objects) و تعاملات آنها.
- مزایای اصلی OOP: قابلیت استفاده مجدد، نگهداری آسان، مقیاسپذیری.
- مثال: مقایسه ساخت یک برنامه مدیریت کتابخانه با رویکرد رویهای (توابع جداگانه برای کتاب، امانت، بازگرداندن) در مقابل رویکرد شیءگرا (کلاس
کتاببا متدهایی مانندامانت_دادنوبازگرداندن). - تمرین پایان فصل:
۱. سه مورد از چالشهای اصلی در پروژههای نرمافزاری بزرگ که با رویکردهای سنتی (رویهای) به سختی حل میشوند را نام ببرید.
۲. چگونه مفهوم “شیء” در دنیای واقعی (مانند یک خودرو) میتواند به مدلسازی نرمافزار کمک کند؟
۳. مزیت اصلی استفاده از OOP در تیمهای توسعه نرمافزار چیست؟
- خلاصه نکات کلیدی:
- OOP مشکلات برنامهنویسی رویهای را با تمرکز بر دادهها و رفتار در قالب اشیاء حل میکند.
- قابلیت استفاده مجدد کد، نگهداری سادهتر و توسعه مقیاسپذیر از مزایای کلیدی OOP هستند.
بخش ۲: کلاسها و اشیاء (Classes and Objects)
- تیتر: بلوکهای سازنده OOP: کلاسها و اشیاء
- محتوا:
- تعریف کلاس (Class) به عنوان یک الگو (Blueprint).
- تعریف شیء (Object) به عنوان نمونهای (Instance) از یک کلاس.
- ویژگیها (Attributes / Properties) و رفتارها (Methods / Functions) در یک کلاس.
- سازندهها (Constructors) و نقش آنها در مقداردهی اولیه اشیاء.
- مفهوم
thisیاselfبرای ارجاع به شیء جاری. - مثال: تعریف کلاس
دانشجوبا ویژگیهاینام،شماره_دانشجویی،معدلو متدهایی مانندثبت_نام_درسونمایش_اطلاعات. سپس ایجاد چند شیء از این کلاس (مثلاًدانشجو۱،دانشجو۲). - تمرین پایان فصل:
۱. تفاوت بین کلاس و شیء را با یک مثال ساده توضیح دهید.
۲. یک کلاس فرضی برای نمایش یک حساب بانکی طراحی کنید. حداقل ۳ ویژگی (مانند شماره_حساب، موجودی) و ۲ متد (مانند واریز، برداشت) برای آن تعریف کنید.
۳. وظیفه سازنده (Constructor) در یک کلاس چیست؟
- خلاصه نکات کلیدی:
- کلاسها الگوهایی هستند که اشیاء از روی آنها ساخته میشوند.
- اشیاء نمونههایی از کلاسها با دادهها (ویژگیها) و عملیات (متدها) خاص خود هستند.
- سازندهها برای مقداردهی اولیه اشیاء هنگام ایجادشان استفاده میشوند.
بخش ۳: کپسولهسازی (Encapsulation)
- تیتر: حفاظت از دادهها: قدرت کپسولهسازی
- محتوا:
- مفهوم پنهانسازی دادهها (Data Hiding).
- سطوح دسترسی (Access Modifiers): عمومی (Public)، خصوصی (Private)، محافظتشده (Protected) - (بسته به زبان برنامهنویسی مورد استفاده، این بخش میتواند عمیقتر یا خلاصهتر باشد).
- نقش متدهای دسترسی (Getters) و تغییردهنده (Setters).
- مزایای کپسولهسازی: امنیت داده، کنترل تغییرات، انعطافپذیری.
- مثال: در کلاس
حساب بانکی، ویژگیموجودیرا خصوصی (private) تعریف کرده و از متدهایget_موجودی()وset_موجودی()(که ممکن است منطق اعتبارسنجی داشته باشد) برای دسترسی و تغییر آن استفاده کنیم. - تمرین پایان فصل:
۱. کپسولهسازی را تعریف کرده و بگویید چرا اهمیت دارد.
۲. چرا بهتر است ویژگیهای یک کلاس را به صورت خصوصی (private) تعریف کنیم؟
۳. چه زمانی از متدهای Getter و Setter استفاده میکنیم؟
- خلاصه نکات کلیدی:
- کپسولهسازی یعنی بستهبندی دادهها و متدها در یک واحد (کلاس) و کنترل دسترسی به دادهها.
- این کار امنیت دادهها را افزایش داده و از تغییرات ناخواسته جلوگیری میکند.
بخش ۴: وراثت (Inheritance)
- تیتر: ارثبری: ساختن بر اساس داشتهها
- محتوا:
- مفهوم وراثت: کلاس والد (Parent/Superclass) و کلاس فرزند (Child/Subclass).
- ایجاد سلسله مراتب کلاسها (Class Hierarchy).
- قابلیت استفاده مجدد کد از طریق وراثت.
- بازنویسی متدها (Method Overriding).
- مفهوم
superبرای فراخوانی متدهای کلاس والد. - مثال: کلاس والد
خودروبا ویژگیسرعتو متدحرکت(). کلاسهای فرزندسواریوکامیونکه ازخودروارث میبرند و ممکن است متدحرکت()را بازنویسی کنند یا ویژگیهای جدیدی مانندظرفیت_بار(برای کامیون) اضافه کنند. - تمرین پایان فصل:
۱. وراثت در OOP چیست و چه فایدهای دارد؟
۲. یک کلاس والد به نام شکل تعریف کنید. سپس دو کلاس فرزند به نامهای دایره و مربع ایجاد کنید که از شکل ارث ببرند. هر کلاس باید متد مربوط به محاسبه مساحت را داشته باشد.
۳. تفاوت بین بازنویسی متد (Method Overriding) و بارگذاری بیش از حد متد (Method Overloading) را توضیح دهید (اگر در سطح درس گنجانده شده است).
- خلاصه نکات کلیدی:
- وراثت به کلاسهای فرزند اجازه میدهد ویژگیها و رفتارهای کلاس والد را به ارث ببرند.
- این قابلیت به کاهش تکرار کد و ایجاد روابط “یک نوع از” (is-a) بین کلاسها کمک میکند.
بخش ۵: چندریختی (Polymorphism)
- تیتر: اشکال چندگانه: قدرت چندریختی
- محتوا:
- مفهوم چندریختی: توانایی یک شیء برای داشتن اشکال متعدد.
- چندریختی در زمان اجرا (Runtime Polymorphism) از طریق وراثت و بازنویسی متدها.
- چندریختی در زمان کامپایل (Compile-time Polymorphism) از طریق بارگذاری بیش از حد متدها (Method Overloading) (اگر پوشش داده شود).
- کاربرد چندریختی در افزایش انعطافپذیری و کاهش وابستگی کد.
- مثال: فرض کنید لیستی از اشیاء
شکل(که شاملدایرهومربعاست) داریم. میتوانیم روی این لیست پیمایش کرده و متدرسم()را روی هر شیء فراخوانی کنیم؛ سیستم به طور خودکار نسخه صحیحرسم()را برایدایرهیامربعاجرا خواهد کرد. - تمرین پایان فصل:
۱. چندریختی در OOP به چه معناست؟
۲. چگونه وراثت و بازنویسی متدها به ایجاد چندریختی کمک میکنند؟ مثالی بزنید.
۳. یک مثال واقعی از کاربرد چندریختی در یک سیستم نرمافزاری (مثلاً سیستم پرداخت، پردازش پیام) بیان کنید.
- خلاصه نکات کلیدی:
- چندریختی به اشیاء اجازه میدهد تا رفتارهای متفاوتی را بسته به نوع خود نشان دهند.
- این اصل، کد را انعطافپذیرتر و قابل توسعهتر میکند.
بخش ۶: مفاهیم پیشرفتهتر (اختیاری/مقدماتی)
- تیتر: فراتر از اصول: کلاسهای انتزاعی و واسطها
- محتوا:
- کلاسهای انتزاعی (Abstract Classes): کلاسهایی که نمیتوان از آنها مستقیماً شیء ساخت و معمولاً شامل متدهای انتزاعی هستند.
- واسطها (Interfaces): قراردادهایی که مشخص میکنند یک کلاس چه متدهایی باید پیادهسازی کند (بدون ارائه پیادهسازی).
- تفاوت بین کلاس انتزاعی و واسط.
- نقش این مفاهیم در طراحی سیستمهای بزرگ و قابل نگهداری.
- مثال: کلاس انتزاعی
حیوانبا متد انتزاعیصدا_ایجاد_کن(). کلاسهایگربهوسگکه ازحیوانارث میبرند و متدصدا_ایجاد_کن()را پیادهسازی میکنند (مثلاً “میو” برای گربه، “هاپ هاپ” برای سگ). - تمرین پایان فصل:
۱. کلاس انتزاعی چیست و چه زمانی از آن استفاده میکنیم؟
۲. واسط (Interface) چه نقشی در برنامهنویسی شیءگرا ایفا میکند؟
۳. یک مثال بزنید که در آن استفاده از واسط مفیدتر از وراثت باشد.
- خلاصه نکات کلیدی:
- کلاسهای انتزاعی و واسطها ابزارهایی برای تعریف قراردادها و الگوهای طراحی در سطوح بالاتر هستند.
- آنها به ایجاد ساختارهای نرمافزاری قویتر و انعطافپذیرتر کمک میکنند.