چند نکته ساده برای کار با کلاس ها در برنامه نویسی شیء‌گرا

کلاس ‌را‌ شلوغ ‌نکنید!

همان‌طور که در کلیک دو شماره پیش گفته شد، در برنامه‌نویسی شیء‌گرا، برای هر کلاس یک‌سری صفات (Attribute) وجود دارد که نشان‌دهنده ویژگی‌های یک کلاس است.
کد خبر: ۳۱۷۵۸۵

یک مثال ساده

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

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

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

پاسخ این پرسش منفی است! برخی از رفتارها و صفات یک کلاس در محدوده همان کلاس مورد استفاده قرار می‌گیرند و دلیلی وجود ندارد که کلاس‌های دیگر به آنها دسترسی داشته ‌باشد. اینکه کدام عضو از یک کلاس در دسترس کلاس‌های دیگر قرار بگیرد را طراح و تحلیل‌گر مشخص می‌کند.

حال این مساله را که اعضای کلاس چگونه در دسترس قرار می‌گیرند را بررسی می‌کنیم. سه نوع سطح دسترسی وجود دارد که در تمام زبان‌های برنامه‌نویسی شیءگرا هستند:

Public

اگر عضوی از یک کلاس با این صفت مشخص شود توسط تمام کلاس‌های دیگر نیز در دسترس است و کلاس‌های دیگر که با این کلاس در ارتباط هستند، می‌توانند از اعضای Public کلاس دیگر استفاده کنند.

Private

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

Protected

این سطح دسترسی درست همانند Private است ولی با این تفاوت که کلاس‌هایی که از یک کلاس مشتق می‌شوند می‌توانند به اعضای Protected کلاس پدر خود دسترسی داشته ‌باشد.

موارد بالا را با یک مثال بیشتر توضیح می‌دهیم. فرض کنید که یک کلاس به‌نام Thread وجود دارد و ما کلاس دیگری طراحی کرده‌ایم که در یکی از رفتارهایش یک ایمیل را می‌فرستد. حال قصد داریم ایمیل را با استفاده از ساختن یک نخ، ارسال کنیم. در این‌حالت باید از کلاس نخ استفاده کنیم و برای عمل فرستادن ایمیل از طریق نخ، باید از کلاس Thread یک نمونه بسازیم.

عمل فرستادن ایمیل از متد عمومی Start انجام می‌شود. حال اگر بخواهیم عمل فرستادن ایمیل را متوقف کنیم، باز باید از متد عمومی Stop استفاده کنیم. حال برای اینکه یک شیء از کلاس نخ، کار خودش را آغاز کند باید با استفاده از توابع سیستم‌عامل یک نخ ساخته شده و سپس اجرا شود.

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

حال اگر بخواهیم از کلاسی که نوشتیم در سیستم‌عامل دیگری، به‌عنوان مثال در سیستم‌عامل لینوکس استفاده کنیم، باید چه‌کار کنیم؟ در کلیک دو شماره قبل گفتیم که یکی از خواص شی‌ءگرایی، نوشتن کد و استفاده مجدد آن است. بنابراین، کافی است ما از کلاس Thread کلاس دیگری به‌ ارث ببریم و نام آن‌را MultiOSThread بگذاریم.

به‌طور خودکار، کلاس فرزند تمام متدهای غیرخصوصی کلاس پدر را به‌ارث می‌برد، اما همانطور که گفتیم، متد ساختن نخ یک متد خصوصی بود،‌ بنابراین این متد قابل دسترسی برای کلاس فرزند نیست.

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

امیربهاالدین سبط‌الشیخ

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها