2010-06-08 19 views
7

मैं पेड़ को संभालने के लिए कुछ छोटे सहायक वर्ग लिख रहा हूं। असल में, मेरे पास एक नोड और एक विशेष रूट नोड है जो पेड़ का प्रतिनिधित्व करता है। मैं इसे सामान्य और सरल रखना चाहता हूं।संरक्षित रचनाकारों को अच्छा अभ्यास माना जाता है?

<?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); 

?> 

मेरे सवालों का:: इस कोड का हिस्सा है

  • यह मजबूर करने के लिए TreeNode उदाहरणों TreeNode::addById() के माध्यम से बनाया जा करने के लिए समझदार है?
  • यदि ऐसा है, तो TreeNode::__construct() को निजी/संरक्षित घोषित करना अच्छा अभ्यास होगा?

उत्तर

3

मुझे लगता है कि कुछ मामलों में वस्तुओं के निर्माण को नियंत्रित करने और सार्वजनिक कन्स्ट्रक्टर को छिपाने के लिए यह समझ में आता है।

यह आपके कोड का सच है: यह उपयोगी है Tree वर्ग के लिए यह कैसे बच्चे TreeNode रों बनाया है और प्रारंभ कर रहे हैं, क्योंकि यह जहां नोड पेड़ पदानुक्रम में जुड़ जाते हैं को नियंत्रित करने की जरूरत है है नियंत्रित करने के लिए।

ऑब्जेक्ट निर्माण पर यह नियंत्रण रखना विशेष रूप से महत्वपूर्ण है यदि कक्षाओं के बीच संबंध ऐसा है कि किसी के बारे में जानकारी है।

उदाहरण के लिए: यदि आप पेड़ में सभी नोड्स के लिए नोड आईडी का प्रबंधन करने के थोड़ा अपने कार्यान्वयन बदल गया है और अनुमति दी Tree वर्ग (आप Tree वर्ग के भीतर एक सरणी में इन संग्रहीत कर सकता है)। इस मामले में Tree नियंत्रित करने के लिए यह बहुत ही आकर्षक होगा कि TreeNode एस कैसे बनाए जाते हैं और आरंभ किए जाते हैं और Tree कक्षा पर किसी विधि के माध्यम से इसे पूर्ण समझ में आता है।

1
  • यह TreeNode उदाहरणों TreeNode::addById() के माध्यम से बनाया जा करने के लिए मजबूर करने के लिए समझदार है?
  • यदि ऐसा है, तो TreeNode::__construct() को निजी/संरक्षित घोषित करना अच्छा अभ्यास होगा?

आप TreeNode मजबूर करने के लिए TreeNode::addById() के माध्यम से बनाया जा चाहते हैं, केवल समझदार पथ TreeNode::__construct() निजी या संरक्षित (दोनों इस मामले में काम करेगा बनाने के लिए है, लेकिन private शायद इसे बाद बेहतर होगा subclasses ::addChildById का उपयोग करने के लिए मजबूर करेगा)।

चाहे वह TreeNode उदाहरणों TreeNode::addById() के माध्यम से बनाया जा करने के लिए मजबूर करने के लिए समझदार है के रूप में: यह है, वैकल्पिक निर्माता को TreeNode::addById() के तर्क हस्तांतरण करने के लिए किया जाएगा। इस मामले में संभव है, कारखाने के तरीके आमतौर पर अधिक बहुमुखी हैं।

हालांकि, ध्यान दें कि यह अब है, और माता पिता के कंस्ट्रक्टर्स बुला के बाद से Tree वस्तुओं बनाने के द्वारा PHP में आवश्यक नहीं है, आप कर सकते हैं (की एक उप-प्रकार) बनाने TreeNode वस्तुओं के रूप में। तत्कालता से बचने के लिए आपको Tree पर एक निजी कन्स्ट्रक्टर जोड़ने पर विचार करना चाहिए।

सुधार: हालांकि यह सच है कि माता-पिता कंस्ट्रक्टर्स बुला PHP में की आवश्यकता नहीं है है, यह भी सच है माता पिता निर्माता अगर कोई निर्माता उपवर्ग में निर्दिष्ट किया जाता करने के लिए एक अंतर्निहित कॉल बनाया जा सकता है है, इसलिए यह अभी है, PHP TreeNode के मूल निर्माता को कॉल करने का प्रयास करेगा और Tree ऑब्जेक्ट को सीधे तत्काल तत्काल होने पर विफल हो जाएगा।

संबंधित मुद्दे

 संबंधित मुद्दे