OOP_C[0] = “Aggregation Nedir ?”

Daha önce “Composition nedir ?” sorusuna yanıt vermeye çalıştığım bir yazı yayınlamıştım. Bugün ise Aggregation nedir sorusuna yanıt vermeye çalışıp bir örnek ile pekiştirmeye çalışacağım.

İki nesne arasında kurulan ilişkilerden birisi olan Aggregation’ın, Compositiondan en önemli farkı, iki nesneninde yaşam süresinin birbirinden bağımsız bir şekildede devam edebilmesi ve konteynerları oluşturan bileşenlerin birden fazla konteynerda bulunabilmesi. Öne çıkarılan görselde bulunan resmi aldığım “Dive Into Design Patterns” kitabında bulunan açıklamayı da ekliyorum.

Aggregation is a less strict variant of composition, where one
object merely contains a reference to another. The container
doesn’t control the life cycle of the component. The component
can exist without the container and can be linked to
several containers at the same time.

Görseli biraz sesli düşünelim. Bir üniversite bölümünde zaman zaman çeşitli profesörler göreve gelirler ve giderler. Gittiklerinde bölüm eğitim vermeye ve giden hoca da başka bir üniversitenin ilgili bölümünde eğitim vermeye devam eder. Konteyner yani bölüm hocanın yaşam döngüsünü sonlandırmaz. Şimdi gelin bu ilişkiyi koda dökmeye çalışalım.

#ifndef UNIVERSITY_H
#define UNIVERSITY_H

#include "department.h"

struct uni_t;

struct uni_t* new_uni(void);

void uni_const (struct uni_t* uni_self, const char* name, struct prof_t* prof_self);

void uni_dest (void);

void rm_prof (struct uni_t* uni_self, struct prof_t* prof_self);

void print_prof (struct uni_t* uni_self);

#endif
#include "department.h"
#include "stdlib.h"
#include "stdio.h"

static int prof_idx = 0;

typedef struct 
{
    struct prof_t* prof[5];
    char name[20];
       
}uni_t;

uni_t* new_uni (void)
{
    return (uni_t*)malloc(sizeof(uni_t));
}

void uni_const (uni_t* uni_self, const char* name, struct prof_t* prof_self)
{
    if (prof_idx >= 5)
    {
        printf("\r\n Enough ! ");
        exit(1);
    }

    snprintf(uni_self -> name, sizeof(uni_self -> name), "%s", name);

    uni_self -> prof[prof_idx++] = prof_self;
}

void rm_prof (uni_t* uni_self, struct prof_t* prof_self)
{
    int i = 0;

    for (i = 0; i < prof_idx; ++i)
    {
        if (uni_self -> prof[i] == prof_self)
        {
            uni_self -> prof[i] = NULL;
           
            break;
        }
    } 

    for (int re_idx = i;  re_idx < prof_idx - 1; ++re_idx)
    {   
        uni_self -> prof[re_idx] = uni_self -> prof[re_idx + 1];

        uni_self -> prof[re_idx + 1] = NULL; 

    }

    prof_idx = prof_idx - 1;
}

void uni_dest (void)
{
    prof_idx = 0;
}

void print_prof (uni_t* uni_self)
{
    for (int idx = 0; idx < prof_idx; ++idx)
    {
       printf ("\r\n Prof Name : %s",  get_prof_name(uni_self -> prof[idx]));
    }
}
#ifndef DEPARTMENT_H
#define DEPARTMENT_H

struct prof_t;

struct prof_t* new_prof (void);

void prof_cons (struct prof_t* self, const char* name);

void prof_dest (struct prof_t* self);

char* get_prof_name (struct prof_t* self);

#endif
#include "stdlib.h"
#include "string.h"
#include "stdio.h"

typedef struct 
{
    char name[10];

}prof_t;

prof_t* new_prof(void)
{
    return (prof_t*)malloc(sizeof(prof_t));
}

void prof_cons (prof_t* self, const char* name)
{
    snprintf (self -> name, sizeof(self -> name), "%s", name);
}

void prof_dest (prof_t* self)
{
    
}

char* get_prof_name (prof_t* self)
{
    return self -> name;
}

#include "stdio.h"
#include "stdlib.h"
#include "department.h"
#include "university.h"

int main(int argc, char* argv)
{
    struct uni_t* uni = new_uni();

    struct prof_t* prof_ahmet = new_prof(); // Ahmet hoca Prof oldu.

    struct prof_t* prof_mehmet = new_prof(); // Mehmet hoca Prof oldu.

    struct prof_t* prof_veli = new_prof(); // Veli hoca Prof oldu.

    prof_cons(prof_ahmet, "Ahmet"); 
    
    prof_cons(prof_mehmet, "Mehmet"); 

    prof_cons(prof_veli, "Veli"); 

    uni_const(uni, "Fizik", prof_ahmet); // Aggreagation Başladı Ahmet Hoca ile

    uni_const(uni, "Fizik", prof_mehmet); // Aggreagation Başladı Mehmet Hoca ile

    print_prof(uni);

    rm_prof(uni, prof_ahmet); // Ahmet hoca, yurtdşında iş buldu.

    printf("\r\n > After remove");

    print_prof(uni);

    uni_const(uni, "Fizik", prof_veli); // Aggreagation Başladı Veli Hoca ile

    printf("\r\n > After Prof.Dr Veli");

    print_prof(uni);
    
    uni_dest();
    
    free(uni);
    free(prof_ahmet);
    free(prof_mehmet);
    free(prof_veli);

    printf("\r\n > End of the agg");
     
}

Çıktı :

Prof Name : Ahmet
Prof Name : Mehmet
After remove
Prof Name : Mehmet
After Prof.Dr Veli
Prof Name : Mehmet
Prof Name : Veli
End of the agg

Umarım faydalı bir yazı olmuştur. Eksik ya da hatalı gördüğünüz kısımları lütfen benimle paylaşın. Herkese sağlıklı günler dilerim.

Bir Cevap Yazın

Please log in using one of these methods to post your comment:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s