2009-08-22 5 views
0

donné une feuille, et son TD mère, faire une copie:Solution sur une feuille divise à deux avec des parents différents?

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

exigence d'impression:

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

Jusqu'à présent, je construit 3 solutions, mais aucun ne me satisfait, je me demande que l'on est plus OO? Et y a-t-il un 4ème choix?

-- 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; 
    } 
    ... 
} 

Répondre

1

plus OO serait de séparer la logique de rendu du modèle de données ... votre hiérarchie de modèle devrait être traversible par un contrôleur, qui aurait rendu vos données dans une hiérarchie de vue ...

aussi, « chaîne de control "devrait suivre votre hiérarchie ... ce n'est pas à la feuille de déterminer son comportement en fonction du parent, c'est au parent d'obtenir des informations à partir de la feuille, puis de le traiter en fonction de son propre état, ou de transmettre les données nécessaires à l'enfant lors de l'interrogation de toute sorte d'information ... de cette façon la feuille est découplée du nœud ... sinon vous avez une dépendance bidirectionnelle, ce qui diminue grandement la réutilisabilité ...

greetz

retour2dos

+0

description utile, je ' J'essaie de comprendre. J'ai déjà pensé à ajouter un contrôleur, et même pensé à supprimer TD de la hiérarchie. Jusqu'à présent, je suis toujours à la recherche d'un élégant, ou propre dans vos mots, façon de résoudre ce problème – Edward

+0

Très bien, votre réponse aide à faire le problème clair. Cos en utilisant le modèle Composite, chaque nœud/feuille sait déjà comment s'imprimer et traiter l'impression elle-même. Mais pour répondre à l'exigence en question, noeud/feuille ne peut plus être conservé seul, en 2ème solution, feuille doit savoir info parent; dans la 3ème solution, le parent doit savoir l'information de l'enfant; les deux introduisent une dépendance supplémentaire. Maintenant je sais pourquoi aucune solution ne me rend confortable. Ajouter un contrôleur ne semble pas d'aide, vraiment un mal de cerveau – Edward

0

Je devrais utiliser la solution 2 personnellement. Vous dites qu'avec cette solution, une feuille peut contenir un nœud, ce que vous n'aimez pas, mais y a-t-il une raison pour que le ait un pour tenir un nœud? Puisque vous utilisez différentes classes (noeuds et feuilles), vous devriez être en mesure d'ajouter un contrôle qui empêche le passage d'un nœud dans la feuille (quelque chose comme ça):

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'); 
    } 
} 

Ces deux contrôles doivent travailler, la deuxième on vérifie juste une classe spécifique tandis que la première empêche juste tous les objets. Vous pouvez également utiliser la fonction is_string(), mais cela empêchera les entrées.

+0

obtenir, 2 est mieux, non? mais pourquoi? la vérification de type n'est pas un problème parce que j'utilise un motif composite, merci pour le rappel. – Edward

+0

2 est le plus simple ... mais pas très propre, vraiment ... – back2dos

+0

j'ai élaboré la 4ème solution, base sur la solution 2, juste une petite modification, maintenant je pense que c'est la meilleure solution – Edward

Questions connexes