2010-02-25 20 views
7

मैं एक मतदान प्रणाली है, जहां कई डोमेन वस्तुओं पर मतदान किया जा सकता है बनाना चाहते हैं:क्या यह एक कारखाने के लिए एक अच्छा उम्मीदवार है?

  • एक कैलेंडर ईवेंट
  • एक टिप्पणी
  • एक उपयोगकर्ता

तो मैं सोचा मैं पैदा करेगा इन मदों के लिए Voteable इंटरफ़ेस:

interface Voteable 
{ 
    public function vote(User $user, $value); 
} 

मुझे लगा कि यह vote विधि प्रॉक्सी भंडार विधि होगा, की तरह कुछ:

class VotingRepository 
{ 
    public function castVote(Voteable $item, User $user, $value) 
    { 
     // save the these values, along with the value 
     $itemId = $item->getId(); 
     $userId = $user->getId(); 

    } 
} 

अभी के लिए, भंडार एक डाटाबेस हो जाएगा।

  • eventVote
  • commentVote
  • userVote

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

class VotingRepositoryFactory 
{ 
    createVotingRepository($type) 
    { 
     switch($type) 
     { 
      case 'event': 
       // create a voting repository with EventVote table 
       return new VotingRepository(new EventVoteTable()); 
      case 'comment': 
       // create a voting repository with CommentVote table 
       return new VotingRepository(new CommentVoteTable()); 
      case 'user': 
       // create a voting repository with UserVote table 
       return new VotingRepository(new UserVoteTable()); 
     } 
    } 
} 
फिर

, यह सब एक साथ बांधने डोमेन वस्तुओं के भीतर से, (उदाहरण के लिए इस मामले में टिप्पणी), मैं कुछ इस तरह दिखेगा:

class Comment implements Voteable 
{ 
    public function construct() 
    { 
     $this->_repository = VotingRepositoryFactory::createVotingRepository('comment'); 
    } 

    public function vote(User $user, $value) 
    { 
     $this->_repository->castVote($this, $user, $value); 
    } 
} 

इस करता है सही बात?

+0

बस याद रखें कि डिज़ाइन पैटर्न से बहुत दूर नहीं जाना है। प्रभावी ढंग से और समझदारी से उपयोग किए जाने पर डिजाइन पैटर्न सुरुचिपूर्ण और आसानी से बनाए रखने योग्य कोड बनाते हैं। हालांकि, आप दीवार पर अपनी घड़ी को लटकाने के लिए 10 फीट मचान बनाने के गड़बड़ी से बचना चाहते हैं। उस ने कहा, मुझे बहुत ज्यादा मचान के पक्ष में गलती करना पसंद है। ;-) –

+0

@ जेफ: मैं सुन रहा हूं कि आप क्या कह रहे हैं। हालांकि वेबसाइट कम से कम महत्वाकांक्षी परियोजना होगी (कम से कम मेरे लिए)। तो मुझे यह गिट जाने से जितना संभव हो सके उतना ही बनाए रखना पसंद है। –

उत्तर

4

हाँ दोनों भंडार और कारखाने को समझ में आता है।

कारखाने के बारे में कुछ टिप्पणियां:

मैं switch ($type) हटाने और Votable वस्तु के प्रत्येक प्रकार के लिए तरीके बनाएंगे। तो बजाय

VotingRepositoryFactory::createVotingRepository('comment');

मैं

VotingRepositoryFactory::createCommentVotingRepository();

कारण किया जा रहा है कि यह, स्विच करने के लिए एक नया मामला जोड़ने के लिए भूल जाते हैं, जबकि (मैं के बारे में यकीन नहीं है आसान है पसंद करते हैं PHP, लेकिन) संकलित भाषाएं आपको बताएंगी कि एक बुलाया गया तरीका कब गायब है। यह भी याद रखना कि आप किस प्रकार के तारों को कारखाने के तरीके में भेज सकते हैं क्योंकि $ प्रकार कठिन है, जबकि अधिकांश बुद्धिमान आईडीई आपको बताएंगे कि कक्षा/वस्तु पर कौन सी विधियां मौजूद हैं।

एक और विचार एक सिंगलटन जोड़ना होगा जिसे VotingRepositoryFactory::Instance->createCommentVotingRepository(); कहा जा सकता है।"इंस्टेंस" तब डेटाबेसवॉटिंग रिपोजिटरी फैक्ट्री या फ़ेकवॉटिंग रिपोजिटरी फैक्ट्री (यूनिट परीक्षण के लिए) या वोटिंग रिपोजिटरी फैक्ट्री के किसी अन्य कार्यान्वयन के बाद हो सकता है। यदि आप इकाई परीक्षण लिखना चाहते हैं या किसी अन्य स्टोरेज सिस्टम पर स्विच करना चाहते हैं तो इस तरह आप आसानी से VotingRepositoryFactory के कार्यान्वयन को प्रतिस्थापित कर सकते हैं।

बस कुछ विचार ..

+0

+1 यह कुछ अतिरिक्त अतिरिक्त जानकारी है। धन्यवाद। तो, मुझे देखने दो कि क्या मुझे यह सीधे मिलता है: दूसरे शब्दों में आप कह रहे हैं कि 'getInstance()' एक कारखाने की तरह भी होगा? उदाहरण के लिए कुछ कॉन्फ़िगरेशन के आधार पर यह एक और कारखाना देता है? क्या यह किसी भी मौके से एक अमूर्त कारखाने के रूप में जाना जाता है? –

+0

हां, getInstance() द्वारा लौटाई गई वस्तु एक सार कारखाना होगी। आप किसी प्रकार की कॉन्फ़िगरेशन फ़ाइल का उपयोग यह बताने के लिए कर सकते हैं कि इसे किस प्रकार का कारखाना बनाना चाहिए। कभी-कभी मैं इसे भी मुश्किल कोड (_instance = नया ...)। एक बार जब आपको (कोड की एक पंक्ति) हो तो इसे प्रतिस्थापित करना बहुत आसान हो जाता है। एक बार अधिक से अधिक सिंगलेट्स आपके एप्लिकेशन में पॉप अप करना शुरू कर देते हैं, तो आप "सर्विसलोकेटर" पैटर्न या किसी प्रकार के आईओसी-कंटेनर को भी देखना चाहेंगे .. इस तरह आप अपने सभी सिंगलेट्स (और बहुत कुछ) को कॉन्फ़िगर कर सकते हैं एक केंद्रीय स्थान – stmax

2

हाँ, यह करता है।

:]

+0

क्या ?! कोई अगर, और या परंतु नहीं...??? क्या मैं वास्तव में इसके बाद लटकना शुरू कर रहा हूं? वू हू! :- डी –

+0

हम्म .. क्षमा करें, लेकिन आपने एक सही उत्तर के साथ अपने प्रश्न का उत्तर दिया है – streetparade

+0

ठीक है, तो आप दोनों को: आश्वासन के लिए धन्यवाद। –

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

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