پرش به محتوا

کلاس (برنامه‌نویسی)

از ویکی‌پدیا، دانشنامهٔ آزاد
(تغییرمسیر از کلاس)

تعریف کلاس

[ویرایش]

در مهندسی نرم‌افزار و مهندسی دانش، کلاس نقشهٔ نوعی و مشترک برای گروهی از اشیاء[۱] است که ویژگی‌های[۲] مشترکی داشته، و رفتارهای مشترکی از خود نشان می‌دهند. درواقع، کلاس‌ها انواعی هستند که شخص برنامه‌نویس، خود می‌تواند، آن‌ها را برای حل مسئله‌های دنیای واقعی طراحی کند.

مفهوم اصلی

[ویرایش]

کلاس یک انتزاع است که به توسعه‌دهندگان کمک می‌کند تا مدل‌های دنیای واقعی را به برنامه تبدیل کنند. کلاس‌ها شامل دو عنصر اصلی هستند:

  • داده‌ها، یا صفات : خصوصیات یا متغیرهایی که ویژگی‌های یک شیء را تعریف می‌کنند.
  • عملیات، یا روش‌ها : توابعی که رفتارهای شیء را مشخص می‌کنند.

مثال در Java:

public class Car {
    String brand;
    int year;

    void drive() {
        System.out.println("Driving the car");
    }
}

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

کلاس، مفهوم بسط‌یافته از ساختمان است که به جای این که، فقط داده‌ها را نگه‌داری کند، می‌تواند هم داده‌ها و هم توابع را با هم نگه‌داری کند[۳].

کپسوله‌سازی در کلاس‌ها

[ویرایش]

برنامه‌نویسی شیءگرا، داده‌ها (خواص) و متدها (رفتارها) را در بسته‌هایی به نام کلاس محصور می‌کند.[۴] کلاس‌ها دارای خاصیت کپسوله سازی[۴] هستند. این بدان معناست که اشیاء می‌دانند که چگونه از طریق رابط‌های تعریف‌شده با یکدیگر ارتباط برقرار کنند. معمولاً، اشیاء نباید از چگونگی پیاده‌سازی اشیاء دیگر مطلع باشند، به‌عبارت دیگر، جزئیات پیاده‌سازی در داخل خود اشیاء پنهان شده‌اند.

مثال: رانندگی خودرو بدون اطلاع از خصوصیات طرز کار داخلی موتور و سیستم‌های اگزوز و جعبه‌دنده امکان‌پذیر است. در مهندسی نرم‌افزار ضرورت پنهان‌سازی اطلاعات امری بسیار مهم هست. [۵]

تفاوت برنامه‌نویسی رویه‌ای و شیءگرا

[ویرایش]

در زبان‌های رویه‌ای[۶] برنامه‌نویسی، مثل زبان سی (C)، برنامه‌نویسی، بیشتر عملگرایانه[۷] است. درحالی‌که، زبان‌های برنامه‌نویسی سی‌پلاس‌پلاس (++C)، جاوا (Java)، و سی‌شارپ (#C) دارای پارادایم شیءگرایانه هستند. واحد برنامه‌نویسی در زبان‌های رویه‌ای تابع است، ولی، زبان‌های شی گرا دارای کلاس‌ها - که اشیاء نهایتاً از آنها ایجاد می‌شوند (یا اصطلاحاً نمونه‌سازی می‌شوند) - به عنوان واحد برنامه‌نویسی هستند. توابع نیز در داخل کلاس‌ها به عنوان متدهایی پیاده‌سازی می‌شوند.

تمرکز بر توابع در زبان‌های رویه‌ای

[ویرایش]

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

اجزای کلاس

[ویرایش]

کلاس‌ها از چندین جزء اصلی تشکیل شده‌اند که در این بخش به تفصیل به هر یک می‌پردازیم:

  • صفات (Attributes):
    • متغیرهایی که ویژگی‌های یک شیء را مشخص می‌کنند. به‌عنوان مثال، یک کلاس Car ممکن است صفاتی مانند brand، color و year داشته باشد.
    • صفات می‌توانند خصوصی (private) یا عمومی (public) باشند.
  • متدها (Methods):
    • توابعی که در کلاس تعریف می‌شوند و وظایف مرتبط با شیء را انجام می‌دهند.
    • متدها می‌توانند شامل عملیات‌هایی مانند افزودن، حذف یا نمایش داده‌ها باشند.
  • سازنده‌ها (Constructors):
    • توابع خاصی که هنگام ایجاد یک شیء جدید از کلاس فراخوانی می‌شوند.
    • وظیفه سازنده، مقداردهی اولیه صفات کلاس است.
  • ویرانگرها (Destructors):
    • توابع خاصی که زمانی که شیء از بین می‌رود، فراخوانی می‌شوند.
    • این توابع در زبان‌هایی مانند C++ برای آزادسازی منابع استفاده می‌شوند.

کپسوله‌سازی (Encapsulation)

[ویرایش]

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

مزایا:

  • حفظ امنیت داده‌ها و جلوگیری از تغییرات غیرمجاز.
  • کاهش پیچیدگی کد از طریق ارائه یک رابط ساده.

مثال در Python:

class Car:
    def __init__(self, brand, year):
        self.__brand = brand  # Private attribute
        self.__year = year

    def get_brand(self):
        return self.__brand

    def set_brand(self, brand):
        self.__brand = brand

وراثت (Inheritance)

[ویرایش]

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

انواع وراثت:

  • وراثت تک‌سطحی (Single Inheritance): یک کلاس فقط از یک کلاس دیگر ارث می‌برد.
  • وراثت چندسطحی (Multi-level Inheritance): یک کلاس از کلاسی که خود از کلاس دیگری ارث برده است، ارث می‌برد.
  • وراثت چندگانه (Multiple Inheritance): یک کلاس از چندین کلاس ارث می‌برد (در برخی زبان‌ها مانند Python ممکن است).

مثال در Python (وراثت چندگانه):

class Vehicle:
    def move(self):
        print("Moving")

class Car(Vehicle):
    def drive(self):
        print("Driving")

myCar = Car()
myCar.move()  # Inherited method
myCar.drive()  # Specific method

چندریختی (Polymorphism)

[ویرایش]

چندریختی یکی از اصول اساسی برنامه‌نویسی شیءگرا است که به اشیاء اجازه می‌دهد بسته به نوع خود، رفتارهای مختلفی داشته باشند. واژه چندریختی به معنای "چند شکل داشتن" است و در برنامه‌نویسی به توانایی یک مرجع (مانند متغیر یا اشاره‌گر) برای نشان دادن رفتارهای متفاوت در شرایط مختلف اشاره دارد.

مفهوم کلی چندریختی

[ویرایش]

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

چندریختی در زمان کامپایل (Compile-Time Polymorphism):

[ویرایش]

این نوع چندریختی که چندریختی استاتیک نیز نامیده می‌شود، شامل اورلودینگ (Overloading) و استفاده از پارامترهای متفاوت برای متدها یا توابع است. در این حالت، انتخاب متد یا تابع مناسب در زمان کامپایل صورت می‌گیرد.

مثال:

در یک زبان مانند ++C، می‌توان چند نسخه از یک تابع با نام یکسان تعریف کرد که پارامترهای متفاوتی دریافت می‌کنند:

class Math {
public:
    int add(int a, int b) {
        return a + b;
    }
    double add(double a, double b) {
        return a + b;
    }
};

چندریختی در زمان اجرا (Run-Time Polymorphism):

[ویرایش]

این نوع چندریختی که به آن چندریختی پویا نیز گفته می‌شود، از طریق ارث‌بری و استفاده از توابع مجازی (Virtual Functions) یا متدهای سربار (Overridden Methods) حاصل می‌شود. در این حالت، تصمیم‌گیری درباره انتخاب متد مناسب در زمان اجرا انجام می‌گیرد.

مثال:

class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a shape" << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a circle" << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a rectangle" << std::endl;
    }
};

int main() {
    Shape* shape1 = new Circle();
    Shape* shape2 = new Rectangle();

    shape1->draw(); // خروجی: Drawing a circle
    shape2->draw(); // خروجی: Drawing a rectangle

    delete shape1;
    delete shape2;

    return 0;
}

چندریختی با ارائه انعطاف‌پذیری و توسعه‌پذیری بالا، امکان استفاده از یک رابط عمومی برای انواع مختلف اشیاء را فراهم می‌کند، اما ممکن است به دلیل پیچیدگی درک و افت عملکرد در پروژه‌های بزرگ چالش‌هایی ایجاد کند. این ویژگی در زبان‌هایی مانند Java، C++، Python و C# از طریق ارث‌بری و سربارکردن متدها پیاده‌سازی می‌شود.

زبان‌های برنامه‌نویسی شیءگرا و کلاس‌ها

[ویرایش]

زبان‌های مختلف برنامه‌نویسی شیءگرا مانند Java، C++، C#، و Python از کلاس‌ها استفاده می‌کنند.

تفاوت‌ها در نحوه تعریف و استفاده از کلاس‌ها در این زبان‌ها:

  • در C++، کنترل دستی بیشتری بر حافظه داریم.
  • در Python، تعریف کلاس ساده‌تر و انعطاف‌پذیرتر است.
  • در Java، مفاهیمی مانند کپسوله‌سازی و وراثت به‌طور کامل پیاده‌سازی شده است.

پانوشته‌ها

[ویرایش]
  1. Objects
  2. Properties
  3. دكتر بابك بشري راد (۱۳۹۴). برنامه سازي پيشرفته با ++C. تهران: ناقوس. صص. ۱۱۷. شابک ۹۷۸-۹۶۴-۳۷۷-۷۴۶-۳.
  4. ۴٫۰ ۴٫۱ Encapsulation
  5. "OOP08-CPP. Do not return references to private data". CERT C++ Secure Coding Standard. Carnegie Mellon University. 2010-05-10. Archived from the original on 2015-10-03. Retrieved 2012-05-07.Booch, G. (1993). Object-Oriented Analysis and Design with Applications. Addison-Wesley. Stroustrup, B. (2013). The C++ Programming Language. Addison-Wesley. Eckel, B. (2006). Thinking in Java. Prentice Hall. Horstmann, C. S. (2012). Big Java Late Objects. Wiley. Fowler, M. (2003). Patterns of Enterprise Application Architecture. Addison-Wesley.
  6. Procedural
  7. Action oriented

جستارهای وابسته

[ویرایش]

پیوند به بیرون

[ویرایش]

منابع

[ویرایش]