Composite Design Pattern Nedir ?

Veysel Mutlu
5 min readNov 19, 2023

--

Merhabalar,

Bu blog yazımda Yapısal Tasarım Desenleri (Structural Design Pattern) grubunda yer alan Composite Design Pattern hakkında bildiğim/öğrendiğim teknik bilgileri bir uygulama üzerine dökerek sizlerle paylaşmak istiyorum.

Makaleme konu olan tasarım desenine geçmeden önce hemen tasarım desenleri nedir, ne değildir bunu bir hatırlayalım.

1994 yılında, Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides adlı yazarlar “Tasarım Desenleri:Tekrar kullanılabilir Nesneye Yönelik Yazılımın Temelleri (Design Patterns: Elements of Reusable Object-Oriented Software)” adlı kitabı yazdılar ve yaygın olarak kullanılan 23 tasarım desenine kitapta yer verdiler.

Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides

Yukarıdaki 4 abimizin çıkarmış olduğu kitap ise aşağıdaki görselde yer alan kitaptır.

Tekrar kullanılabilir Nesneye Yönelik Yazılımın Temelleri (Elements of Reusable Object-Oriented Software)

TASARIM DESENLERI/KALIPLARI (DESIGN PATTERNS) NEDIR?

TASARIM KALIPLARI (DESIGN PATTERNS)

  • Yazılım geliştirmede yaygın olarak karşılaşılan zorluklar için yeniden kullanılabilir nesne yönelimli yazılımlardır.
  • Yazılım tasarımında, problemlerde karşımıza sıkça çıkan ortak sorunları çözmek için oluşturulmuş desenlerdir.
  • Yazılım sürecinde uygulanan çözümlerin esnekliği ve tekrar kullanılabilirliği ile de ilgilenmektedir.
  • Yani, biz yazılım geliştiricilerin zaman içerisinde deneme/yanılma, iyi/kötü tecrübelerinin sonucunda ortaya çıkmış yazılım geliştirme teknikleridir.

Her desen, çevremizde tekrar tekrar ortaya çıkan bir sorunu açıklar ve daha sonra bu soruna çözümün uygulanmasını, bu çözümü iki kez aynı şekilde yapmadan milyonlarca kez kullanabileceğiniz şekilde tanımlar.

— Christopher Alexander

DESIGN PATTERN NE DEĞILDIR?

Design patterns, doğrudan koda dönüştürülebilen bitmiş bir tasarım değildir. Birçok farklı durumda kullanılabilecek bir sorunun nasıl çözüleceğine ilişkin bir açıklama veya şablondur.

DESIGN PATTERN’E NEDEN İHTIYAÇ DUYARIZ?

  • Design Patterns, test edilmiş, kanıtlanmış geliştirme paradigmaları sağlayarak geliştirme sürecini hızlandırabilir.
  • Kodunuzu, daha basit tutmak gerektiğinde kodu daha anlamlı ve daha az karmaşık hale getirmeye yardımcı olurlar.
  • Büyük sorunlara neden olabilecek ince sorunları önlemeye yardımcı olur ve ayrıca kod okunabilirliğini artırır.
  • Ortak bir programlama sorununa karşı standart bir çözüm işlemi, yazılımın büyük ölçekte yeniden kullanılmasını sağlar.

ANTI PATTERN NEDIR?

Anti patternler de bir patterndir ama yazılımsal olarak bir problemi kabul edilmiş bir pattern olarak kullanmak yerine sorunları özgün bir yöntem ile çözmek demektir. Yani tasarım kalıplarının tam zıttıdır diyebiliriz.

Örnek Anti Patternler

SONUÇ OLARAK

Design Patterns projelerimizin esnekliği, okunulabilirliği ve yazabilirliğini kolaylaştırmak için projelerimizde olabildiğince kullanmayı tercih etmeliyiz.

Yapılarına göre tasarım kalıpları/desenleri 3 tür kategori altında tutulur;

1. Yaratımsal Desenler (Creational Patterns)

Bu kategoriye giren tasarım desenleri (design patternler) tamamen nesne yaratmanın farklı yollarıyla ilgilidir. Yeni objelerin yaratılması gibi.

2. Yapısal Desenler (Structural Patterns)

Oluşturulan yeni objelerin bir araya gelerek birbirleri arasında kompleks bir yapı oluşturmasıyla ilgili tasarım desenleridir.

3. Davranışsal Desenler (Behavioral Patterns)

Objelerin birbiriyle mesajlaşmasını, birbirinden haber almasını sağlayan yapılardır.

Gang Of Four(Gour) Tasarım Kalıpları

Composite tasarım deseni, nesneleri ağaç yapısına göre düzenleyerek ağaç yapısındaki alt üst ilişkisini kurmaya yarayan bir desendir.

Burada ağacın herbir yapısı ortak bir arayüzü uygular. Ortak arayüzü uygulamasının sebebi ise birbirine benzer yapılar ile çalışıyor olmak bu benzerlik bizlere esnek bir yapı sunacaktır.

Composite Tasarım Deseni UMML Diyagramı

COMPOSITE DESIGN PATTERN YAPISI

Composite Design Pattern içinde yer alan yapılar;

• Bileşen(Component)

⚬ Bileşikler için temel soyut tanımlamalardır.

⚬ Bileşik işlemi için nesnelerin arayüzünü oluşturur.

⚬ Tüm sınıfların arayüzündeki varsayılan davranışı gerçekleştirir.

⚬ Yavru bileşenlere ulaşmamızı ve onları kontrol etmemizi sağlamak için bir arayüz tanımlar.

• Yaprak (Leaf)

⚬ Bileşik işleminde yavru nesneleri temsil eder.

⚬ Tüm bileşen metodları yapraklar tarafından tamamlanır.

• Bileşik (Composite)

⚬ Yaprakları olan bileşenleri temsil eder.

⚬ Çocuklarını yönlendiren metodları gerçekler.

⚬ Genelde çocuklarını görevlendirerek bileşik metodlarını gerçekler.

Bu tasarım deseni uygulamada öncelikle Component adındaki bileşenin içeriği tanımlanır. Bu bileşenden kalıtımsal olarak türeyen Composite adında bileşik sınıfını ve Leaf adında yaprak sınıflarını yaratıp, bu sınıflar altında kullanılacak olan metodlar tanımlanır.

NE ZAMAN COMPOSITE TASARIM KALIBI KULLANMALIYIZ ?

  • Elimizde düzensiz bir nesne yapısı ve bu nesnelerin birleşimi olduğunda,
  • Client tekil nesne ve nesne grupları arasındaki farklılıkları görmeksizin işlem yapmak istediğinde… (tek fotoğrafın açılması, fotoğraflar grubunun açılması)
  • Nesneler grubundaki tüm nesnelerin bir düzen içerisinde aynı işi yapması gerektiğinde,
  • ve kullanıcının isteği doğrultusunda aynı türden veya farklı türlerden bir nesne topluluğu kullanmak zorunda ise, karmaşadan ve karışıklıktan kurtulmak için bileşik kalıp kullanabilir.

Şimdi artık gerçek dünya örneklerine geçebiliriz. C# dili üzerinden aşağıdaki çıktıyı verecek kodlarımızı composite tasarım desenini kullanarak kodlamaya başlayalım.

Oluşturacağımız uygulamanın örnek ekran çıktısı

Öncelikle visual studio üzerinden bir .net console uygulaması oluşturalım ve uygulamamıza UML diyagramında ki gibi soyut ve somut sınıflarımızı ekleyelim.

UML Diyagramındaki Component kısmına denk gelen soyut interface tanımımız
UML Diyagramındaki Composite kısmına denk gelen somut sınıf tanımımız
UML Diyagramındaki Leaf kısmına denk gelen somut sınıf tanımımız
Program çıktımız için gerekli olan kod çağrımları

ve istegimiz çıktıya uygun kodlarımızı composite tasarım desenini kullanarak kodlamış olduk. Kodların açıklaması görsellerde oldugu için ekstra bir açıklama yapmama gerek yok. Kaynak içinde şu adresi ziyaret edebilirsiniz.

Composite tasarım desenimizi C# dili ile kodladık peki client uygulamalarımızda bu tasarım desenini uygulamak istersek nasıl uygularız derseniz buyrun onuda aşağıda beraber kodlayalım. Ben uygulamamı js kütüphasesi olan react ile gerçeklemeye çalışacağım. Sizde istediginiz client kütüphaneleri veya frameworkleri ile geliştirebilirsiniz.

Yukarıdaki C# diliyle yazdıgımız kodlarımızı client taraflı dillere nasıl uyguları buyrun bakalım.

UML Diyagramındaki Component kısmına denk gelen sınıf tanımımız
UML Diyagramındaki Leaf kısmına denk gelen sınıf tanımımız
UML Diyagramındaki Composite kısmına denk gelen sınıf tanımımız

Yukarıdaki ekran görüntüsündeki kodları uygulayıp çalıştırdığınızda c# ta almış oldugumuz aynı çıktıyı görsel olarak alacaksınız.

Composite tasarım deseninin sektörde kullanım sıklığı nedir dersenizde aşağıdaki görsele bakabilirsiniz.

Composite Tasarım Kalıbı Kullanım Sıklığı

Yeni bir makalede görüşmek üzere hoşçakalın.

Referanslar

  1. Dofactory Development Team. “What are Design Patterns?”. Erişim: 19 Kasım 2023. https://www.dofactory.com/net/design-patterns
  2. Yusuf Yılmaz. “tasarim-desenleri-turkce-kaynak”. Erişim: 19 Kasım 2023. https://github.com/yusufyilmazfr/tasarim-desenleri-turkce-kaynak
  3. Fatih Çakıroğlu “Asp.Net Core ile Design Patterns”. Erişim: 19 Kasım 2023. https://www.udemy.com/course/aspnet-core-ile-design-patterns/
  4. Gencay Yıldız “C# Composite Design Pattern”. Erişim: 19 Kasım 2023. https://www.gencayyildiz.com/blog/c-composite-design-patterncomposite-tasarim-deseni/

--

--