2010-10-09 23 views
9

मान लीजिए कि हम एक मॉडल के अंदर एक विधि है किक्या एक मॉडल विधि स्वयं को 'सेव' कॉल करनी चाहिए?

  1. जरूरतों को बचाया रिकॉर्ड पर केवल बुलाया
  2. मॉडल खुद को अपडेट कर सकता है और इस तरह मॉडल फिर से बचाया जा समापन

की जरूरत है कि चलो यदि "सेव" कॉल विधि के अंदर निम्न कोड

def result 
    save! if new_record? 

    # do some funky stuff here that may also change the model state 
    # ... 
    # And calculate the return value 
    search_result = "foo" # Let's say "foo" is the value we calculated 

    save! if changed? 
    search_result # return 
end 

या बाहरी पर्यवेक्षक (वें ई नियंत्रक) आवश्यकतानुसार सहेजने के लिए ज़िम्मेदार हो?

+0

किसी भी तरह से संबंधित प्रश्न: http://stackoverflow.com/questions/3125198/should-a-modifying-class-method-save-itself-or-be-explicity-called-after-the-meth –

+0

इस प्रस्तुति पर परीक्षण यह पता लगाने में आपकी सहायता कर सकता है कि इस मॉडल पर इंटरफ़ेस अजीब क्यों हो रहा है। https://github.com/jimweirich/presentation_testing_why_dont_we_do_it_like_this/raw/master/pdf/testing.key.pdf अगर आपको लगता है कि जब आप अपने आवेदन का परीक्षण कर रहे हैं तो आपको डीबी को हिट करना होगा, शायद कुछ कार्यक्षमता हो सकती है फैक्टर आउट जो वास्तुकला का उपयोग करना आसान बना देगा। पीजी के आसपास शुरू करो। 69. –

+0

यह सुनिश्चित नहीं है कि यह वास्तव में प्रश्न से कैसे संबंधित है लेकिन उत्कृष्ट प्रस्तुति फिर भी - साझा करने के लिए धन्यवाद! –

उत्तर

4

यदि आपकी विधि वास्तव में, वास्तव में ऐसा करने की ज़रूरत है, तो हो।

हालांकि, मैं यह विधि तुम क्यों कर रहे हैं कि (टिप्पणी यहाँ अच्छा हो सकता है) में देखने से स्पष्ट होता है, और निश्चित रूप से है कि यह जो कोई भी यह आह्वान यह है कि के लिए स्पष्ट है कि यह एक bang_method! बनाना होगा ताकि विधि जितनी चाहें ऑब्जेक्ट के साथ गड़बड़ करने के लिए उत्तरदायी है।

इसके अलावा, विधि का नाम result (जो, मुझे पता है, शायद आपका असली तरीका नाम नहीं है) कुछ हद तक तात्पर्य है कि आप केवल डेटा ला रहे हैं, और कुछ और। हो सकता है कि load_result! यहां अधिक उपयुक्त होगा, यह स्पष्ट करने के लिए कि आप केवल एक विशेषता तक नहीं पहुंच रहे हैं, बल्कि वास्तव में, इसे प्राप्त करने के लिए भारी संचालन कर रहे हैं।

2

कोई प्रोग्राम किसी फ़ाइल पर डेटा सहेजता है?

ए) केवल तभी जब उपयोगकर्ता को इसकी आवश्यकता होती है (प्रत्यक्ष या परोक्ष रूप से)? - यह नियंत्रक केस

बी) केवल तभी जब कार्यक्रम इसकी शुद्धता और डेटा अखंडता का हिस्सा प्राप्त करता है? - यह मॉडल केस

सी) दोनों है।

मैं (सी) के लिए वोट दूंगा। मुझे उम्मीद है कि यह भेदभाव चीजों को थोड़ा सा करता है।

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

4

निश्चित रूप से ऐसे समय होते हैं जब मॉडल के लिए खुद को बनाए रखना आवश्यक होता है। लेकिन यह विचार करने योग्य है कि सहेजें आपके आवेदन के लिए सबसे अच्छी विधि है।

वर्तमान उदाहरण में, हमारे पास एक मॉडल है जो लंबे समय से चलने वाली विधि में एक फ़ाइल को अतुल्यकालिक रूप से संसाधित करता है (हम साइडकीक का उपयोग कर प्रक्रिया को कताई कर रहे हैं।) विधि के अंदर, एक सतत विशेषता नियमित रूप से अपडेट की जाती है ताकि स्थिति की जानकारी हो अन्य अनुरोधों के लिए उपलब्ध है।

हम बचाने के बजाय update_column उपयोग कर रहे हैं, क्योंकि

  1. हम नहीं चाहते हैं या एआर कॉलबैक की भूमि के ऊपर की जरूरत है, और हम विशेष रूप से सत्यापन छोड़ करने के लिए अद्यतन होता है सुनिश्चित करना चाहते हैं निश्चित रूप से और तुरंत।
  2. हमें केवल एक ही विशेषता को अपडेट करने की आवश्यकता है। update_column का उपयोग निर्धारित करने के लिए किसी भी अन्य विशेषताओं सहेजने की आवश्यकता है कि क्या जरूरत से बचा जाता है (या नहीं बचाया।)

मॉडल के अंदर, जैसे तरीकों

  • update_column
  • बचाने (: validate => false)(दी गई, एक ही विधि, लेकिन विभिन्न विकल्प)
  • स्पर्श

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

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