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

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

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

مفهوم شیء گرایی (OOP)

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

برنامه نویسی شیء گرا (Object Oriented Programming) سعی می کند این مشکل را با ایجاد شبکه هایی از اشیاء (Objects) که هر یک مانند یک "ماشین" نرم افزاری کوچک هستند، کاهش دهد. این اشیاء به طور طبیعی موجودیت های کوچکتری هستند که کار توسعه هر واحد را ساده می کنند. با این حال، هنگامی که اشیاء در یک سیستم با هم همکاری می کنند، به بلوک های سازنده، راه حل های بسیار پیچیده تر تبدیل می شوند.

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

برنامه نویسی شیءگرایی (OOP)

برنامه نویسی شیء گرا به معنای مدل سازی اشیاء یا مفاهیم دنیای واقعی به عنوان اشیاء در یک برنامه کاربردی است:

یک شیء مهوم یا پدیده ای است که در دنیای واقعی وجود دارد. (یک شخص)

یک شیء دارای داده است ( شخص یک نام دارد)

یک شیء اعمالی را انجام می دهد (یک شخص می تواند صحبت کند، راه برود و ...)

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

در برنامه نویسی رویه ای (Procedural programming) رویه ها یا تابع هایی ایجاد می شوند که عملیات روی داده ها را انجام می دهند، در حالی که برنامه نویسی شیءگرا درباره ایجاد اشیایی است که هم داده ها و هم متدها را شامل می شوند.

برنامه نویسی شیء گرا چندین مزیت نسبت به برنامه نویسی رویه ای دارد:

اجرای OOP سریعتر و آسانتر است.

OOP یک ساختار واضح برای برنامه ها فراهم می کند.

OOP از تکرار کد جلوگیری می کند و نگهداری، اصلاح و اشکال زدایی کد را آسان تر می کند.

OOP امکان ایجاد برنامه های کاربردی قابل استفاده مجدد را با کد کمتر و زمان توسعه کوتاه تر ایجاد می کند.

اصل "تکرار نکنید" "Don't Repeat Yourself" (DRY) در مورد کاهش تکرار کد است. شما باید کدهایی را که برای برنامه رایج هستند استخراج کنید و آن ها را در یک مکان قرار دهید و به جای تکرار از آن ها استفاده مجدد کنید.

چند مفهوم اساسی برنامه نویسی در OOP وجود دارد که در بخش های بعدی به همراه مثال های کاربردی توضیح داده خواهند شد.

1- Abstraction یا انتزاع - انتزاع واقعیت پیچیده را با مدل سازی کلاس های متناسب با مسئله ساده می کند.

2- Polymorphism یا چند شکلی - چند شکلی فرآیند استفاده از یک تابع به روش های مختلف برای ورودی داده های مختلف است.

3- Encapsulation یا کپسوله سازی - کپسوله سازی جزئیات پیاده سازی یک کلاس را از اشیاء دیگر پنهان می کند.

4- Inheritance یا وراثت - وراثت راهی برای تشکیل کلاس های جدید با استفاده از کلاس هایی است که قبلاً تعریف شده اند.

کلاس (Class)

یک کلاس در زبان برنامه نویسی C# نمونه اولیه ای است که کاربر آن را تعریف کرده و اشیا از روی آن ساخته می شوند. در جهان واقعی هر شیء شامل رنگ، شکل و قابلیت هایی است. به عنوان مثال، ماشین لوکس فراری را در نظر بگیرید. این ماشین شیء ای از نوع ماشین لوکس می باشد. ماشین لوکس کلاسی است که شامل تعدادی ویژگی است مانند سرعت، رنگ، شکل و طراحی داخلی است. بنابراین، هر شرکتی که ماشینی با این ویژگی ها بسازد، یک شیء از نوع ماشین لوکس است. به عنوان مثال، هر کدام از ماشین های BMW، Lamborghini و Cadillac شیء ای از کلاسی با نام "ماشین لوکس" هستند. اینجا "ماشین لوکس" یک کلاس است و هر ماشین فیزیکی یک شیء از کلاس ماشین لوکس است. کلاس ها و اشیاء دو مفهوم اصلی در برنامه نویسی شیء گرا هستند.

Class and Object

به طور مشابه، در برنامه نویسی مبتنی بر شیء، کلاس ساختمان داده ای است که شامل ویژگی ها، فیلد ها، events، توابع و غیره می باشد. هر کلاس انواعی از داده و عملکردی که اشیاء آن ها خواهند داشت را تعریف می کند.

یک کلاس شما را قادر خواهد کرد که انواع دلخواه خود را با گروه بندی متغیرهای انواع دیگر، توابع و event ها ایجاد کنید. در زبان C#، کلاس با استفاده کلمه کلیدی class تعریف می شود. مثال زیر نحوه تعریف کلاس در سی شارپ را نشان می دهد.

Class

شیء (Object)

در سی شارپ، شیء نمونه ای از کلاس است که می توان با استفاده از آن به اعضای داده و توابع عضو کلاس دسترسی یافت.

در واقع، کلاس یک الگو برای اشیا است، هنگامی که اشیاء ایجاد می شوند، تمام متغیرها و متدها را از کلاس به ارث می برند.

به طور کلی می توان اشیاء را با استفاده از کلمه کلیدی new به همراه نام کلاس به صورت زیر تعریف کرد.

()Users user = new Users

در این مثال، نمونه به نام user برای کلاس Users ایجاد شده است. با استفاده از شیء user می توان به تمامی انواع داده و توابع عضو کلای Users دسترسی یافت. در ادامه مثالی از ایجاد کلاس و شیء در زبان برنامه نویسی C# نشان داده شده است.

Class

هنگامی که یک متغیر مستقیماً در یک کلاس اعلام می شود، اغلب به عنوان یک فیلد یا ویژگی (field or property) نامیده می شود. اگر چه ضروری نیست، اما شروع با یک حرف اول بزرگ هنگام نامگذاری کلاس ها، تمرین خوبی است. همچنین، معمولاً نام فایل سی شارپ و کلاس مطابقت دارند، زیرا کد را سازماندهی می کند. با این حال نیازی به آن نیست.

شیء از یک کلاس ایجاد می شود. ما قبلاً کلاسی با نام Car ایجاد کرده ایم، بنابراین اکنون می توانیم از آن برای ایجاد اشیاء استفاده کنیم. برای ایجاد یک شی از Car، نام کلاس و به دنبال آن نام شی را مشخص کنید و از کلمه کلیدی new استفاده کنید. در مثال زیر یک شی به نام myObj ایجاد شده و از آن برای چاپ مقدار رنگ استفاده شده است: توجه داشته باشید که از نقطه (.) برای دسترسی به متغیرها/فیلدهای داخل یک کلاس (myObj.color) استفاده می کنیم.

Class and Object

مفاهیم اساسی در برنامه نویسی شئ گرا

آموزش شی گرایی در سی شارپ

سطح دسترسی (Access Modifiers)

سطوح دسترسی جهت شفاف سازی نحوه عملکرد کلاس، متدها، ویژگی ها و دیگر اعضاء استفاده می شوند. به عبارت دیگر، سطح دسترسی قابلیت دسترسی کلاس و اعضای آن را تعریف می کنند. تعریف کننده های سطوح دسترسی در C# شامل Public، Private، Protected و internal هستند. این کلمات، چگونگی و سطح دسترسی یک کلاس و یا اعضای آن را در برنامه مشخص می کنند. به عنوان مثال در سطح دسترسی Public یا عمومی، محدودیتی در دستیابی آن وجود ندارد و در خارج از کلاس قابل استفاده است. معمولاً متدها و خواص با این سطح دستیابی تعریف می شوند تا در خارج از کلاس قابل استفاده باشند. در سطح دسترسی Private یا خصوصی، اعضاء فقط در همان کلاس قابل استفاده و شناخته شده اند. معمولا فیلدها و ثوابت با این سطح دسترسی معرفی می شوند.

فیلد (Field)

فیلد متغیری است که در یک کلاس تعریف می شود و یک مقدار از نوع مشخص را در خود ذخیره می کند. به طور کلی، فیلدها می بایست سطح دسترسی private داشته باشند و با property استفاده می شوند.

سازنده (Constructor)

یک کلاس می تواند سازنده های با پارامتر یا بدون پارامتر داشته باشد. سازنده ها زمانی فراخوانی می شوند که یک نمونه از کلاس ایجاد شود. سازنده ها با استفاده از سطوح دسترسی و نام کلاس تعریف می شوند:

{}()<access modifiers> <class name>

سازنده - Constructor

سازنده پیش فرض (Default Constructor)

در زبان سی شارپ، اگر سازنده ای بدون هیچ پارامتری ایجاد کنیم، آن را سازنده پیش فرض می نامیم. هر نمونه از کلاس بدون هیچ مقدار پارامتر مقداردهی اولیه می شود. در ادامه مثالی از تعریف سازنده پیش فرض در زبان برنامه نویسی c# آورده شده است.

Default Constructor

اگر به مثال بالا توجه کنید، یک کلاس به نام "User" و متد سازنده "User()" را بدون داشتن هیچ پارامتری ایجاد کردیم. وقتی یک نمونه از کلاس خود (User) ایجاد می کنیم، متد سازنده به طور خودکار فراخوانی می شود. وقتی برنامه c# فوق را اجرا می کنید، نتیجه زیر را دریافت خواهید کرد.

Result

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

سازنده با پارامتر (Parameterized Constructor)

در سی شارپ، اگر سازنده ای با حداقل یک پارامتر ایجاد کنیم، آن را سازنده پارامتری می نامیم. هر نمونه از کلاس با مقادیر پارامتر مقداردهی اولیه می شود. در زیر مثالی از تعریف سازنده پارامتر در زبان برنامه نویسی c# آورده شده است.

Parametrized Constructor

اگر به مثال بالا توجه کنید، یک کلاس به نام "User" و متد سازنده "User(string, string)" با پارامترها ایجاد کردیم. وقتی یک نمونه از کلاس (User) با پارامترهای مورد نیاز ایجاد می کنیم، متد سازنده به طور خودکار فراخوانی می شود. وقتی برنامه c# فوق را اجرا می کنید، نتیجه زیر را دریافت خواهید کرد.

Result

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

سربارگذاری سازنده (Constructor Overloading)

در سی شارپ، می توانیم با ایجاد سازنده دیگری با نام مشابه اما با پارامترهای مختلف، سازنده را سربارگذاری کنیم. در زیر مثالی از پیاده سازی یک سازنده سربارگذاری شده در زبان برنامه نویسی c# آورده شده است.

Constructor Overloading

اگر به مثال بالا توجه کنید، یک کلاس "User" ایجاد کردیم. ما یک سازنده "User()" را با ایجاد سازنده دیگری "User(string, string)" با همان نام اما با پارامترهای مختلف بارگذاری کردیم. وقتی برنامه c# فوق را اجرا می کنید، نتیجه زیر را دریافت خواهید کرد.

Result

اگر نتیجه بالا را مشاهده کنید، زمانی که ما یک نمونه از کلاس خود را با یا بدون پارامتر بر اساس نیاز خود ایجاد کنیم، متدهای سازنده مربوطه به طور خودکار فراخوانی می شوند.

زنجیره سازی سازنده (Constructor Chaining)

در سی شارپ، Constructor Chaining رویکردی برای فراخوانی یک سازنده از سازنده دیگر است. برای دستیابی به زنجیره سازی سازنده، باید از کلمه کلیدی this بعد از تعریف سازنده استفاده کنیم. در زیر مثالی از پیاده سازی یک زنجیره سازنده در زبان برنامه نویسی سی شارپ آورده شده است.

زنجیرسازی سازنده

اگر به مثال بالا توجه کنید، سازنده های مختلفی با پارامترهای مختلف ایجاد کردیم و با استفاده از کلمه کلیدی this یک سازنده را از سازنده دیگر فراخوانی می کنیم. وقتی برنامه c# فوق را اجرا می کنید، نتیجه زیر را دریافت خواهید کرد.

Result

همانطور که در نتیجه بالا مشاهده می کنید، یک سازنده را از سازنده دیگر فراخوانی می کنیم تا به زنجیره سازی سازنده در زبان برنامه نویسی سی شارپ دست یابیم.

سازنده خصوصی (Private Constructor)

در سی شارپ، Private Constructor یک سازنده نمونه خاص است و در کلاس هایی که فقط شامل اعضای ثابت هستند مفید است. اگر یک کلاس شامل یک یا چند سازنده خصوصی و بدون سازنده عمومی باشد، کلاس های دیگر مجاز به ایجاد یک نمونه برای آن کلاس خاص به جز کلاس های تو در تو نیستند. در ادامه الگوی تعریف سازنده خصوصی در زبان برنامه نویسی c# آمده است.

Private Constructor

اگر فرمت بالا را رعایت کنید، ما یک سازنده خصوصی بدون هیچ پارامتری ایجاد کردیم تا از تولید خودکار سازنده پیش فرض جلوگیری کنیم. اگر از هیچ تعیین کننده دسترسی برای تعریف سازنده استفاده نکرده باشیم، به طور پیش فرض، آن را به عنوان خصوصی در نظر می گیرد .در زیر مثالی از ایجاد یک سازنده خصوصی در زبان برنامه نویسی c# برای جلوگیری از ایجاد نمونه ای از یک کلاس خاص توسط کلاس های دیگر آورده شده است.

Private Constructor

اگر به مثال بالا توجه کنید، یک کلاس با یک سازنده خصوصی و یک سازنده پیش فرض با پارامترها ایجاد کردیم. اگر خط نظر داده شده را از حالت کامنت بردارید (User user = new User())، به دلیل خصوصی بودن سازنده، خطایی ایجاد می کند، بنابراین به شما اجازه نمی دهد یک نمونه برای آن کلاس ایجاد کنید. در اینجا ما مستقیماً با نام کلاس به خصوصیات کلاس دسترسی داریم، زیرا این خصوصیات ثابت هستند، بنابراین به شما اجازه دسترسی به نام نمونه را نمی دهد. زمانی که برنامه c# فوق را اجرا می کنید، نتیجه مطابق شکل زیر را خواهید گرفت.

Result

متد (Method)

متدها توابعی هستند که در داخل بدنه یک کلاس تعریف می شوند. آن ها برای انجام عملیات با ویژگی های اشیاء ما استفاده می شوند. این توابع باعث ماژولار بودن برنامه ها می شوند. یک تابع با استفاده از الگوی زیر تعریف می شود.

{سطح دسترسی} {نوع بازگشتی} {نام متد} ({پارامترهای ورودی})

Method

ویژگی (Property)

یک ویژگی با استفاده از گیرنده ها (getters) و تنظیم کننده ها (setters) به صورت زیر تعریف می شود.

Property

مشخصه (property)، فیلد تعریف شده به صورت خصوصی را در خود کپسوله می کند. به این صورت که ازgetters (get{}) برای بازیابی مقدار فیلد نهفته و از setters (set{}) برای ست کردن مقدار فیلد نهفته استفاده می کند. در مثال بالا، myPropertyVar_ یک فیلد خصوصی است که مستقیماً قابل دسترسی نیست و فقط از طریق MyProperty قابل دسترسی است. بنابراین مشخصه MyProperty فیلد myPropertyVar_ را کپسوله می کند. به علاوه، میتوان منطقی خاص را در قسمت های get وset برای یک مشخصه به کار برد که در مثال زیر نمایش داده شده است.

Property

ویژگی Auto-implemented

از C# 3.0 به بعد، تعریف property آسان تر شده است مشروط بر اینکه از هیچ منطقی در get و set استفاده نشده باشد. در ادامه مثالی از auto-implemented property نشان داده شده است.

Auto-implemented

فضای نام Namespace

فضای نام (namespace) محفظه ای است برای نگهداری مجموعه ای از کلاس ها و فضاهای نمونه مرتبط. همچنین، فضای نام برای اختصاص نام های منحصر به فرد به کلاس استفاده می شود. فضای نام و کلاس ها با استفاده از dot(.) نمایش داده می شوند. در زبان C#، فضای نام با استفاده از کلمه کلیدی namespace تعریف می شود.

Namespace

در مثال بالا، نام کامل کلاس MyClass عبارت است از: CSharpTutorials.MyClass

یک namespace می تواند حاوی namespace های دیگری نیز باشد. Namespace های داخلی با استفاده از (.) قابل جداسازی هستند.

در مثال زیر، نام کامل کلاس MyClassExample عبارت است از :

CSharpTutorials.Examples.MyClassExample

Namespace
برنامه نویسی شیء گرا Object Oriented Programming شی گرایی در سی شارپ

مقالات این دسته بندی