2008-10-19 20 views
5

लागू करता है। मैं अपने सिर को एसपीएल इटरेटर्स के आसपास लाने की कोशिश कर रहा हूं और मैं इसे संभालने के 2 तरीके लेकर आया हूं। मैं पहला संस्करण कम जटिल होने के लिए देखता हूं लेकिन दूसरे संस्करण में रचना को महसूस होता है (मुझे लगता है)।क्या कोई ऑब्जेक्ट एक इटरेटर को कार्यान्वित करता है या किसी अन्य ऑब्जेक्ट को लागू करता है जो एक इटरेटर

मैं क्या नहीं देख रहा हूं कि दूसरे पर कौन सा बेहतर है? या मैं बस इसे जटिल बना रहा हूँ?

वस्तु पुनरावर्तक लागू करता है::

class BoxOfChocolates implements Iterator { 

    private $id 
    private $name; // e.g. Valentine's Heart Box 
    private $maker; // e.g. Hersheys 
    private $items; // array 

    public function getChocolates() { 
    $query = ... 
    foreach($rows as $row) { 
     $this->_items[] = new Chocolate() ... 
    } 
    } 

    // ... necessary iterator implementation stuff 


} 

वस्तु एक पुनरावृति करने योग्य वस्तु शामिल हैं:

class BoxOfChocolates { 

    private $id; 
    private $name; 
    private $maker; 
    private $items; // chocolates object 

    public function getChocolates() { 
    $this->items = new Chocolates(); 
    $this->items->getChocolates(); 
    } 

} 


class Chocolates implements Iterator { 

    private $items; 

    public function getChocolates() { 
    $query = ... 
    foreach($rows as $row) { 
     $this->_items[] = new Chocolate() ... 
    } 
    } 

    // ... necessary iterator implementation stuff 

} 

उत्तर

2

यह स्थिति पर निर्भर करता

यहाँ मेरे विचार कर रहे हैं। क्या टी 0 में चॉकलेट के बॉक्स में कई संग्रह होते हैं? यदि ऐसा है तो आपको संग्रह सदस्य होना चाहिए।

इस तरह से सोचें। चॉकलेट का एक बॉक्स एक संग्रह (यानी पर्सनलिस्ट) या किसी संग्रह का मालिक है (यानी एक कार के अपने अंतिम मालिकों का संग्रह हो सकता है)।

मैं इस पहले समूह

:)

1

मैं भी पहले समूह सुझाव देंगे, अपने चॉकलेट रूपक संभालने के अंतर्गत आती है बहुत वास्तविक वर्ग के लिए सटीक है लगता है।

चॉकलेट का एक बॉक्स वास्तव में आपके चॉकलेट का संग्रह है, और इस तरह के बॉक्स में उस चॉकलेट पर पुनरावृत्ति करना चाहते हैं। एक अलग चॉकलेट सूची जोड़ना वास्तव में कोई मूल्य नहीं जोड़ता है, और ऐसा लगता है कि एक अनावश्यक परत जोड़ना प्रतीत होता है।

0

ठीक है, मुझे PHP नहीं पता है, इसलिए मैं सवाल का सही जवाब नहीं दे सकता, लेकिन मैं इसे उस क्षेत्र से संबंधित करने का प्रयास करूंगा जो मुझे पता है।

सी # में, दो इंटरफेस हैं: IENumerable और IENumerator। आपके उदाहरण में, BoxOfChocolates संख्यात्मक होगा, चॉकलेट एक गणक होगा।

संख्याओं में केवल एक विधि है जो एक गणनाकर्ता देता है। गणक के पास एक मौजूदा वस्तु की अवधारणा है, और अगले आइटम पर जाने का साधन है। ज्यादातर मामलों में, गणनाकर्ता वर्ग "देखा" नहीं है। उदाहरण के लिए, लाइन में "foreach (BoxOfChoclates में चॉकलेट आइटम)" बॉक्सऑफ चॉकलेट एक संख्यात्मक है; गणनाकर्ता वस्तु पूरी तरह से foreach द्वारा छुपा है।

0

काफी आसानी से कंटेनर इटरेटर को लागू करने का स्थान है।

0

मुझे लगता है कि आपको अपने संग्रह को अपने इटरेटर से अलग रखना चाहिए। मैं @ जेम्स क्रासन से सहमत हूं कि संग्रह में अक्सर इटरेटर होते हैं - वास्तव में, उनमें कई हो सकते हैं। मिसाल के तौर पर, आप एक इटरेटर चाहते हैं जो नट्स के साथ कैंडी छोड़ देता है (हालांकि सामान्य मामला ऑर्डरिंग को उलट देता है)। इस मामले में अगली() विधि का अर्थ बदल जाता है। इसे संभालने के लिए, अलग-अलग वर्गों में इटरेटर को कार्यान्वित करें जिसमें उनके स्वयं के पुनरावृत्ति अर्थशास्त्र शामिल हैं। उचित क्रम के इटरेटर प्राप्त करने के लिए संग्रह में विधियां प्रदान करें। यह वास्तव में चिंताओं को अलग करने का मुद्दा है। संग्रह परवाह नहीं है कि उपयोगकर्ता इस पर कैसे पुनरावृत्त करता है, यह इटेटरेटर की चिंता है।

4

बीबीएक्सबीबी, सबसे अच्छा समाधान आमतौर पर सबसे सरल है। आप निश्चित रूप से अलग इटरेटर ऑब्जेक्ट बनाने वाली चीज़ों को अधिक जटिल नहीं कर रहे हैं।वास्तव में, PHP IteratorAggregate इंटरफ़ेस प्रदान करने वाले इस तरह के एकत्रीकरण का समर्थन करता है और प्रोत्साहित करता है। IteratorAggregate को लागू करने वाले ऑब्जेक्ट्स में getIterator() विधि Iterator लौटने वाली विधि होनी चाहिए। यह वास्तव में आपके getChocolated() विधि क्या करता है। IteratorAggregate के बारे में अच्छी बात यह है कि आप इसका ऑब्जेक्ट सीधे foreach लूप पर पास कर सकते हैं। आपका कोड इस तरह की तरह लग सकता है जब इसे का उपयोग:

class BoxOfChocolates implements IteratorAggregate 

    private $chocolates = array(); 

    public function getIterator() { 
     return new ArrayIterator(new ArrayObject($this->chocolates))); 
    } 

} 

और फिर, कोड में कहीं:

$box = new BoxOfChocolates(); 
foreach ($box as $chocolate) { ... } 
संबंधित मुद्दे

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