javaبرنامه نویسی

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

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

در این مقاله در مورد مفهوم برنامه نویسی شی گرا و رویه ای صحبت کرده ایم. این دو سبک از برنامه نویسی را مقایسه کرده و در ادامه در مورد مفاهیم برنامه نویسی شئ گرا به صورت بسیار ساده و همراه با مثال صحبت کرده ایم تا خوانندگان بتوانند این مفاهیم را به خوبی درک کرده و در پروژه های خود از آن ها استفاده کنند.

زبان های برنامه نویسی رویه ای

برای اینکه به خوبی متوجه اهمیت برنامه نویسی شی گرا شویم بهتر است ابتدا نقیض آن را بشناسیم. اولین زبان های برنامه نویسی به صورت رویه ای بودند.

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

در یک برنامه ای که به صورت رویه ای نوشته شده باشد یکسری نام برای موقعیت های حافظه مشخص می شود به گونه ای که می توان مقادیری را در آن ها نگهداری کرد که به این مکان های حافظه متغیر گفته می شود.

در برنامه نویسی رویه ای ابتدا مکان هایی از حافظه را برای متغیرها در نظر می گیریم و سپس یکسری از رویه ها (توابع) به منظور دریافت ورودی ها فراخوانی می شوند و سپس مقادیر ذخیره شده در حافظه به عنوان خروجی برگردانده می شوند.

یک برنامه رویه ای ممکن است حاوی صد ها فراخوانی رویه ها(توابع) باشد.

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

زبان های برنامه نویسی رویه ای تا مدت ها به خوبی کار می کردند حتی در حال حاضر هم از آن ها استفاده می شود، اما مشکل آن ها این بود که برنامه نویس برای انجام کاری خارج از ترتیب به مشکل می خورد و مدیریت زبان برنامه نویسی بسیار مشکل می شد. بنابراین برای رفع این مشکل مفهوم شئ گرایی به وجود آمد.

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

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

برنامه نویسی شئ گرا یا Object-Oriented Programming(OOP) همانطور که از نام آن پیداست به زبان های اشاره دارد که از اشیاء در برنامه نویسی استفاده می کنند.

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

توجه کنید که تمام زبان های برنامه نویسی شئ گرا نیستند!

برنامه نویسی شئ گرا با هدف پیاده سازی موجودات دنیای واقعی مانند وراثت، پنهان کردن، چندریختی و… در زبان برنامه نویسی به وجود آمده است. هدف اصلی OOP این است که داده ها و کارکردهایی را که روی آن ها کار می کند را به هم پیوند دهد تا هیچ قسمت دیگری از کد به جز آن عملکرد نتواند به این داده ها دسترسی پیدا کند.

اکنون وقت آن رسیده با چند مفهوم خیلی خیلی مهم در برنامه نویسی شئ گرا آشنا شوید:

  • چندریختی (Polymorphism)
  • وراثت (Inheritance)
  • کپسوله سازی (Encapsulation)
  • انتزاع یا تجرید (Abstraction)
  • کلاس (Class)
  • آبجکت (Object)
  • متد (Method)
  • ارسال پیام (Message Passing)

چند ریختی

چندریختی
چندریختی

چند ریختی یا Polymorphism به توانایی زبان های برنامه نویسی شئ گرا برای تمایز بین موجودات هم نام اشاره دارد. این کار به کمک جاوا و با کمک امضای توابع انجام می شود. می توانید برای درک بهتر موضوع مثال زیر را با دقت بررسی کنید:

// Java program to demonstrate Polymorphism
// This class will contain
// 3 methods with same name,
// yet the program will
// compile & run successfully
public class Sum {
// Overloaded sum().
// This sum takes two int parameters
public int sum(int x, int y)
{
return (x + y);
}
// Overloaded sum().
// This sum takes three int parameters
public int sum(int x, int y, int z)
{
return (x + y + z);
}
// Overloaded sum().
// This sum takes two double parameters
public double sum(double x, double y)
{
return (x + y);
}
// Driver code
public static void main(String args[])
{
Sum s = new Sum();
System.out.println(s.sum(10, 20));

System.out.println(s.sum(10, 20, 30));

System.out.println(s.sum(10.5, 20.5));

}
}

همانطور که در مثال بالا می بینید ما سه تابع(متد) داریم که هر سه دارای یک نام sum می باشند. در هر کدام از آن ها امضای تابع متفاوت می باشد و همین باعث می شود در استفاده از این توابع در بدنه اصلی برنامه (متد main) مشکلی نداشته باشیم( به این چند ریختی می گوییم)
یک سوال از شما خواننده گرامی دارم و آن این است: خروجی قطعه کد بالا چیست؟ می توانید در بخش کامنت ها جواب خود را به ما بگویید!

چند ریختی در جاوا عمدتا به دو صورت زیر می باشد:

  1. Overloading در جاوا
  2. Overriding در جاوا

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

وراثت

وراثت
برنامه نویسی شی گرا (وراثت)

وراثت یا Inheritance ستون مهمی از برنامه نویسی شئ گرا می باشد. این مکانیسم جاوا است که در آن یک کلاس می تواند از ویژگی های کلاس دیگری ارث بری کند. در این بخش چند اصطلاح مهم وجود دارد که به بررسی آن ها می پردازیم:

  • سوپرکلاس(Superclass): به کلاسی گفته می شود که ویژگی های آن به ارث رسیده باشند که به آن کلاس پایه یا کلاس پدر نیز گفته می شود.
  • زیرکلاس(Subclass): کلاسی است که ویژگی های خود را از کلاس دیگری به ارث برده است که با نام کلاس مشتق شده نیز شناخته می شود. در یک زیر کلاس می توان علاوه بر ویژگی های کلاس پدر ویژگی هایی مخصوص خود کلاس نیز اضافه کرد.
  • قابلیت استفاده مجدد(Reusability): وراثت از مفهوم قابلیت استفاده مجدد پشتیبانی می کند. یعنی وقتی می خواهیم یک کلاس جدید با یکسری ویژگی ها را ایجاد کنیم اما قبلا کلاسی وجود داشته که شامل برخی از ویژگی هایی است که تصمیم داریم در کلاس جدید ایجاد کنیم. با استفاده از مفهوم وراثت می توانیم این ویژگی های تکراری را از کلاس قبلی استخراج کنیم.

کلمه کلیدی برای استفاده از مفهوم وراثت extends می باشد. به مثال زیر دقت کنید:

class derived-class extends base-class
{
//methods and fields
}

کپسوله سازی

کپسوله سازی
کپسوله سازی

کپسوله سازی یا Encapsulation به عنوان بسته بندی داده ها در یک واحد تعریف می شود. در واقع کپسوله سازی محافظی است که از دسترسی به داده ها در خارج از آن جلو گیری می کند.

  • از نظر فنی در کپسوله سازی متغیرها یا داده های یک کلاس از سایر کلاس ها مخفی می مانند و فقط از طریق هر کارکرد عضو کلاس می توان به آن ها دسترسی داشت.
  • کپسوله سازی با اعلام تمام متغیرهای یک کلاس به صورت خصوصی(Private) و با استفاده از متد هایی برای دسترسی داشتن به این متغیر ها و اعمال تغییرات در آن ها صورت می گیرد.

انتزاع داده ها

انتزاع داده ها یا Abstraction خاصیتی است که با استفاده از آن فقط جزئیات اساسی به کاربر نمایش داده می شود.
به عنوان مثال یک ماشین را در نظر بگیرید، در یک ماشین بیشتر از اینکه به اجزای تشکیل دهنده یک ماشین و جرئیات آن دقت کنیم این مسئله برای ما مهم است که آن یک اتومبیل می باشد.

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

کلاس

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

  • اصلاح کننده ها(Modifiers): یک کلاس می تواند خصوصی یا عمومی باشد یا اینکه دسترسی دیفالت داشته باشد.
  • نام کلاس(Class name): به وضوح هر کلاس یک نام دارد.
  • سوپرکلاس(درصورت وجود): نام کلاس پدر در صورت وجود با استفاده از کلمه extends مشخص می شود. هر کلاس می تواند فقط یک سوپر کلاس داشته باشد.
  • بدنه: بدنه هر کلاس با استفاده از دو علامت {…} احاطه شده و در بین این دو کروشه کدهای اصلی وجود دارند.

شئ

شئ یا Object یک واحد اصلی در برنامه نویسی شئ گرا می باشد و از موجودات در زندگی واقعی الهام گرفته است. در یک برنامه معمولی جاوا اشیاء زیادی ایجاد می شود که با استفاده از روش های فراخوانی در دسترس قرار می گیرند. یک شئ از موارد زیر تشکیل شده است:

  • State: با ویژگی های یک شئ نمایان می شود و خصوصیات یک جسم را منعکس می کند.
  • Behavior: رفتار یک شئ را نمایش می دهد و همچنین مشخص می کند هر شئ چه رفتاری با دیگر اشیاء دارد.
  • Identity: این ویژگی یک نام منحصر به فرد به شئ می دهد و شئ را قادر می سازد تا با بقیه اشیاء ارتباط برقرار کند.

به عنوان مثال یک سگ را در نظر بگیرید و با دقت تصویر زیر را نگاه کنید:

مثالی از یک شئ
برنامه نویسی شی گرا (مثالی از یک شئ)

متد

متد یا Method  مجموعه ای از عبارات است که وظیفه معینی را بر عهده دارند و یکسری از وظایف را انجام می دهند.
به صورت کلی هر متد از 6 بخش تشکیل شده که به بررسی آن ها می پردازیم:

سطح دسترسی: در زبان برنامه نویسی جاوا ما 4 نوع سطح دسترسی داریم که به صورت زیر می باشند:

  1. Public: متد های که پابلیک هستند در همه کلاس های برنامه شما قابل دسترسی می باشند.
  2. Protected: در پکیجی که این نوع کلاس تعریف شده و در زیر کلاس های آن(از جمله زیرکلاس های خارج از پکیج) در دسترس است.
  3. Private: فقط در کلاسی که تعریف شده در دسترس می باشد.
  4. Default: این کلاس ها به صورت پیش فرض می باشند، یعنی از هیچ اصلاح کننده ای در تعریف کردن آن ها وجود ندارد. که در همان کلاس و در پکیجی که آن کلاس تعریف شده در دسترس می باشند.

The return type: اگر در تعریف متد از Data Type(نوع داده، مثلا int, float…) استفاده شود آن متد از نوع بازگشتی است اما اگر به جای نوع داده از کلمه Void استفاده شود آن متد بازگشتی نیست.

Method name: این قسمت مربوط به نام متد است.

Parameter list: جلوی نام متدها یک پرانتز قرار می دهیم و در آن نام و نوع پارامترهای ورودی یک تابع را وارد می کنیم. حتی اگر متد یا تابع پارامتر ورودی ای نداشت باید از پرانتز خالی جلوی آن استفاده کرد.

Method body: بنده متد یا تابع به قسمتی که در بین کروشه ها قرار دارد گفته می شود. این قسمت اصلی هر متد است که دستورات و وظایف آن را مشخص می کند.

در تصویر زیر می توانید خلاصه بحث بالا در مورد قسمت های تشکیل دهنده متد را ببینید!

اجزاء تشکیل دهنده یک متد
برنامه نویسی شی گرا (اجزاء تشکیل دهنده یک متد)

ارسال پیام

اشیاء می توانند با ارسال و دریافت پیام با یکدیگر ارتباط برقرار کنند. یک پیام برای یک شئ درخواستی برای اجرای یک قطعه کد می باشد و شئ دریافت کننده پیام نتایج مورد نظر را بدست بیاورد و به متد ارسال کننده پیام بفرستد.

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

موفق باشید/

برای مطالعه بیشتر: بهترین کتابخانه های اندروید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا