2009-02-16 20 views
39

लगभग हर प्रोग्रामर ने इसे अपने जीवन में एक बार किया: एक चर के मूल्य को बदलकर कुछ ध्वज सेट करना। वहाँ हमेशा गुण के बहुत सारे है और आप ट्रैक रखना चाहते हैं, तो कुछ एक विशिष्ट संपत्ति 'गंदे' ध्वज कार्यक्षमता को लागू करने के विभिन्न तरीके

  • में या गुण के कुछ सेट में किसी भी संपत्ति
  • में

    1. बदल

    मुझे इसमें रुचि है उपरोक्त परिस्थितियों के लिए "गंदे-ध्वज" कार्यक्षमता को लागू करने के विभिन्न तरीकों से, प्रत्येक वस्तु परिवर्तन पर मानक ऑब्जेक्ट चौड़े गंदे ध्वज को अपडेट किया जा रहा है। प्रत्येक सेटटर में "dirty = true" डालने से कुछ बेहतर होना चाहिए: यह सिर्फ बदसूरत दिखता है और एक कठिन काम है।

  • उत्तर

    24

    मेरे डीएओ के लिए मैं डेटाबेस से पुनर्प्राप्त मूल मानों की एक प्रति रखता हूं। जब मैं इसे अद्यतन करने के लिए भेजता हूं, तो मैं बस मूल मूल्यों की तुलना वर्तमान के साथ करता हूं। यह प्रसंस्करण में थोड़ा सा खर्च करता है लेकिन प्रति संपत्ति गंदे झंडा होने से यह बहुत बेहतर है।

    एक गंदे झंडे को न मानने के लिए आगे संपादित करने के लिए संपादित करें: यदि संपत्ति अपने मूल मूल्य पर लौटती है, तो उसे प्रतिबिंबित करने का कोई तरीका नहीं है, गंदे झंडे गंदे रहते हैं क्योंकि मूल मूल्य खो गया था।

    +1

    प्रति संपत्ति गंदे झंडा होने से यह बहुत बेहतर क्यों है? आप स्मृति में अधिक डेटा रखते हैं। मैं यह नहीं कह रहा हूं कि आप क्या कर रहे हैं बेहतर नहीं है, लेकिन आपने इसे उचित नहीं ठहराया है। –

    +4

    यदि आप वास्तव में इसके बारे में सोचते हैं तो मैं आवश्यक रूप से स्मृति में इतना अधिक डेटा नहीं रख रहा हूं क्योंकि मुझे प्रति संपत्ति स्थिति ध्वज ले जाने की आवश्यकता नहीं है। यदि मूल मूल पर वापस आता है तो मुझे इसे "अपरिवर्तित" पर सेट करने की चिंता करने की आवश्यकता नहीं है। इसके अलावा गंदे झंडे मुझे वापस जाने की इजाजत नहीं देंगे। –

    +1

    मैं अपने डीएओ के साथ एक ही काम कर रहा हूं। पुष्टि करना अच्छा है! – MicSim

    4

    मैं प्रत्येक सेटर में बदल दिया(), यानी केवल ध्वज बदलने के बजाय एक निजी विधि को कॉल करता हूं। विधि तब ध्वज सेट कर सकती है या जो भी प्रसंस्करण की आवश्यकता होती है, उदाहरण के लिए यह किसी भी पर्यवेक्षकों को भी सूचित कर सकता है।

    6

    यदि आप "गंदा" ध्वज सेट कर रहे हैं तो यह महसूस हो रहा है कि आप राज्य को बनाए रखते हैं। किसी बिंदु पर आपको उस राज्य के आधार पर एक कार्रवाई करने की आवश्यकता है, अन्यथा आपको ध्वज रखने की आवश्यकता नहीं होगी। तो सवाल तब बन जाता है: क्या आवश्यक कार्रवाई को ट्रिगर करने का कोई और तरीका है? किसी तरह के संदेश भेज रहा है? कौन "गंदे" राज्य का उपभोग करता है और कार्रवाई करता है, और क्या उस अधिसूचना के लिए एक क्लीनर इंटरफ़ेस है?

    10

    मेरे पास बेस एंटिटी क्लास होता था, जो गंदा/हटाया गया तर्क प्रदान करता था।

    जब इकाई-उपवर्गों लेखन, आप की तरह कुछ कर सकता है:

    public string Name 
    { 
        get { return name; } 
        set { setValue("Name", value); } 
    } 
    

    यह ठीक काम करता है, लेकिन 'बदसूरत स्ट्रिंग' रोग है ...

    आज आप को बाहर करने के लैम्ब्डा भाव का उपयोग कर सकते तार:

    set {setValue(x => x.Name, value);} 
    

    या, और मुझे लगता है कि यह सबसे अच्छा समाधान है, आप AOP इस्तेमाल कर सकते हैं:

    https://www.postsharp.net/

    इस तरह, आप गुणों द्वारा क्रियाओं को परिभाषित कर सकते हैं। आप एक विशेषता बनाते हैं और निर्दिष्ट करते हैं कि जब उपयोगकर्ता संबंधित संपत्ति को बदलता है, तो इकाई गंदा हो जाती है।

    इसके अतिरिक्त, आप अपनी कक्षा (आधार इकाई) में गुणों की एक सूची रख सकते हैं जो बदले गए गुणों को याद रखेंगे, और आपके एओपी कोड से उस सूची तक पहुंच सकते हैं।

    +0

    यह एओपी सुझाव के लिए मतदान करने के लिए सबसे अच्छी विधि आईएमओ –

    +1

    की तरह लगता है, लेकिन प्रारंभिक "सेटवैल्यू" विधि मुझे क्रिंग करता है :) – msulis

    8

    मैंने DirtyValue<T> नामक एक कक्षा बनाई है जिसका मूल मूल्य और वर्तमान मूल्य है।अपने पहले उपयोग पर यह मूल मूल्य और वर्तमान मूल्य दोनों सेट करता है। लगातार कॉल केवल वर्तमान मूल्य निर्धारित करते हैं।

    आप बता सकते हैं कि यह दो की तुलना करके बदल गया है, जिसे IsDirty() नामक एक पठनीय बूल प्रॉपर्टी के साथ बदल दिया गया है। इस तकनीक का उपयोग करके आप मूल मूल्य तक पहुंच भी प्राप्त कर सकते हैं।

    +0

    प्रकार के गुण DirtyValue हैं या क्या आपके पास केवल प्रकार के क्षेत्र हैं DirtyValue और फिर बस खुलासा करें संपत्ति के माध्यम से वर्तमान समय? अभी भी कड़ी मेहनत की तरह लगता है - हालांकि अच्छा है कि आपको सेट करने की ज़रूरत नहीं है dirty = true; सभी जगह –

    +0

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

    +0

    erm, फ़ील्ड मेरा मतलब है, मूल्य नहीं! :) –

    5

    डेटा लेखक कार्य और एक स्वतंत्र पाठक कार्य के साथ कुछ स्थितियों में, मैंने प्रत्येक कार्य को updateCount चर दिया है। जब भी यह लिखता है तो निर्माता इसकी गिनती बढ़ाता है। जब भी पाठक उठता है और निर्माता की गिनती से कम गिनती पाता है, तो यह वर्तमान मूल्यों के साथ एक अद्यतन करता है। काउंटर ओवरफ्लो के लिए आपको थोड़ा विशेष हैंडलिंग की आवश्यकता है, लेकिन यह लागू करने के लिए बहुत आसान है।

    मैंने सिमुलेशन में सफलतापूर्वक इस तकनीक का उपयोग किया है - जहां निर्माता भौतिकी पाश है और पाठक 3 डी डिस्प्ले है।

    2

    स्पष्ट dirty=true दृष्टिकोण के लिए एक दिलचस्प विकल्प है, हालांकि यह ज्यादातर स्थितियों के लिए शायद अधिक है और अक्सर लागू नहीं है, गार्ड पृष्ठों का उपयोग करना होगा। मेमोरी पेज को केवल पढ़ने के लिए सेट करें (उदा। विंडोज़ पर VirtualProtect() के साथ) और जब प्रोग्राम पृष्ठ पर लिखने का प्रयास करता है तो सिग्नल/अपवाद पकड़ें। एक रिकॉर्ड बनाएं कि पृष्ठ को संशोधित किया गया है, फिर पेज के सुरक्षा झंडे को लिखने योग्य और फिर से शुरू करने के लिए बदलें।

    यह आमतौर पर ऑपरेटिंग सिस्टम द्वारा नियोजित तकनीक है यह निर्धारित करने के लिए कि पृष्ठ को रैप से निकालने से पहले स्वैप फ़ाइल में लिखा जाना चाहिए या नहीं।

    -1

    आप गेटहाशकोड को ओवरराइड करना और अपने डोमेन ऑब्जेक्ट्स के तरीकों के बराबर दिखाना और ऑब्जेक्ट कुंजी द्वारा हैशटेबल में मूल हैशकोड संग्रहीत करना चाहते हैं। फिर एक ऐसी प्रक्रिया बनाएं जो ऑब्जेक्ट लेती है, हैशटेबल में इसकी कुंजी ढूंढें और हैश मानों की तुलना करें।

    • यदि हैश समान है, तो कोई बदलाव नहीं है। (भंडार या डेटाबेस को न भेजें)
    • यदि हैश अलग है, तो ऑब्जेक्ट में बदलाव आया है। (अद्यतन)
    • यदि कुंजी नहीं मिली, तो वस्तु नई है। (सम्मिलित करें)
    • यह सुनिश्चित करने के लिए कि ऑब्जेक्ट को प्रक्रिया पर हटाने के अलावा ऑब्जेक्ट को हटाने की आवश्यकता है या नहीं, उनके लिए हैशकोड ट्रैकिंग का उपयोग नहीं करना है या नहीं।

    मैंने यह कोशिश नहीं की है और ऑब्जेक्ट कुंजी ऑब्जेक्ट कुंजी/हैश मानों को ट्रैक करने का सबसे अच्छा तरीका नहीं हो सकता है। यह केवल हैश कोड और कुंजी को ट्रैक करके ज्ञापन को बचाएगा। मैं 100% निश्चित नहीं हूं, लेकिन मुझे लगता है कि कुछ ओआरएम इस विधि का उपयोग अपने डेटा संदर्भ/ट्रैकिंग ऑब्जेक्ट्स में कर सकते हैं।

    +3

    इस दृष्टिकोण में कोई समस्या है: "हैश वही" का मतलब हमेशा "कोई परिवर्तन नहीं" होता है, इसका अर्थ "परिवर्तन" हो सकता है, लेकिन हैश मानों को टक्कर लगी है। –

    +0

    -1 देखें http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx – reggaeguitar

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