معرفی و تعریف
«برنامهنویسی شیءگرا» (Object-Oriented Programming | OOP) روشی برای طراحی نرمافزار است که در آن داده و رفتار مرتبط با آن در قالب «شیء» کنار هم قرار میگیرند. کلاس، طرح یا الگوی ساخت اشیا است و هر شیء نمونهای از یک کلاس محسوب میشود.
در این رویکرد، مفاهیمی مانند کپسولهسازی، ترکیب، وراثت و چندریختی کمک میکنند مسئولیتهای سیستم را تفکیک کنید. برای مثال، در سامانه فروش، شیء سفارش میتواند اقلام، وضعیت و عملیات محاسبه مبلغ خود را مدیریت کند، بدون آنکه منطق آن در بخشهای نامرتبط پخش شود.
برنامهنویسان نرمافزار، توسعهدهندگان بکاند، موبایل و بازی، بهویژه هنگام کار با Java و #C و Kotlin و Swift و بسیاری از فریمورکهای سازمانی، از این مهارت استفاده میکنند. هدف، صرفاً ساختن کلاسهای بیشتر نیست. هدف طراحی اجزایی است که تغییر، تست و نگهداری آنها قابلکنترل باشد.
برآورد ۱۰۰ ساعت برای فردی است که مبانی یک زبان برنامهنویسی را میداند و هفتهای حدود ۸ تا ۱۰ ساعت برای مطالعه و تمرین وقت میگذارد. در این شرایط، رسیدن به سطح کاربردی معمولاً حدود ۲ تا ۳ ماه زمان میبرد. یادگیری همزمان یک زبان جدید یا تمرین نکردن با پروژه، این زمان را افزایش میدهد.
اهمیت و کاربردها
چرا این مهارت مهم است؟
برنامهنویسی شیءگرا در بسیاری از کدبیسهای Java و #C و پشتههای سازمانی، بخشی از زبان مشترک تیم برای طراحی و بازبینی کد است. در شرکتهای محصولی و سازمانی ایران نیز، پیش از اقدام برای نقشهایی مانند توسعهدهنده بکاند یا مهندس نرمافزار، آگهیهای همان نقش و فناوری را بررسی کنید. اگر Java و #C و .NET و Spring یا Kotlin در نیازمندیها آمده است، بتوانید مسئولیت یک کلاس، مرز وابستگیها و پیامد تغییر یک مدل را در کد توضیح دهید.
این مهارت زمانی ارزش عملی دارد که به کدی با تغییرپذیری بهتر منجر شود. طراحی مناسب میتواند افزودن روش پرداخت تازه، تغییر قانون تخفیف یا جایگزینی سرویس خارجی را محدود به چند جزء مشخص کند. در مقابل، کلاسهای بسیار بزرگ، سلسلهمراتب وراثت عمیق و انتزاعهای زودهنگام اغلب کد را پیچیدهتر میکنند.
شیءگرایی تنها راه طراحی نرمافزار نیست. برای تبدیلهای ساده داده، پردازشهای تحلیلی، اسکریپتهای کوتاه یا منطقهای مستقل، توابع ساده و ترکیب توابع ممکن است خواناتر باشند. توسعهدهنده حرفهای باید تشخیص دهد چه زمانی مدلسازی با اشیا مسئله را روشن میکند و چه زمانی فقط لایهای اضافی میسازد.
کاربردها
-
مدلسازی سفارش و پرداخت در فروشگاه آنلاین
تفکیک مسئولیت سفارش، قلم سفارش، سبد خرید و روش پرداخت، بهگونهای که افزودن روش پرداخت جدید به منطق کل سامانه سرایت نکند.
-
طراحی سرویسهای بکاند
جدا کردن منطق دامنه، دسترسی به داده و ارتباط با سرویسهای بیرونی در کلاسها و رابطهای دارای مسئولیت مشخص.
-
پیادهسازی قوانین متغیر کسبوکار
استفاده از چندریختی یا ترکیب برای قوانین متفاوت تخفیف، مالیات، ارسال یا سطح دسترسی، بدون زنجیرههای طولانی شرطی.
-
توسعه اپلیکیشن موبایل
مدلسازی وضعیت، دادههای کاربر و سرویسهای برنامه در پروژههای Kotlin و Swift یا Flutter با مرزهای روشن بین اجزا.
-
تستپذیر کردن منطق نرمافزار
تزریق وابستگیها و جدا کردن وابستگیهای خارجی، تا منطق اصلی بدون پایگاه داده، شبکه یا سرویس واقعی تست شود.
-
نگهداری سامانههای سازمانی
خواندن، اصلاح و بازآرایی کدبیسهای بزرگ که مدل دامنه و سرویسهای آنها بر پایه کلاسها و رابطها شکل گرفتهاند.
ابزارهای مرتبط
پیشنیازها
شروع این مهارت با دانستن پیشنیازهای زیر هموارتر میشود.
- توانایی نوشتن برنامههای کوچک با متغیر، شرط، حلقه و تابع در دستکم یک زبان برنامهنویسی
مسیر یادگیری برنامهنویسی شیءگرا
-
۱۲ ساعت
برنامههای ساده را با تابع و داده مدل کنید
پیش از ساخت کلاس، یک مسئله کوچک مانند مدیریت کتابخانه یا سبد خرید را با متغیر، ساختار داده، شرط و تابع حل کنید. مشخص کنید هر داده کجا نگهداری میشود و هر تابع چه تغییری ایجاد میکند. این مقایسه نشان میدهد چرا و کجا به شیء نیاز دارید.
-
۱۸ ساعت
کلاس و شیء را برای یک مفهوم واقعی بسازید
کلاس، سازنده، ویژگی و متد را در زبان منتخب خود تمرین کنید. برای مفاهیمی مانند کتاب، حساب بانکی یا محصول، اشیایی بسازید که هم داده دارند و هم رفتار. از کلاسهایی که فقط مجموعهای از دادههای عمومی هستند دوری کنید.
-
۱۸ ساعت
مرز مسئولیت و کپسولهسازی را رعایت کنید
دادههایی را که نباید مستقیم تغییر کنند پنهان کنید و عملیات معتبر تغییر آنها را در اختیار شیء بگذارید. اعتبارسنجی موجودی، تغییر وضعیت سفارش و جلوگیری از مقدار نامعتبر را در متدهای مرتبط پیادهسازی کنید. هر کلاس باید یک دلیل اصلی برای تغییر داشته باشد.
-
۱۸ ساعت
رابطه میان اشیا را با ترکیب طراحی کنید
رابطههای «دارد» و «استفاده میکند» را با ترکیب اشیا مدل کنید. مانند سفارش دارای اقلام یا گزارشساز دارای منبع داده. وابستگیها را صریح نگه دارید و بررسی کنید آیا هر کلاس بدون شناخت جزئیات داخلی همکارش میتواند کار کند.
-
۱۸ ساعت
چندریختی و وراثت را با احتیاط به کار ببرید
رابط و پیادهسازیهای متفاوت را برای یک قرارداد مشترک بسازید؛ مانند روشهای ارسال یا محاسبه تخفیف. وراثت را فقط برای رابطه واقعی «یک نوع از» به کار ببرید. در بیشتر موارد، ترکیب اشیا انعطافپذیرتر از ساختن درخت وراثت عمیق است.
-
۱۶ ساعت
یک مدل قابلتست را بازطراحی و مستند کنید
یک برنامه قبلی را بازآرایی کنید:
کلاسهای بزرگ را خرد کنید.
وابستگیهای مستقیم به فایل یا شبکه را جدا سازید.
برای قوانین اصلی تست بنویسید.
سپس در README کوتاه پروژه، مسئولیت کلاسهای اصلی و دلیل انتخاب ترکیب یا چندریختی را توضیح دهید.
زمان تقریبی یادگیری
برآورد مجموع زمان آموزش، مطالعه و تمرین تا رسیدن به سطح کاربردی؛ بسته به پیشزمینه شما میتواند کمتر یا بیشتر باشد.
پروژههای تمرینی
موارد زیر تصویری کلی از این بخش برای این مهارت ارائه میکنند.
-
سامانه مدیریت کتابخانه کوچک
توضیح پروژه: کلاسهای کتاب، عضو، امانت و فهرست را طراحی کنید. امانت دادن کتاب باید وضعیت موجودی و محدودیت تعداد امانت عضو را از طریق متدهای معتبر کنترل کند.
-
موتور محاسبه هزینه سفارش
توضیح پروژه: برای سفارش، قلم سفارش، تخفیف و روش ارسال مدل بسازید. دستکم دو قانون تخفیف و دو روش ارسال را بدون تغییر دادن منطق اصلی سفارش اضافه کنید.
-
سامانه رزرو جلسه
توضیح پروژه: اتاق، بازه زمانی، رزرو و کاربر را مدل کنید. از ایجاد رزرو همپوشان جلوگیری کنید و منطق اعتبارسنجی را در جای مناسب نگه دارید.
-
بازطراحی یک اسکریپت رویهای
توضیح پروژه: یک اسکریپت چندتابعی قبلی را انتخاب کنید و فقط بخشهایی را که داده و رفتارشان بههم وابستهاند به کلاس تبدیل کنید. پیش و پس از بازطراحی را در README مقایسه کنید.
پرسشهای رایج درباره برنامهنویسی شیءگرا
در این بخش، به تعدادی از پرسشهای رایج درباره این مهارت پاسخ داده شده است.
آیا برنامهنویسی شیءگرا با یادگیری یک زبان خاص برابر است؟
خیر. شیءگرایی روشی برای طراحی برنامههاست و در زبانهای مختلف پیادهسازی متفاوتی دارد. ابتدا باید مبانی زبان را بدانید، سپس همان مفاهیم را با قواعد و ابزارهای آن زبان تمرین کنید.
آیا باید همیشه از وراثت استفاده کنم؟
خیر. وراثت فقط برای رابطه واقعی «یک نوع از» مناسب است. اگر هدف شما استفاده از قابلیت جزء دیگری است، ترکیب اشیا معمولا وابستگی کمتری ایجاد میکند و تغییر آن آسانتر است.
تفاوت کلاس و شیء چیست؟
کلاس طرح تعریف ویژگیها و رفتارها است. شیء نمونهای واقعی از آن کلاس است. برای مثال، «حساب بانکی» میتواند کلاس باشد و حساب مشتری با شماره و موجودی مشخص، شیء است.
برای استخدام مهندس نرمافزار، دانستن تعریف چهار اصل شیءگرایی کافی است؟
معمولاً کافی نیست. باید بتوانید با این مفاهیم یک مسئله را مدل کنید، مسئولیت کلاسها را توضیح دهید، وابستگی نامناسب را تشخیص دهید و کد قابلتغییر و قابلتست بنویسید.
چه زمانی شیءگرایی انتخاب مناسبی نیست؟
برای اسکریپتهای کوتاه، تبدیلهای ساده داده و منطقهای مستقل، ساختن چند کلاس و لایه انتزاع ممکن است سودی نداشته باشد. راهحل سادهتر را انتخاب کنید، مگر اینکه پیچیدگی مسئله واقعا به مدل اشیا نیاز داشته باشد.
چگونه تسلط خود را در برنامهنویسی شیءگرا نشان دهم؟
یک پروژه کوچک با مدل دامنه روشن منتشر کنید، برای قوانین اصلی آن تست بنویسید و در README توضیح دهید هر کلاس چه مسئولیتی دارد. توانایی توضیح تصمیمهای طراحی، از تعداد کلاسها مهمتر است.