آموزش جامع برنامه نویسی جاوا به زبان ساده – بخش سوم: برنامهنویسی شیءگرا


زبان جاوا (در اغلب موارد) شیءگرا است. در بخشهای اول و دوم سلسله مطالب آموزش جامع برنامهنویسی جاوا با این پلتفرم، نصب و راهاندازیاش آشنا شدیم. در این بخش مقدمهای بر مفاهیم شیءگرایی با استفاده از برنامهنویسی ساختیافته به عنوان کانون توجه ارائه میشود. شی مضمونی است که در مفهوم کلاس در برنامه نویسی نمود پیدا میکند.
مفاهیم و اصول برنامهنویسی شیءگرا
شیء چیست؟
زبان شیءگرا از الگوی برنامهنویسی متفاوتی نسبت به زبان برنامهنویسی ساختیافته مانند C و کوبول استفاده میکند. پارادایم برنامهنویسی ساختیافته تا حدود زیادی داده محور است. بدین معنی که ساختارهای دادهای وجود دارند و دستورالعملهای برنامه بر روی این دادهها عمل میکنند. اما زبانهای شیءگرا دستورالعملهای داده برنامه را در شیء ترکیب میکنند.
شیء یک نهاد مستقل است که واجد خصوصیات و رفتارهایی است. این همهی تعریف شیء است و نه چیزی بیشتر. بهجای اینکه ساختار داده دارای فیلد (خصوصیات) داشته باشیم و ساختار را در همهجا وارد منطق برنامه بکنیم تا بر روی آن عمل کند (رفتار)، در زبان شیءگرا، منطق داده و برنامه با هم ترکیب شدهاند. این ترکیب میتواند در سطوح بسیار متفاوتی رخ دهد، از اشیای ریزمقیاسی مانند Number تا اشیای دانهدرشتی مانند سرویس FundsTransfer در یک برنامه بزرگ بانکداری.
اشیای والد و فرزند
شیء والد شیئی است که به عنوان پایه سازنده برای انشقاق اشیای فرزند استفاده میشود. شیء فرزند شبیه والد خود است اما تخصصیتر است. در پارادایم شیءگرایی میتوان از خصوصیات و رفتارهای رایج شیء والد مجدداً استفاده کرد، و به شیء فرزند آن خصوصیات و رفتارهای متفاوتی نسبت داد.
ارتباط و هماهنگی شیء
اشیا از طریق ارسال پیامهایی (در جاوا به این کار فراخوانی متدها میگویند.) با همدیگر صحبت میکنند. به علاوه در یک برنامه شیءگرا، کد برنامه فعالیتها را در میان اشیا هماهنگ میکند تا وظایفی که در چارچوب حوزه خاص برنامه است، اجرا شوند.
خلاصه شیء
یک شیء خوشتعریف:
- کرانهای کاملاً تعریفشدهای دارد
- مجموعه متناهی از فعالیتها را اجرا میکند
- تنها دادههای خود و هر شیء دیگر که لازم است فعالیتهای آن را انجام دهد را میشناسد
بهطور خلاصه یک شیء نهادی گسسته است که تنها وابستگیهای ضروری به دیگر اشیا برای انجام وظایفش را دارد.
اینک وقت آن است که ببینیم شیء جاوا چه شکلی دارد.
مثال: شیء شخص (Person)
نخستین نمونه بر اساس یک سناریوی رایج توسعه برنامه طراحی شده است. در این مثال یک فرد به وسیله شیء Person نمایش مییابد.
در بخش تعریف شیء مشخص شد که شیء دو جزء ابتدایی دارد: خصوصیات و رفتارها. در ادامه نحوه استفاده از این اجزا در مورد شیء Person را نشان میدهیم.
برای درک بهتر میتوان تصور کرد که خصوصیات شیء مانند اسم هستند و رفتار مانند فعل.
خصوصیات (اسمها)
یک شخص چه خصوصیات (اسم) هایی میتواند داشته باشد؟ برخی از موارد رایج چنین هستند:
- نام
- سن
- قد
- وزن
- رنگ چشم
- جنسیت
البته ممکن است موارد دیگری هم به ذهن شما برسد (و همواره میتوان خصوصیات بیشتری را هر زمان اضافه کرد) اما این فهرست برای شروع کافی به نظر میرسد.
رفتار (فعلها)
یک شخص واقعی میتواند هر کاری انجام دهد اما رفتارهای شیء معمولاً به نوعی در چارچوب برنامه تعریف میشوند. برای نمونه در چارچوب یک برنامه تجاری میتوان از شیء Person پرسید که «جرم تودهای (BMI) بدن شما چه قدر است؟». Person در پاسخ میتواند از مقادیر خصوصیات قد و وزن خود برای محاسبه BMI استفاده کند.
درون شیء Person ممکن است منطق پیچیدهتری وجود داشته باشد اما اینک فرض میکنیم که Person رفتار زیر را دارد:
- محاسبه BMI
- پرینت همه خصوصیات
حالت (State) و رشته (String)
حالت مفهوم مهمی در برنامهنویسی شیءگرا محسوب میشود. حالت یک شیء در هر لحظه به وسیله مقدار خصوصیات آن مشخص میشود.
در مورد شیء Person حالت این شیء به وسیلهی خصوصیاتی مانند نام، سن، قد، و وزن تعریف میشود. اگر بخواهید فهرستی از این خصوصیات را ارائه کنید باید این کار را با استفاده از کلاس String انجام دهید که در ادامه در مورد آن بیشتر توضیح میدهیم.
با استفاده همزمان از مفاهیم حالت و رشته میتوان به Person گفت که «با ارائه فهرستی (String) از خصوصیات در مورد خودت توضیح بده.»
مفاهیم شیءگرایی
اگر قبلاً با برنامهنویسی ساختیافته آشنا شده باشید ممکن است هنوز ارزش واقعی برنامهنویسی شیءگرا را درک نکرده باشید. درنهایت خصوصیات یک شخص و هر روشی برای دریافت این خصوصیات (و تبدیل آن مقادیر) را میتوان در زبانهای سی و کوبول نیز نوشت. مزیتهای پارادایم شیءگرایی در صورتی مشخصتر میشود که اصول تعریفکننده آن را درک کنید: کپسولهسازی، وراثت، و چندریختی.
کپسولهسازی
به خاطر داشته باشید که سوای همه چیز، شیء یک نهاد گسسته یا مستقل است. این خصوصیت مفهوم عملی کپسولهسازی است. اختفا اصطلاح دیگری است که برخی اوقات برای بیان ماهیت خودبسنده و حفاظتشده اشیا استفاده میشود.
صرفنظر از انتخاب واژگان آنچه اهمیت دارد این است که شیء مرزی بین حالت و رفتار خود و دنیای بیرون حفظ میکند. اشیایی که در برنامهنویسی رایانه استفاده میشوند، مانند شیءهای دنیای واقعی انواع مختلفی از روابط را با دستههای مختلفی از اشیا در برنامههایی که از آنها استفاده میکنند برقرار میکنند.
در پلتفرم جاوا میتوانید از سطح دسترسی (که در مورد آن در ادامه توضیح خواهیم داد) استفاده کنید تا ماهیت ارتباط اشیا را از عمومی به خصوصی تغییر دهید. دسترسی عمومی کاملاً باز است درحالیکه دسترسی خصوصی به این معنی است که خصوصیات شیء تنها درون خود شیء قابلدسترسی هستند.
مرزهای عمومی/خصوصی مفهوم شیءگرایی کپسولهسازی را اجرا میکنند. در پلتفرم جاوا میتوانید استحکام مرزها را بهصورت شیء به شیء تغییر دهید. کپسولهسازی خصوصیت قدرتمندی در زبان جاوا محسوب میشود.
وراثت
در برنامهنویسی ساختیافته میتوان ساختار را کپی کرد، برای آن نام تعیین کرد و خصوصیاتی را به آن اضافه کرد یا تغییر داد تا نهاد جدیدی ایجاد کرد که از منبع اصلی متفاوت باشد. در طی زمان این رویکرد مقدار زیادی کد تکراری ایجاد میکند که میتواند مشکلاتی در نگهداری کد ایجاد کند.
برنامهنویسی شیءگرا مفهوم وراثت را معرفی کرده است که از طریق آن کلاسهای تخصصی را بدون کد اضافی و از طریق کپی کردن خصوصیات و رفتارهای کلاسهایی که آن را تخصصی میسازند ایجاد کرد. برخی از این خصوصیات و رفتارها که لازم است تغییر داده شوند را میتوان override کرد. تنها منبع کدی که باید تغییر داد کد موردنیاز برای ایجاد کلاسهای تخصصی است. شیء منبع، والد خوانده میشود و کلاس تخصصی جدید، فرزند. این اصطلاحات قبلاً معرفی شدهاند.
فرض کنیم که یک برنامه مدیریت منابع انسانی مینویسید و میخواهید از کلاس Person به عنوان پایه (سوپرکلاس نیز نامیده میشود) برای کلاس جدیدی به نام Employee (کارمند) استفاده کنید. Employee که فرزند Person است میتواند همه خصوصیات کلاس Person را داشته باشد و علاوه بر آن خصوصیات دیگری نیز داشته باشد مثلاً:
- شماره شناسایی مالیاتی
- شماره کارمند
- حقوق
وراثت امکان ایجاد کلاس Employee جدید بدون نیاز به کپی کردن همه کد Person را میدهد.
چندریختی
درک مفهوم چندریختی نسبت به کپسولهسازی و وراثت دشوارتر است. بهطور خلاصه چندریختی به معنی این است که اشیایی که به شاخهی یکسانی از سلسلهمراتب تعلق دارند، وقتی پیام یکسانی را ارسال میکنند (یعنی وقتی از آنها خواسته شد کار یکسانی انجام دهند) میتوانند این رفتار را به طرز متفاوتی نمایش دهند.
برای درک نحوه استفاده از چندریختی در چارچوب برنامههای تجاری به مثال Prison باز میگردیم. به خاطر دارید که به Person گفتیم که خصوصیاتش را در یک رشته تنظیم کند؟ چندریختی این امکان را ایجاد میکند که Person خصوصیات خود را به روشهای مختلفی بسته به نوع Personی که هست بیان کند.
چندریختی یکی از پیچیدهترین مفاهیمی است که در برنامهنویسی شیءگرا بر روی پلتفرم جاوا با آن مواجه میشویم. توضیح کامل این مفهوم خارج از حوصله این آموزش است. در بخشهای بعدی کپسولهسازی و وراثت را بیشتر توضیح میدهیم.
جاوا زبان کاملاً شیءگرایی نیست
دو کیفیت هستند که جاوا را از زبانهای کاملاً شیءگرا مانند Smalltalk متمایز میکنند. نخست اینکه زبان جاوا ترکیبی از اشیا و انواع ابتدایی (Premitive) است. دوم اینکه در جاوا میتوان کدهایی نوشت که کارکردهای داخلی یک شیء را در معرض شیءهای دیگری که از آن استفاده میکنند، قرار دهد.
در بخش چهارم از این سلسله آموزش های برنامهنویسی جاوا، به آشنایی با خود زبان برنامهنویسی جاوا خواهیم پرداخت.