Bir yaprak üzerinde çözümü farklı anne ile ikiye böler?

2 Cevap php

Bir yaprak ve üst TD göz önüne alındığında, bir baskı yapın:

$parent = new Node('td');
$child = new Leaf('Text:', 'Value');
$parent->add($child);
$parent->print();

baskı gereksinimi:

sometimes <td>Text: Value</td>
sometimes <td>Text:</td><td>Value</td>

Şimdiye kadar ben daha OO olduğu bir merak, i 3 çözümler inşa, ama hiçbiri beni tatmin? Ve 4 seçenek var mı?

-- Solution 1 --
// Divide the leaf object to two leaf objects
$leafText = new Leaf('Text: ');
$leafvalue = new Leaf('Value');
$parent->add($leafText);
$parent->add($leafValue);
$parent->print();

-- Solution 2 --
// Change leaf print() logic, if leaf's parent is TD, output "Text: Value",
// otherwise output "<td>Text:</td><td>Value</td>"

-- Solution 3 --
// Change parent add() logic, give leaf a variable $separate to describe if it 
// should be divided
function add($child) {
    if($child->separate) {
        $this->parent->add($child->text);
        $this->children[] = $child->value;
    }
    ...
}

2 Cevap

Çoğu OO ... senin modeli hiyerarşi bir kontrolör tarafından traversible olmalıdır veri modeli mantığı render ayırmak olacaktır, bu bir görünümü hiyerarşi içine verileri işlemek istiyorum ...

Ayrıca, "kontrol zinciri" hiyerarşinizi takip etmeli ... o ebeveyn bağlı davranışını belirleyen yaprak kadar değil, yapraktan bilgi almak için üst kalmış, ve sonra kendi durumuna bağlı olarak işlemek, veya yaprak düğüm kopartılmış olan bu şekilde aksi takdirde büyük ölçüde yeniden kullanılabilirliği azalır iki yönlü bağımlılığın var ... ... bilgilerin herhangi bir tür için sorgularken çocuğa gerekli verileri geçmek ...

Ben şahsen çözüm 2 ile gitmek olurdu. Bu çözüm ile bir yaprak sevmediğiniz bir düğüm, tutabilir söylüyorlar, ama has bir düğüm tutmak edebilmek için herhangi bir neden var mı? Eğer farklı sınıflar (Düğüm ve Yaprak) kullanarak konum beri Yaprak (böyle bir şey) bir düğüm geçen engelleyen bir kontrol eklemek gerekir:

class Leaf {
  public function __construct($text, $value) {
    if (is_object($text))
      throw new Exception('error message');

    if (get_class($value) == 'Node')
      throw new Exception('error message');
  }
}

Bu çeklerin ikisi de ilk sadece tüm nesneleri önler ikinci sadece belirli bir sınıf için denetlerken, çalışması gerekir. Ayrıca is_string() işlevini kullanabilirsiniz, ancak bu İnts izin vermez.