برنامه نویسی شی گرا چیست؟
برنامه نویسی شی گرا (OOP) یک الگوی برنامه نویسی اساسی است که تقریباً همه توسعه دهندگان در مقطعی از حرفه خود از آن استفاده می کنند. OOP محبوب ترین الگوی برنامه نویسی است و به عنوان روش استاندارد کدگذاری برای اکثر حرفه های برنامه نویسان استفاده می شود.
امروز ما اصول اساسی آنچه برنامه را شی گرا می کند، تجزیه می کنیم تا بتوانید از این پارادایم در پروژه ها و مصاحبه های خود استفاده کنید.
ویدیو پیشنهادی: ویدیو آموزش برنامهنویسی شی گرا(oop) در پایتون
# برنامه نویسی شی گرا چیست؟
برنامه نویسی شی گرا (OOP) یک الگوی برنامه نویسی است که بر مفهوم کلاس ها و اشیا متکی است. از این برنامه برای ساختن یک برنامه نرم افزاری در قطعات ساده و قابل استفاده مجدد از نقشه های کد (که معمولاً کلاس نامیده می شود) استفاده می شود که برای ایجاد نمونه های جداگانه اشیاء استفاده می شود. بسیاری از زبان های برنامه نویسی شی گرا از جمله ++JavaScript ، C ، جاوا و پایتون وجود دارد.
کلاس یک طرح انتزاعی است که برای ایجاد اشیاء خاص تر و ملموس تر استفاده می شود. کلاسها اغلب دسته های وسیعی را نشان می دهند ، مانند ماشین یا سگ که ویژگی ها را به اشتراک می گذارند. این کلاس ها مشخص می کنند که یک نمونه از این نوع چه ویژگی هایی خواهد داشت مانند رنگ، اما مقدار آن ویژگی ها برای یک شیء خاص را مشخص نمی کند.
کلاسها همچنین می توانند شامل توابع باشند، که متد نامیده می شوند که فقط برای اشیاء از آن نوع در دسترس هستند. این توابع در کلاس تعریف می شوند و برخی اقدامات مفید برای آن نوع خاص از شی را انجام می دهند.
به عنوان مثال، کلاس Car ما ممکن است یک متد repaint داشته باشد که ویژگی رنگ خودرو ما را تغییر دهد. این تابع فقط برای اشیاء از نوع Car مفید است، بنابراین ما آن را در کلاس Car مشخص می کنیم در نتیجه از آن به عنوان یک متد استفاده می کنیم.
الگوهای کلاس(Class templates) به عنوان یک نقشه برای ایجاد اشیاء جداگانه استفاده می شود. اینها نمونه های خاصی از کلاس انتزاعی، مانند myCar یا GoldenRetriever را نشان می دهند. هر شیء می تواند دارای مقادیر منحصر به فردی برای خصوصیات تعریف شده در کلاس باشد.
به عنوان مثال، فرض کنید ما یک کلاس Car ایجاد کردیم که شامل تمام ویژگی هایی که یک ماشین باید داشته باشد، رنگ ، مارک و مدل آن باشد. سپس یک نمونه از یک شیء نوع Car، مثل myCar ایجاد می کنیم تا نشان دهنده ماشین خاص من باشد.
سپس می توانیم مقدار ویژگی های تعریف شده در کلاس را برای توصیف myCar تعیین کنیم، بدون این که بر سایر اشیاء یا الگوی کلاس تأثیر بگذاریم.
سپس می توانیم از این کلاس برای نشان دادن هر تعداد ماشین استفاده مجدد کنیم.
# مزایای برنامه نویسی شی گرا
- OOP چیزهای پیچیده را به عنوان ساختارهای ساده و قابل تکرار مدل می کند.
- اشیاء OOP را می توان مجدداً در برنامه ها استفاده کرد.
- اجازه می دهد تا رفتارهای خاص کلاس از طریق چندریختی(polymorphism) انجام شود.
- اشکال زدایی راحت تر، کلاسها اغلب شامل تمام اطلاعات قابل اجرا برای آنها است.
- امن، اطلاعات را از طریق کپسوله سازی محافظت می کند.
مقاله پیشنهادی: پایتون چیست؟ همه چیز درمورد python
# نحوه ایجاد برنامههای شی گرا
بیایید یک مشکل دنیای واقعی را در نظر بگیریم و به طور مفهومی یک برنامه نرم افزاری OOP طراحی کنیم.
تصور کنید که یک اردوگاه سگ دارید با صدها حیوان خانگی و باید اسامی، سن و روزهای حضور هر حیوان خانگی را پیگیری کنید. چگونه می توانید نرم افزاری ساده و قابل استفاده مجدد برای مدل سازی سگ ها طراحی کنید؟
با صدها سگ، نوشتن کد منحصر به فرد برای هر سگ ناکارآمد خواهد بود. در زیر می بینیم که ممکن است با شی rufus و fluffy چگونه به نظر برسد.
rufus = {
'name':'Rufus',
'birthday': "2/1/2017",
'age': '12',
'attendance': 0,
}
fluffy = {
'name':'Fluffy',
'birthday': "1/12/2019",
'age': '3',
'attendance': 0,
}
همانطور که در بالا مشاهده می کنید ، تعداد زیادی کد تکراری بین هر دو شی وجود دارد. از آنجا که ما اطلاعات یکسانی را برای هر سگ می خواهیم، می توانیم به جای آن از اشیاء و کلاس ها استفاده کنیم.
گروه بندی اطلاعات مرتبط با یکدیگر برای تشکیل ساختار کلاس، کد را کوتاه تر و آسان تر برای نگهداری می کند.
در مثال اردوگاه سگ، در اینجا نحوه برنامه نویسی می تواند در مورد سازماندهی OOP فکر کند:
1. ایجاد کلاس والد برای همه سگها به عنوان نقشه ای از اطلاعات و رفتارها (متدها) که همه سگها صرف نظر از نوع آن، خواهند داشت.
2. ایجاد کلاسهای فرزند تا زیر مجموعه های مختلف سگ را تحت طرح کلی والد نشان دهند.
3. اضافه کردن ویژگی ها و رفتارهای منحصر به فرد را به کلاس های فرزند تا تفاوت ها را نشان دهد.
4. ایجاد اشیائی از کلاس کودک که سگ های درون آن زیر گروه را نشان می دهند.
نمودار زیر نحوه طراحی یک برنامه OOP را نشان می دهد: گروه بندی داده ها و رفتارهای مرتبط با یکدیگر برای ایجاد یک الگوی ساده و سپس ایجاد زیر گروه برای داده ها و رفتارهای تخصصی.
کلاس Dog یک الگوی عمومی است که فقط شامل ساختار داده ها و رفتارهای مشترک همه سگ ها است.
سپس دو کلاس فرزند از Dog به نامهای HerdingDog و TrackingDog ایجاد می کنیم. اینها رفتارهای موروثی سگ (bark()) دارند، اما همچنین رفتارهای منحصر به فردی برای سگهای آن زیرگونه دارند.
در نهایت ، ما اشیایی از نوع HerdingDog برای نشان دادن سگهای فردی Fluffy و Maisel ایجاد می کنیم.
ما همچنین می توانیم اشیایی مانند Rufus ایجاد کنیم که در طبقه وسیع سگ قرار می گیرد اما زیر HerdingDog یا TrackingDog قرار نمی گیرد.
مقاله پیشنهادی: درک traceback پایتون
# بلوکهای ساختاری شی گرا
در مرحله بعد، ما نگاه عمیق تری به هر یک از اجزای اساسی یک برنامه OOP که در بالا استفاده شده است خواهیم انداخت:
- Class
- Object
- method
- Attribute
+ کلاس
به طور خلاصه، کلاس ها اساساً انواع داده های تعریف شده توسط کاربر هستند. کلاسها جایی هستند که ما نقشه ای برای ساختار متدها و ویژگیها ایجاد می کنیم. اشیاء جداگانه به صورت نمونه ساخته می شوند یا از این طرح ایجاد می شوند.
کلاسها دارای فیلدهایی برای ویژگیها و متدهایی برای رفتارها هستند. در مثال کلاس سگ ما، ویژگی ها شامل نام و تاریخ تولد است، در حالی که متدها شامل bark () و updateAttendance () هستند.
در اینجا یک قطعه کد است که نحوه برنامه نویسی کلاس Dog با استفاده از زبان پابتون را نشان می دهد.
from datetime import datetime
class Dog:
_attendance = 0
def __init__(self, name, birthday):
self.name = name
self.birthday = birthday
به یاد داشته باشید کلاس یک الگو برای مدل سازی یک سگ است و یک شیء از کلاس به عنوان نمونه ای از یک چیز واقعی در دنیای واقعی ارائه می شود.
+ آبجکت
البته OOP شامل اشیاء است! اشیا نمونه هایی از کلاس هایی هستند که با داده های خاصی ایجاد شده اند، به عنوان مثال در قطعه کد زیر Rufus نمونه ای از کلاس Dog است.
rufus = Dog('Rufus', '2/1/2017')
وقتی کلاس Dog صدا زده میشود:
- یک آبجکت جدید به نام rufus ساخته میشود.
- متد سازنده مقادیر name و birthday را به عنوان آرگومان گرفته و ذخیره میکند.
مقاله پیشنهادی: آموزش برنامه نویسی فانکشنال در پایتون
+ اتریبیوت(ویژگی)
ویژگی ها اطلاعاتی هستند که ذخیره می شوند. ویژگی ها در قالب Class تعریف می شوند. هنگامی که اشیاء نمونه گیری می شوند، اشیاء جداگانه حاوی داده های ذخیره شده در قسمت Attributes هستند.
وضعیت یک شی توسط داده های موجود در فیلدهای ویژگی های شی تعریف می شود. به عنوان مثال، یک توله سگ و سگ ممکن است در اردوگاه حیوانات خانگی متفاوت رفتار کنند. روز تولد می تواند وضعیت یک شی را تعریف کند و به نرم افزار اجازه می دهد تا سگهای سنین مختلف را به گونه متفاوتی اداره کند.
+ متد
متدها نشان دهنده رفتارها هستند. متدها اقدامات را انجام می دهند؛ متدها ممکن است اطلاعات مربوط به یک شی را بازگردانند یا داده های یک شی را به روز کنند. کد متد در کلاس تعریف شده است.
هنگامی که تک تک اشیاء نمونه سازی می شوند، این اشیاء می توانند متدهای تعریف شده در کلاس را فراخوانی کنند. در قطعه کد زیر، متد bark در کلاس Dog تعریف می شود و متد bark () روی شی Rufus فراخوانی می شود.
rufus.bark()
متدها اغلب داده ها را تغییر داده، به روز می کنند یا حذف می کنند. هر چند متدها نیازی به به روز رسانی داده ها ندارند. به عنوان مثال، متد bark () هیچ داده ای را به روز نمی کند زیرا پارس کردن هیچ یک از ویژگی های کلاس Dog را تغییر نمی دهد.
متد updateAttendance () روزی را که سگ در اردوگاه حیوانات خانگی حضور داشت، اضافه می کند.
با متد است که برنامه نویسان قابلیت استفاده مجدد را ترویج می دهند و عملکردها را درون یک شیء محصور می کنند. این قابلیت استفاده مجدد هنگام اشکال زدایی یک مزیت بزرگ است. در صورت وجود خطا، فقط یک مکان برای یافتن و رفع آن به جای بسیاری وجود دارد.
# چهار اصل برنامه نویسی شی گرا
چهار ستون برنامه نویسی شی گرا عبارتند از:
- وراثت: کلاس فرزند داده ها و رفتارها را از کلاس والد به ارث می برد.
- کپسوله سازی: تنها اطلاعات خاصی قابل دسترس هستند.
- انتزاع: اطلاعات فقط از طریق متدهایی خاص قابل دسترس هستند.
- چند ریختی: یک متد به چند شکل کار میکند.
ویدیو پیشنهادی: ویدیو آموزش وراثت در پایتون
+ Inheritance
وراثت به کلاس ها اجازه می دهد تا ویژگی های سایر کلاس ها را به ارث ببرند. به عبارت دیگر، کلاس های والد ویژگی ها و رفتارها را به کلاس های فرزند گسترش می دهند. وراثت از قابلیت استفاده مجدد پشتیبانی می کند.
اگر ویژگی ها و رفتارهای اساسی در کلاس والد تعریف شود، می توان کلاس های فرزند ایجاد کرد که عملکرد کلاس والد را گسترش داده و ویژگی ها و رفتارهای اضافی را اضافه می کند.
به عنوان مثال، سگهای گله توانایی منحصر به فردی برای گله داری دارند. به عبارت دیگر، همه سگهای گله، سگ هستند، اما همه سگها، سگ گله نیستند. ما این تفاوت را با ایجاد یک کلاس فرزند HerdingDog از کلاس والد Dog نشان می دهیم و سپس رفتار ()herd را اضافه می کنیم.
مزایای وراثت این است که برنامه ها می توانند یک کلاس عمومی برای والد ایجاد کنند و سپس در صورت نیاز کلاس های کودک خاص تری ایجاد کنند. این برنامه نویسی کلی را ساده می کند، زیرا به جای بازسازی چند باره ساختار کلاس Dog، کلاس های فرزند به طور خودکار به قابلیت های درون کلاس والد خود دسترسی پیدا می کنند.
در قطعه کد زیر، کلاس فرزند HerdingDog متد bark را از کلاس والد Dog به ارث می برد، و کلاس فرزند یک متد اضافی، herd () اضافه می کند.
class HerdingDog(Dog):
def herd(self):
return 'Stay together!'
توجه داشته باشید که کلاس HerdingDog کپی متد bark () را ندارد، متد bark () را که در کلاس سگ والد تعریف شده به ارث می برد.
هنگامی که کد، متد fluffy.bark () را فرا می خواند، متد bark () زنجیره فرزند را به کلاس والد می رساند، تا مشخص کند که در کجا متد bark تعریف شده است.
fluffy = HerdingDog('Fluffy', '1/12/2019')
fluffy.bark()
ویدیو پیشنهادی: ویدیو آموزش encapsulation در پایتون
+ Encapsulation
کپسوله کردن شامل همه اطلاعات مهم داخل یک شیء است و فقط اطلاعات انتخاب شده را در معرض دید جهان خارج قرار می دهد. ویژگی ها و رفتارها با کد داخل قالب کلاس تعریف می شوند.
سپس، هنگامی که یک شی از کلاس نمونه گیری می شود، داده ها و متدها در آن شیء قرار می گیرند. Encapsulation پیاده سازی کد داخلی نرم افزار را در داخل یک کلاس پنهان می کند و داده های داخلی اشیاء داخلی را مخفی می کند.
کپسوله کردن مستلزم تعریف برخی از زمینه ها به عنوان خصوصی و برخی دیگر به عنوان عمومی است.
- رابط خصوصی/ داخلی: متدها و خصوصیات، قابل دسترس از متدهای دیگر همان کلاس.
- رابط عمومی / خارجی: متدها و ویژگیها، همچنین از خارج از کلاس قابل دسترسی است.
بیایید از یک ماشین به عنوان استعاره برای محصور کردن استفاده کنیم. اطلاعاتی که خودرو با دنیای خارج به اشتراک می گذارد، فرمان و دنده ماشین یا راهنماها، رابط های عمومی هستند. در مقابل، موتور در زیر کاپوت پنهان شده است.
کپسوله کردن امنیت را افزایش می دهد. ویژگیها و متدها را می توان روی خصوصی تنظیم کرد، بنابراین نمی توان در خارج از کلاس به آنها دسترسی داشت. برای به دست آوردن اطلاعات در مورد داده ها در یک شیء، از روش ها و ویژگی های عمومی برای دسترسی یا به روز رسانی داده ها استفاده می شود.
rufus = Dog()
rufus.get_age()
متد getAge () را در کد مثال ما در نظر بگیرید، جزئیات محاسبه در داخل کلاس Dog پنهان شده است. شی rufus از روش getAge () برای محاسبه سن rufus استفاده می کند.
محاسبه و به روز رسانی داده ها: از آنجا که متدها همچنین می توانند داده های یک شی را به روز کنند، توسعه دهنده کنترل می کند که چه مقدارهایی را می توان از طریق متدهای عمومی تغییر داد.
این به ما امکان می دهد اطلاعات مهمی را که نباید از فیشینگ تغییر کند و سناریوی محتمل دیگر توسعه دهندگان که داده های مهم را به اشتباه تغییر داده اند، مخفی کنیم.
Encapsulation امنیت را به کد اضافه می کند و همکاری با توسعه دهندگان خارجی را آسان تر می کند. وقتی در حال برنامه نویسی برای به اشتراک گذاشتن اطلاعات با یک شرکت خارجی هستید، نمی خواهید الگوها یا داده های خصوصی کلاس ها را افشا کنید زیرا شرکت شما دارای آن مالکیت معنوی است.
در عوض، توسعه دهندگان متدهای عمومی را ایجاد می کنند که به توسعه دهندگان دیگر اجازه می دهد متدها را روی یک شیء فراخوانی کنند. در حالت ایده آل، این روش های عمومی با مستندات توسعه دهندگان خارجی همراه است.
مزایای کپسوله سازی در اینجا خلاصه می شود:
- امنیت را افزایش می دهد: فقط متدها و ویژگیهای عمومی از خارج قابل دسترسی هستند.
- از خطاهای رایج محافظت می کند: فقط زمینه ها و متدهای عمومی قابل دسترس است، بنابراین توسعه دهندگان به طور تصادفی چیزی خطرناک را تغییر نمی دهند.
- IP را محافظت می کند: کد در یک کلاس پنهان است، فقط متدهای عمومی توسط توسعه دهندگان خارجی قابل دسترسی است.
- قابل پشتیبانی: اکثر کدها به روز رسانی و بهبود می یابند.
- پیچیدگی را پنهان می کند: هیچ کس نمی تواند ببیند پشت پرده شی چیست!
ویدیو پیشنهادی: ویدیو آموزش کلاس های abstract در پایتون
+ Abstraction
انتزاع به این معنی است که کاربر فقط با ویژگیها و متدهای انتخاب شده یک شی تعامل دارد. انتزاع از ابزارهای ساده و سطح بالا برای دسترسی به یک شی پیچیده استفاده می کند.
- استفاده از چیزهای ساده برای نشان دادن پیچیدگی
- پنهان کردن جزئیات پیچیده از کاربر
انتزاع از کلاسهای ساده برای نشان دادن پیچیدگی استفاده می کند. انتزاع امتداد کپسوله سازی است. به عنوان مثال، نیازی نیست که تمام جزئیات نحوه عملکرد موتور را برای رانندگی در اتومبیل بدانید.
راننده فقط از مجموعه کوچکی از ابزارها استفاده می کند: مانند پدال گاز، ترمز، فرمان، چراغ راهنما. مهندسی از دید راننده پنهان است. برای کارکردن ماشین، بسیاری از قطعات باید زیر کاپوت کار کنند، اما افشای این اطلاعات در اختیار راننده می تواند حواس پرتی خطرناکی باشد.
انتزاع همچنین نقش امنیتی مهمی را ایفا می کند. تنها با نمایش داده های منتخب، و فقط اجازه دسترسی به داده ها از طریق کلاس ها و اصلاح آنها از طریق متدها، ما از داده ها در برابر قرار گرفتن در معرض خطر محافظت می کنیم. برای ادامه مثال ماشین، هنگام رانندگی با ماشین نمی خواهید یک باک بنزین باز داشته باشید.
مزایای انتزاع در زیر خلاصه می شود:
- رابط کاربری ساده و سطح بالا
- کد پیچیده پنهان است
- امنیت
- نگهداری نرم افزار راحت تر
- به روز رسانی کد به ندرت انتزاعی را تغییر می دهد
ویدیو پیشنهادی: ویدیو آموزش polymorphism در پایتون
+ polymorphism
پلی مورفیسم به معنی طراحی اشیا برای اشتراک رفتار است. با استفاده از وراثت، اشیاء می توانند رفتارهای مشترک والدین را با رفتارهای خاص فرزند نادیده بگیرند. چند ریختی به یک متد یکسان اجازه می دهد تا رفتارهای مختلف را اجرا کند: بازنویسی متد.
- Method Overriding
چند ریختی زمان اجرا از بازنویسی متد استفاده می کند. در این روش، یک کلاس فرزند می تواند اجرای متفاوتی نسبت به کلاس والد خود ارائه دهد. در مثال سگ ما، ممکن است بخواهیم به TrackingDog یک نوع صدای دیگر اختصاص دهیم.
class TrackingDog(Dog):
def bark(self):
return 'Hello'
# نتیجه گیری
برنامه نویسی شی گرا مستلزم تفکر در مورد ساختار برنامه و برنامه ریزی در ابتدای کدگذاری است. بررسی نحوه تقسیم الزامات به کلاسهای ساده و قابل استفاده مجدد که می توانند برای طراحی نمونه اشیاء مورد استفاده قرار گیرند. به طور کلی، پیاده سازی OOP ساختارهای داده بهتر و قابلیت استفاده مجدد را امکان پذیر می کند و در دراز مدت باعث صرفه جویی در وقت می شود.