تفاوت composition و aggregation - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تفاوت composition و aggregation

0 امتیاز
سلام.

ذر طراحی شی گرا کسی می تونه تفاوت این را برام توضیح بده؟
سوال شده اردیبهشت 18, 1402  بوسیله ی Lori3 (امتیاز 857)   11 39 106

1 پاسخ

+1 امتیاز
 
بهترین پاسخ
ترکیب و تجمیع دو مفهوم در برنامه نویسی شی گرا هستند که رابطه بین اشیاء را توصیف می کنند. تفاوت اصلی بین این دو در سطح مالکیت و چرخه حیات اشیاء درگیر است.
 
ترکیب یک شکل قوی از تجمع است که در آن یک طبقه مالک طبقه یا طبقات دیگری است و مسئول ایجاد و نابودی آنها است. اشیاء متعلق به کلاس به عنوان بخشی از اجرای داخلی آن در نظر گرفته می شوند و نمی توانند به طور مستقل وجود داشته باشند. به عنوان مثال ممکن است یک شی اتومبیل دارای یک شیء فرمان باشد و شیء فرمان نیز به همراه شیء اتومبیل ایجاد و از بین برود.
 
از سوی دیگر، تجمیع یک رابطه ضعیف‌تر است که در آن یک کلاس به کلاس یا کلاس‌های دیگری ارجاع دارد، اما مالک آنها نیست. اشیاء مورد اشاره کلاس می توانند به طور مستقل وجود داشته باشند و ممکن است توسط چندین کلاس به اشتراک گذاشته شوند. به عنوان مثال، یک شی دانشگاه ممکن است مجموعه ای از اشیاء دانشجویی داشته باشد، اما اشیاء دانشجویی می توانند مستقل از شی دانشگاه وجود داشته باشند.
 
در اینجا چند تفاوت کلیدی بین ترکیب و تجمیع وجود دارد:
 
1. مالکیت: در ترکیب، کلاس مالک مسئول ایجاد و از بین بردن اشیایی است که در اختیار دارد، در حالی که در تجمیع، کلاس مالک فقط به اشیایی که به آنها اشاره می کند اشاره دارد.
 
2. چرخه حیات: در ترکیب، چرخه حیات اشیاء متعلق به چرخه حیات شی مالک گره خورده است، در حالی که در تجمیع، چرخه حیات اشیایی که توسط کلاس مالک به آنها اشاره می شود می توانند مستقل باشند.
 
3. Tightness: ترکیب یک رابطه تنگاتنگ است، که در آن اشیاء متعلق به بخشی از اجرای داخلی شیء مالک در نظر گرفته می‌شوند، در حالی که تجمیع یک رابطه ضعیف‌تر است، که در آن اشیاء متعلق لزوماً بخشی از اجرای داخلی شی مالک نیستند.
 
مهم است که رابطه مناسب بین اشیا را بر اساس نیازهای خاص برنامه خود انتخاب کنید. ترکیب زمانی مفید است که به کنترل دقیق روی اشیاء متعلق به شما نیاز دارید، در حالی که تجمیع زمانی مفید است که نیاز به ارجاع به اشیایی دارید که می توانند به طور مستقل وجود داشته باشند.
 
#include <iostream>
#include <string>
#include <vector>

// Example of composition
class Engine {
public:
    Engine(int size) : m_size(size) {}

    void start() {
        std::cout << "Starting engine of size " << m_size << "..." << std::endl;
    }

private:
    int m_size;
};

class Car {
public:
    Car(const std::string& make, const std::string& model, int engineSize) :
        m_make(make), m_model(model), m_engine(engineSize) {}

    void start() {
        std::cout << "Starting car..." << std::endl;
        m_engine.start();
    }

private:
    std::string m_make;
    std::string m_model;
    Engine m_engine;
};

// Example of aggregation
class Person {
public:
    Person(const std::string& name) : m_name(name) {}

    void addFriend(Person* friendPtr) {
        m_friends.push_back(friendPtr);
    }

    void printFriends() {
        std::cout << m_name << "'s friends:" << std::endl;
        for (const auto& friendPtr : m_friends) {
            std::cout << " - " << friendPtr->m_name << std::endl;
        }
    }

private:
    std::string m_name;
    std::vector<Person*> m_friends;
};

int main() {
    // Example of composition
    Car myCar("Ford", "Mustang", 5);
    myCar.start();

    // Example of aggregation
    Person alice("Alice");
    Person bob("Bob");
    Person charlie("Charlie");

    alice.addFriend(&bob);
    alice.addFriend(&charlie);

    alice.printFriends();

    return 0;
}

 

در این مثال دو کلاس موتور و خودرو داریم. موتور نشان دهنده یک موتور با اندازه خاص و Car نشان دهنده خودرویی با مدل، مدل و یک شی موتور است. این یک نمونه از ترکیب است که در آن کلاس Car صاحب یک شی Engine است و مسئول ایجاد و تخریب آن است.
 
ما همچنین یک کلاس Person داریم که نماینده یک فرد با نام و لیست دوستان است. این نمونه ای از تجمیع است که در آن کلاس Person به اشیاء Person دیگر ارجاع دارد، اما مالک آنها نیست.
 
در main() یک نمونه از Car و یک نمونه از Person ایجاد می کنیم و نحوه استفاده از متد start() و printFriends() را به ترتیب نشان می دهیم. این مثال ساده شده است، اما مفاهیم اساسی ترکیب و تجمیع را در C++ نشان می دهد.

 

پاسخ داده شده اردیبهشت 18, 1402 بوسیله ی farshid_siyah (امتیاز 1,463)   3 11 16
انتخاب شد اردیبهشت 21, 1402 بوسیله ی Lori3
...