2010-06-08 4 views
7

J'écris quelques petites classes d'aide pour gérer les arbres. Fondamentalement, j'ai un noeud et un noeud racine spécial qui représente l'arbre. Je veux le garder générique et simple. Cela fait partie du code:Les constructeurs protégés sont-ils considérés comme de bonnes pratiques?

<?php 

class Tree extends TreeNode{ 
    public function addById($node_id, $parent_id, $generic_content){ 
     if($parent = $this->findNodeById($parent_id)){ 
      $parent->addChildById($node_id, $generic_content); 
     } 
    } 
} 

class TreeNode{ 
    public function __construct($node_id, $parent_id, $generic_content){ 
     // ... 
    } 

    protected function addChildById($node_id, $generic_content){ 
     $this->children[] = new TreeNode($this->node_id, $node_id, $generic_content); 
    } 
} 

$Categories = new Tree; 
$Categories->addById(1, NULL, $foo); 
$Categories->addById(2, NULL, $bar); 
$Categories->addById(3, 1, $gee); 

?> 

Mes questions:

  • Est-il raisonnable de forcer TreeNode instances à créer par TreeNode::addById()?
  • Si c'est le cas, serait-il bon de déclarer TreeNode::__construct() comme étant privé/protégé?

Répondre

3

Je pense que dans certains cas, il est logique de contrôler la construction d'objets et de masquer le constructeur public.

Cela est vrai pour votre code: il est utile pour la classe Tree de contrôler comment elle est enfant TreeNode s sont créés et initialisés car ils doivent contrôler où les nœuds sont ajoutés dans la hiérarchie de l'arborescence. Avoir ce contrôle sur la construction d'un objet est particulièrement important si la relation entre les classes est telle que l'une a des informations sur l'autre.Par exemple: si vous avez légèrement modifié votre implémentation et autorisé la classe Tree à gérer les ID de nœud pour tous les nœuds de l'arborescence (vous pouvez les stocker dans un tableau de la classe Tree). Dans ce cas, il serait très convaincant d'avoir Tree contrôle comment TreeNode s sont créés et initialisés et le faire par une méthode sur votre classe Tree prend tout son sens.

1
  • Est-il raisonnable de forcer les instances TreeNode à créer par TreeNode::addById()?
  • Si c'est le cas, serait-il bon de déclarer TreeNode::__construct() comme étant privé/protégé?

Si vous voulez forcer TreeNode à créer par TreeNode::addById(), le ne voie raisonnable est de rendre privé ou protégé la TreeNode::__construct() (les deux travailleraient dans ce cas, mais private serait probablement mieux car il forcerait les sous-classes à utiliser ::addChildById). Quant à savoir s'il est judicieux de forcer TreeNode instances à créer par l'intermédiaire de TreeNode::addById(): c'est, l'alternative serait de transférer la logique de TreeNode::addById() au constructeur. Bien que possible dans ce cas, les méthodes d'usine sont généralement plus polyvalentes.

Notez, cependant, que comme il est maintenant, et depuis appeler les constructeurs mères n'est pas nécessaire en PHP, vous pouvez créer (un sous-type) TreeNode objets en créant Tree objets. Vous devriez envisager d'ajouter un constructeur privé à Tree pour éviter l'instanciation. Correction: bien qu'il soit vrai que l'appel des constructeurs parents n'est pas requis en PHP, il est également vrai qu'il y a un appel implicite au constructeur parent si aucun constructeur n'est spécifié dans la sous-classe; Pour l'instant, PHP essayera d'appeler le constructeur parent de TreeNode et échouera lors de l'instanciation directe d'un objet Tree.

Questions connexes