Bileşenlerin Dansı: Composite Tasarım Kalıbı

[en] Read in English

2023-06-22

Bir zamanlar, bir ormanda bir ağaç vardı. Bu ağaç, yaprakları ve dalları olan karmaşık bir yapıydı. Her dalın üzerinde daha küçük dallar ve yapraklar bulunabilirdi. Ağaç, dallarını ve yapraklarını bir arada tutan bir bütün olarak çalışıyordu.

Bu ağaç, Composite tasarım kalıbının bir örneğidir. Ağaç (Composite), dallar (yine Composite) ve yapraklar (Leaf) olmak üzere iki tür bileşen içerir. Hem dallar hem de yapraklar, ağaç tarafından tanınan aynı arayüzü (Component) uygular. Bu sayede ağaç, dallarını ve yapraklarını aynı şekilde işleyebilir.

Composite Pattern Class Diagram

Şimdi bu masalı kod örnekleriyle anlatalım:

C#

interface IComponent
{
    void Operation();
}

class Leaf : IComponent
{
    public void Operation()
    {
        // yaprak operasyonu
    }
}

class Composite : IComponent
{
    private List<IComponent> _children = new List<IComponent>();

    public void Operation()
    {
        foreach (var child in _children)
        {
            child.Operation();
        }
    }

    public void Add(IComponent component)
    {
        _children.Add(component);
    }

    public void Remove(IComponent component)
    {
        _children.Remove(component);
    }
}

Java

interface Component {
    void operation();
}

class Leaf implements Component {
    public void operation() {
        // yaprak operasyonu
    }
}

class Composite implements Component {
    private List<Component> children = new ArrayList<>();

    public void operation() {
        for (Component child : children) {
            child.operation();
        }
    }

    public void add(Component component) {
        children.add(component);
    }

    public void remove(Component component) {
        children.remove(component);
    }
}

Go

type Component interface {
    Operation()
}

type Leaf struct{}

func (Leaf) Operation() {
    // yaprak operasyonu
}

type Composite struct {
    children []Component
}

func (c *Composite) Operation() {
    for _, child := range c.children {
        child.Operation()
    }
}

func (c *Composite) Add(component Component) {
    c.children = append(c.children, component)
}

func (c *Composite) Remove(component Component) {
    // çocukları

**Go** (devam)
```go
    for i, child := range c.children {
        if child == component {
            c.children = append(c.children[:i], c.children[i+1:]...)
            break
        }
    }
}

Rust

trait Component {
    fn operation(&self);
}

struct Leaf;

impl Component for Leaf {
    fn operation(&self) {
        // yaprak operasyonu
    }
}

struct Composite {
    children: Vec<Box<dyn Component>>,
}

impl Component for Composite {
    fn operation(&self) {
        for child in &self.children {
            child.operation();
        }
    }
}

impl Composite {
    fn add(&mut self, component: Box<dyn Component>) {
        self.children.push(component);
    }

    fn remove(&mut self, component: Box<dyn Component>) {
        // çocukları kaldır
    }
}

Bu kod örnekleri, Composite tasarım kalıbının nasıl uygulanacağını gösterir. Her bir dilde, Component (veya IComponent) adında bir arayüz veya trait tanımlanır. Bu arayüz, Leaf ve Composite sınıfları tarafından uygulanır. Composite sınıfı, çocuk bileşenlerini saklar ve onları yönetir. Bu sayede, Composite ve Leaf nesneleri aynı arayüz üzerinden işlenebilir.

Composite tasarım kalıbını kullanmanın birkaç önemli nedeni vardır:

  1. Hiyerarşik Yapıları Basitleştirir: Composite tasarım kalıbı, ağaç benzeri yapıları basitleştirir. Örneğin, bir işletim sistemindeki dosya ve klasörler veya bir şirketin departman ve alt departmanları gibi.

  2. Nesneler Arasında Şeffaflık Sağlar: Composite tasarım kalıbı, müşteri kodunun bireysel nesneleri ve nesne koleksiyonlarını aynı şekilde işlemesine olanak sağlar. Bu, kodun daha basit ve daha temiz olmasına yardımcı olur.

  3. Kodun Genişletilebilirliğini Artırır: Yeni bileşen türleri eklemek kolaydır, çünkü mevcut kodu değiştirmeye gerek yoktur. Yeni bir bileşen türü eklemek için, sadece Component arayüzünü uygulayan yeni bir sınıf oluşturmanız gerekir.

  4. Tekrar Kullanılabilirliği Artırır: Composite tasarım kalıbı, kodun tekrar kullanılabilirliğini artırır. Aynı operasyonları uygulayan farklı bileşenler arasında kodu paylaşabilirsiniz.

  5. Açık/Kapalı Prensibini Destekler: Composite tasarım kalıbı, açık/kapalı prensibini destekler. Yani, kodunuz yeni bileşen türlerine açık, ancak mevcut kodun değiştirilmesine kapalıdır.

Bu nedenlerle, Composite tasarım kalıbı, karmaşık nesne hiyerarşilerini yönetmek için mükemmel bir seçenektir. Ancak, tüm durumlar için uygun olmayabilir. Örneğin, hiyerarşinin çok derin olduğu veya çok fazla nesne içerdiği durumlarda, Composite tasarım kalıbı performans sorunlarına neden olabilir. Bu nedenle, bu kalıbı kullanmadan önce gereksinimlerinizi dikkatlice değerlendirmeniz önemlidir.



Bu gibi daha fazla gönderi...

Köprüler Kurarak Esneklik Kazanın: Bridge Tasarım Kalıbı İle Çözümlemeler ve Dört Farklı Dilde Uygulamalar

2023-06-22 | #bridge-pattern #design-patterns #structural-patterns

Bir zamanlar, iki krallık varmış. Bu krallıklar birbirlerine çok yakın olmasına rağmen, aralarında geniş ve derin bir nehir bulunuyormuş. Bu nehir, krallıkların birbirleriyle etkileşim kurmasını zorlaştırıyormuş. Bu durumu çözmek için, her iki krallık da bir köprü inşa etmeye karar vermiş. Bu köprü, iki krallık arasında iletişimi sağlayan bir arayüz olmuş. Ancak, köprünün her iki tarafında farklı yapılar ve özellikler bulunuyormuş. Bir taraf taştan, diğer taraf ise ahşaptan yapılmış. Bu durum, köprünün her iki tarafının birbirinden bağımsız olarak değiştirilebilmesini sağlamış.

Devamı 


Dekoratör Tasarım Deseni: Yazılımın Süsleyicileri

2023-06-15 | #decorator-pattern #design-patterns #structural-patterns

Bir zamanlar, bir “Component” adında bir nesne varmış. Bu nesne, belirli bir işlevi yerine getirmek için kullanılırmış. Ancak, bazen bu işlevi genişletmek veya değiştirmek gerekiyormuş. İşte bu noktada “Decorator"lar devreye giriyormuş. Decorator’lar, Component’i “süsleyen” veya genişleten nesnelerdir. Bir Decorator, bir Component’in üzerine gelir ve onun işlevini genişletir veya değiştirir. Bu, Component’in kendisini değiştirmeden, onun işlevselliğini genişletmek için kullanılır. Örneğin, bir “TextComponent” düşünün. Bu component, bir metni ekrana yazdırır. Ancak, bazen metni kalın veya italik yapmak isteyebiliriz.

Devamı 


Kodun Dilinden Masallar: Adapter Pattern ile Farklı Dünyaları Birleştirmek

2023-06-15 | #adapter-pattern #design-patterns #structural-patterns

Bir zamanlar, iki farklı dünyadan gelen iki arkadaş vardı: Elektrikli Süpürge ve Elektrik Prizi. Elektrikli Süpürge, enerjiye ihtiyaç duyuyordu ve bu enerjiyi Elektrik Prizinden almak istiyordu. Ancak bir sorun vardı. Elektrikli Süpürge’nin fişi, Elektrik Prizi’ne uymuyordu. İkisi de farklı standartlarda üretilmişti ve birbiriyle doğrudan iletişim kuramıyorlardı. Bu durumda, bir kahraman ortaya çıktı: Adaptör. Adaptör, Elektrikli Süpürge’nin fişi ile Elektrik Prizi arasında bir köprü oluşturdu. Elektrikli Süpürge’nin fişini Adaptör’ün bir tarafına takıldı ve Adaptör’ün diğer tarafı Elektrik Prizi’ne takıldı.

Devamı 