Kompozit desen bana ne avantajı sadece Array üzerinde getirecek?

3 Cevap php

I'm recently working on a tree structure, multiple nodes, multiple and increasable levels, and a print() method. At first, i thought it should be a Composite, i then wrote down some possible design and codes:

alt text

$struc = new Node(‘name0’, ‘id0’, ‘desc0’);
$node1 = new Node(‘node1’, ‘id1’, ‘desc1’);
$node2 = new Node(‘node2’, ‘id2’, ‘desc2’);
$node3 = new Node(‘node3’, ‘id3’, ‘desc3’);
$leaf1 = new Leaf(‘leaf1’, ‘ld1’, ‘lesc1’);
$leaf2 = new Leaf(‘leaf2’, ‘ld2’, ‘lesc2’);
$leaf3 = new Leaf(‘leaf3’, ‘ld3’, ‘lesc3’);
$leaf4 = new Leaf(‘leaf4’, ‘ld4’, ‘lesc4’);

$struc.add($node1);
$struc.add($node3);

$node1.add($leaf1);
$node1.add($leaf2);
$node1.add($node2);

$node2.add($leaf3);    
$node3.add($leaf4);

Looks good, i think and begin coding, print() method may follow Iterator pattern later. But during coding, i feel is it too complex for these simple nodes? And i have to instantiate a lot of concrete classes (more than 50+, and increasing). I then stopped and thinking a simple similar way by using array:

-- Structure Class --
//To be more readable and clear, array here could be
//divided to 3 arrays(root/nodes/leafs), then connect
//in a similar way Composite does.
$struc = array('name0', 'id0', 'desc0',

           'children'=>array(

               array('node1', 'id1', 'desc1',
                  'children' => array(
                     array('leaf1', 'ld1', 'lesc1'),
                     array('leaf2', 'ld2', 'lesc2'),
                     array('node2', 'id2', 'desc2',
                        'children'=>array(array('leaf3', 'ld3', 'lesc3'))
                     )
                  )
               ),

               array('node3', 'id3', 'desc3',
                  'children' => array(array('leaf4', 'ld4', 'lesc4'))
               )
           )
);

function print($node = $this->struct) {
    ...
    if(isset($node['children'])) $this->print($node['children']);
    ...
}

İki tasarımlar şimdi biraz kafam karıştı, çok benzer, Kompozit desen değeri ben bu modelin önemli bir şey cevapsız ediyorum, ne var?

3 Cevap

composite pattern noktası tek bir nesne (görüntüleyerek veya bir dosyaya yazma gibi) sanki nesneler topluluğu tedavisi mümkün olmaktır. Eğer kendiniz yazmak gibi "print () yöntemi daha sonra Iterator desen takip edebilir" - iyi, kompozit desen noktası Eğer tek bir bileşeni yazdırdığınız konusunda endişelenmenize gerek kalmadan print () arayın veya yinelemek zorunda olabilir olacaktır bütün Ağacı aracılığıyla.

Yerine iç içe diziler kullanarak düşünüyorsanız beri Ama, genel olarak, nesne yönelimli programlama konusunda belirsiz senmişsin gibi görünüyor. Her şey için nesneleri yerine (PHP diziler) sağlamalarının kullanarak değeri programlar çok hata ayıklama daha kolay ve bakımını yapar, type safety olduğunu.

kompozit değeri bazı karmaşıklığı ticaret olduğunu for being able to not break encapsulation.

In your array version you are breaking encapsulation since you are testing if the node is not a leaf:

if(isset($node['children'])) $this->print($node['children']);

kompozit ile size söyleyebilirim:

print();

sonra çalışma zamanı polimorfizmi doğru yöntemi çağırır. Bu durumda, (Ben bir PHP programcısı değilim bu yüzden bana bir Java benzeri sözdizimi kullanmak için izin):

class Node {

   void print() {
       for (child in children) {
          child.print();
       } 
   }

   ...
}

class Leaf {

   void print() {
       // print it! 
   }
}

düz dizi üzerinden başka bir avantajı vardır hiding your implementation details (veri yapısı, vs) olduğunu

Dizi uygulama sizin için daha karmaşık bir çok benziyorlar değil mi? Ben ona bakıyorum, ben ne yaptığını anlamak için yakın onu incelemek gerekir. Vb özel indeksler girişleri atama, indeksler ile uğraşıyoruz .. gerçekten karmaşık görünüyor.

Eğer bunu kullanarak konum koduna bakıyoruz yaparken diğer sitede kompozit desen Sizin uygulanması basit ve doğal görünüyor. Eğer bir düğüm var, ve bunu diğer düğümleri veya yapraklar takın. Kompozit desen sizin durumunuzda neden kullanışlı olduğunu karmaşık bir şey, garip, umurumda gerekmez / vs indeksleri hatırlıyorum .. budur. Tabii ki, buna alışık değilseniz uygulanması, size biraz karmaşık görünebilir, ama (aynı zamanda diğer belirtildiği gibi) önemli nokta ayrıntıları sakladığını olmasıdır. Bu very önemlidir. Basit bir örnek, hala diziler ile çalışmak olabilir, ama belki de diğer geliştiriciler kodu muhafaza / düzenlediğiniz bir üretim ortamında böyle kod uygulamak zaman. Birisi "dizi" çözümü değiştirmek için varsa, o yeni böcek tanıtacağız çok daha muhtemeldir.