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.
Ş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:
-
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.
-
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.
-
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. -
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.
-
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.