کلاس
Classکلاس نقشه یا قالبی است که تعیین میکند یک نوع شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد. از روی یک کلاس میتوان بینهایت شیء ساخت که هر کدام دادههای خودشان را دارند اما رفتار مشترکی نشان میدهند.
کلاس نقشه است، شیء ساختمان
این تمایز، پایهٔ فهم موضوع است:
- کلاس فقط یک تعریف است و در حافظه جای چندانی نمیگیرد. مثل نقشهٔ یک آپارتمان.
- شیء نمونهٔ ساختهشده از روی آن کلاس است. مثل آپارتمان واقعی که از روی نقشه ساخته شده.
از روی یک نقشه میتوان صد آپارتمان ساخت. همه ساختار یکسانی دارند اما هر کدام ساکنان و وسایل خودشان را دارند. در برنامهنویسی هم از یک کلاس User میتوان هزاران شیء ساخت که هر کدام نام و ایمیل خودشان را دارند.
هر کلاس دو دسته عضو دارد:
- ویژگی — دادههایی که شیء نگه میدارد؛ مثل نام، سن و ایمیل.
- متد — کارهایی که شیء میتواند انجام دهد؛ در واقع توابعی که به آن کلاس تعلق دارند.
متد ویژهای که هنگام ساخت شیء تازه بهطور خودکار اجرا میشود. کارش مقداردهی اولیه به ویژگیهاست — مثل تحویلگرفتن کلید و چیدن وسایل اولیهٔ آپارتمان.
چرا کلاس مفید است؟
مزیت اصلی، کنار هم قرار دادن داده و رفتار مرتبط است.
بدون کلاس، برای مدیریت یک حساب بانکی باید متغیرهای پراکندهای برای موجودی، شمارهٔ حساب و نام صاحب حساب داشته باشید، و توابعی جدا برای واریز و برداشت که همهٔ اینها را بهعنوان ورودی بگیرند.
با کلاس، همهٔ اینها در یک واحد منسجم جمع میشوند: شیء حساب، خودش موجودیاش را میداند و خودش میتواند واریز و برداشت کند.
مزیت دوم، کپسولهسازی است: میتوانید تعیین کنید کدام بخش از دادهها از بیرون قابل دسترسی باشد. مثلاً موجودی حساب نباید مستقیماً از بیرون قابل تغییر باشد؛ فقط از طریق متدهای واریز و برداشت که قواعد را بررسی میکنند — مثل اینکه برداشت بیشتر از موجودی مجاز نیست.
این همان چیزی است که کلاس را از یک ساختار دادهٔ ساده متمایز میکند: نهتنها داده را نگه میدارد، بلکه از درستی آن محافظت میکند.
وراثت و ترکیب
وراثت یعنی یک کلاس میتواند ویژگیها و متدهای کلاس دیگری را به ارث ببرد و چیزهایی به آن اضافه کند.
مثال: کلاس Employee همهٔ ویژگیهای Person را دارد، بهعلاوهٔ حقوق و سمت. لازم نیست نام و سن را دوباره تعریف کنید.
وراثت در نگاه اول جذاب است اما بهراحتی سوءاستفاده میشود. سلسلهمراتب عمیق وراثت — کلاسی که از کلاسی که از کلاسی ارث میبرد — کد را بهشدت دشوار میکند: برای فهمیدن رفتار یک شیء باید چند فایل را دنبال کنید.
توصیهٔ رایج امروز: ترکیب را بر وراثت ترجیح دهید. یعنی بهجای اینکه بگویید «ماشین یک نوع موتور است»، بگویید «ماشین یک موتور دارد». این رویکرد انعطاف بیشتری میدهد.
آزمون ساده: اگر جملهٔ «الف یک نوع ب است» طبیعی به نظر میرسد، وراثت منطقی است. اگر «الف یک ب دارد» طبیعیتر است، ترکیب را انتخاب کنید.
اشتباههای رایج در طراحی
- کلاس خدا. کلاسی که همهکار میکند و صدها خط طول دارد. اگر نام کلاسی
ManagerیاHelperاست، معمولاً نشانهٔ همین مشکل است. - کلاس بدون رفتار. کلاسی که فقط داده نگه میدارد و هیچ متد معناداری ندارد. گاهی موجه است، اما اگر همهٔ کلاسهایتان چنیناند، احتمالاً منطق در جای اشتباهی نوشته شده.
- افشای بیش از حد. باز گذاشتن همهٔ ویژگیها برای دسترسی مستقیم، هدف کپسولهسازی را از بین میبرد.
- کلاس برای هر چیزی. اگر کاری با یک تابع ساده حل میشود، ساختن کلاس برایش پیچیدگی بیمورد است.
- نامگذاری مبهم. نام کلاس باید اسم باشد و مفهوم روشنی از دنیای مسئله را نشان دهد.
پرسشهای متداول دربارهٔ کلاس
تفاوت کلاس و شیء در یک جمله؟
کلاس تعریف است و شیء نمونهٔ ساختهشده از آن. کلاس را یک بار مینویسید؛ شیء را هر بار که لازم داشته باشید میسازید.
آیا همهٔ زبانها کلاس دارند؟
خیر. برخی زبانها اصلاً مفهوم کلاس ندارند و از رویکردهای دیگری برای سازماندهی کد استفاده میکنند — مثل برنامهنویسی تابعی. کلاس یکی از راههای ساختاردهی است، نه تنها راه ممکن.
کلاس انتزاعی چیست؟
کلاسی که نمیتوان مستقیماً از آن شیء ساخت و فقط برای ارثبری طراحی شده. کاربردش تعریف ساختار مشترکی است که کلاسهای فرزند باید آن را کامل کنند — مثل نقشهٔ ناقصی که هر سازنده باید جزئیاتش را پر کند.
اصطلاحات همخانوادهٔ مفاهیم پایه برنامهنویسی
مشاهدهٔ همه ←- برنامهنویسیبرنامهنویسی یعنی تبدیل یک راهحل به دنبالهای از دستورهای دقیق که کامپیوتر بتواند اجرا کند. نکتهای که اغلب نادیده گرفته میشود: بخش سخت برنامهنویسی نوشتن کد نیست، بلکه فهمیدن دقیق مسئله و طراحی راهحل است.
- الگوریتمالگوریتم دنبالهای متناهی از گامهای دقیق و بدون ابهام است که مسئلهای را حل میکند. الگوریتم مستقل از زبان برنامهنویسی است: یک الگوریتم واحد را میتوان در هر زبانی پیاده کرد، درست مثل دستور پختی که با هر اجاقی قابل اجراست.
- فلوچارتفلوچارت یا نمودار گردش کار، نمایش تصویری یک فرایند یا الگوریتم با شکلهای استاندارد است. هر شکل معنای مشخصی دارد و فلشها مسیر اجرا را نشان میدهند. کاربردش فراتر از برنامهنویسی است و در طراحی هر فرایندی به کار میآید.
- متغیرمتغیر نامی است که به یک مقدار در حافظه اشاره میکند. بهجای اینکه با آدرسهای عددی حافظه کار کنید، به مقدار نامی معنادار میدهید و از آن پس با همان نام به آن دسترسی دارید.
- تابعتابع بلوکی نامدار از کد است که یک کار مشخص انجام میدهد و میتوان آن را بارها فراخوانی کرد. تابع معمولاً ورودی میگیرد، پردازشی انجام میدهد و خروجی برمیگرداند — و مهمتر از همه، از تکرار کد جلوگیری میکند.
- شیگرایی OOPشیگرایی سبکی از برنامهنویسی است که در آن برنامه از مجموعهای از اشیاء ساخته میشود؛ هر شیء دادههای خودش را نگه میدارد و رفتارهای مربوط به آن دادهها را انجام میدهد. هدف اصلیاش مدیریت پیچیدگی در نرمافزارهای بزرگ است.
برای درک کاملتر، اینها را هم بخوانید
- شیگرایی OOPشیگرایی سبکی از برنامهنویسی است که در آن برنامه از مجموعهای از اشیاء ساخته میشود؛ هر شیء دادههای خودش را نگه میدارد و رفتارهای مربوط به آن دادهها را انجام میدهد. هدف اصلیاش مدیریت پیچیدگی در نرمافزارهای بزرگ است.
- تابعتابع بلوکی نامدار از کد است که یک کار مشخص انجام میدهد و میتوان آن را بارها فراخوانی کرد. تابع معمولاً ورودی میگیرد، پردازشی انجام میدهد و خروجی برمیگرداند — و مهمتر از همه، از تکرار کد جلوگیری میکند.
- متغیرمتغیر نامی است که به یک مقدار در حافظه اشاره میکند. بهجای اینکه با آدرسهای عددی حافظه کار کنید، به مقدار نامی معنادار میدهید و از آن پس با همان نام به آن دسترسی دارید.