2011-01-27 6 views
5

मैं एक PHP ऑब्जेक्ट को डिजाइन करने की कोशिश कर रहा हूं (इसे Incident_Collection पर कॉल करें) जिसमें अन्य ऑब्जेक्ट्स का संग्रह होगा जिसमें से प्रत्येक Incident इंटरफ़ेस को कार्यान्वित करेगा।दिनांकित वस्तुओं के संग्रह के लिए डेटास्ट्रक्चर चुनना

<?php 
class Foo implements Incident { 
    protected $incident_date; //DateTime object 
    protected $prop1; 
    protected $prop2; 
    //etc 

    public function when(){ //required by Incident interface 
    return $this->incident_date; 
    } 

} 
?> 

पहले तो मुझे मैं सिर्फ बनाने चाहते हैं मेरी Incident_Collection लागू IteratorAggregate और संग्रह की एक सरणी संपत्ति में हादसा वस्तुओं की दुकान लगा:

<?php 
class Incident_Collection implements IteratorAggregate { 
    protected $collection=array(); 

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

    public function sort(){ 
    //sort by $incident->when() values in $this->collection 
    } 

    /*also __get($var), __set($var,$value), add(Incident $object), remove(Incident $object) and other functions*/ 
} 
?> 

लेकिन क्योंकि Incident वस्तुओं एक प्राकृतिक व्यवस्था है, मैं शायद SPL Data Structures में से एक को विस्तारित करना अधिक उचित/कुशल हो सकता है। लेकिन कौन सा? मैं किसी विशेष डेटा संरचना का उपयोग करने के बारे में बहुत स्पष्ट नहीं हूं।

एक और शिकन वहाँ एक Incident_Collection पर प्रतिबंध हो सकता है। उदाहरण के लिए, अगर वहाँ एक Person वस्तु है जो एक Incident_Collection, थे शायद निम्न प्रतिबंध लागू हो सकता है:

  • केवल 1 Birth घटना
  • अगर Birth मौजूद है, यह संग्रह में जल्द से जल्द घटना होना चाहिए
  • केवल 1 Death घटना
  • अगर Death मौजूद है, यह संग्रह में पिछले घटना
  • HS_Graduationके बाद आना चाहिए होना चाहिए

क्या सामान्य Incident_Collection होना बेहतर होगा जो इसके मालिक से प्रतिबंधों का एक सेट स्वीकार करता है (उदा। Person), या एक उपclassed Person_Incident_Collection?

उत्तर

3

चेक बाहर

यह एसपीएल datastructures का एक अच्छा सिंहावलोकन देता है, वे क्या कर रहे हैं और आप उन्हें उपयोग करने के लिए चाहते हैं। बेंचमार्क भी हैं।

इस एक वस्तु संग्रह है, तो मैं निश्चित रूप से सादे सरणी के बजाय SplObjectStorage उपयोग करने पर विचार होगा। यदि घटनाएं लिफो या फीफो आदेश में होनी चाहिए तो कतार और ढेर पर विचार करें। यदि आपको कस्टम ऑर्डर में उनकी आवश्यकता है, तो Priority Queue पर विचार करें।

प्रतिबंध के बारे में

, आप एक State Pattern इस्तेमाल कर सकते हैं, उदाहरण के लिए सामान्य घटना कोलेक्शन के माध्यम से पहुंच होती है, लेकिन इसकी मालिक संपत्ति के आधार पर, राज्य के परिवर्तन को संभालने के लिए एक उप-वर्ग लागू किया जाता है। इस संग्रह के लिए मालिक की संपत्ति होने की आवश्यकता है। चूंकि अलग-अलग राज्य घटनाक्रम चयन के उप-वर्ग हैं, फिर भी आप उन्हें सीधे उपयोग कर सकते हैं।

+0

उत्कृष्ट लिंक। धन्यवाद! – dnagirl

+1

ऐसा लगता है कि प्राथमिकता कतार मेरा लड़का है। मैं राज्य के पैटर्न के बारे में सोच रहा हूं और सोच रहा हूं कि क्या यह लिली को गिल्ड कर रहा था। अपने विचारों को जानकर खुशी हुई। – dnagirl

+0

@dnagirl आपका स्वागत है। राज्य पैटर्न मैं इस निर्णय का आधार रखूंगा कि क्या मालिक वास्तव में एक वास्तविक स्थिति (बनाम केवल एक संदर्भ/लिंक) है, इंकेंटिलेक्शन का चयन करें या यदि यह एक विशेष कारण है। यदि उत्तरार्द्ध, मैं राज्य का उपयोग नहीं करता।यह सुनिश्चित नहीं है कि इसे कम अस्पष्ट कैसे रखा जाए। माफ़ कीजिये :) – Gordon

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