क्या 'लॉ ऑफ डेमेटर' सार्वजनिक / एपीआई विधि हस्ताक्षरों पर लागू होता है?


10

यह देखते हुए कि एपीआई / सार्वजनिक विधि हस्ताक्षर में परिवर्तन उन क्लाइंट कोड को तोड़ने से रोकने के लिए कम से कम होना चाहिए जो इन विधियों का उपयोग करते हैं, मैं सोच रहा था कि क्या डेमेटर ऑफ लॉ इन पर कम लागू होता है।

एक सरल उदाहरण:

class Account() {
   double balance;
   public void debit(Transaction t) {
      balance -= t.getAmount();
   }
}

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

क्या यह इसे एक समझदार विकल्प बनाता है? या क्या मैं कुछ न कुछ भूल रहा हूं?

जवाबों:


3

लेकिन यह कानून के कानून को नहीं तोड़ता है।

औपचारिक रूप से, कार्यों के लिए डेमेटर ऑफ लॉ की आवश्यकता होती है कि किसी ऑब्जेक्ट O का एक तरीका M केवल निम्नलिखित वस्तुओं के तरीकों को लागू कर सकता है:

  • ओ ही है
  • एम के मापदंडों
  • M के भीतर बनाई गई किसी भी वस्तु / त्वरित
  • ओ के प्रत्यक्ष घटक वस्तुओं
  • एक वैश्विक चर, O के द्वारा सुलभ, M के दायरे में

विकिपीडिया: क़ानून का कानून

लेन-देन डेबिट पद्धति का एक तर्क है, इसलिए t.getAmount () को कॉल करना ठीक है।

संपादित करें: गलत है कि, आप कह रहे हैं कि आप लेन-देन की राशि पास करेंगे, लेन-देन वस्तु नहीं। अगर ऐसा है तो हां, मुझे लगता है कि इसे तोड़ने के लिए यह एक अच्छी जगह है, यह जानते हुए कि आपको भविष्य में लेनदेन वस्तु से अधिक की आवश्यकता होगी। इसके अलावा, डोमेन स्तर की वस्तुओं में प्रिमिटिव को एनकैप्सुलेट करना एक और अच्छा प्रोग्रामिंग अभ्यास है।

संपादित करें 2: भविष्य में पढ़ने की अधिक आवश्यकता हो सकती है, कोई इसे अनावश्यक सोना चढ़ाना के रूप में भी देख सकता है। एक ऐसी विधि प्रदान करना जो अब एक डबल लेती है (या बेहतर मनी क्लास) पर्याप्त है। यदि आपको बाद में लेन-देन तर्क की आवश्यकता है, तो लेन-देन के लिए दूसरा हस्ताक्षर प्रदान करना विनाशकारी नहीं है, लेकिन मूल हस्ताक्षर का समर्थन करना जारी रखें। ऐसा नहीं है कि आप दो तरीकों को लागू करेंगे, एक दूसरे को कॉल करेगा।


आपके सहयोग के लिए धन्यवाद। मैं डोमेन ऑब्जेक्ट्स में एन्कैप्सुलेटिंग प्राइमेटिक्स के बारे में सहमत हूं। हालाँकि, एडिट 2 में आपकी बात, आप कहते हैं कि नए 2 के हस्ताक्षर को जोड़ने के लिए यह विनाशकारी नहीं है, लेकिन इसका मतलब ग्राहक कोड में बदलाव होगा, जो अब एक के बजाय 2 मापदंडों को पारित करना चाहिए। वह दूसरा बिंदु, मैं सहमत हूं कि मैं सहमत नहीं हूँ ...
कार्लोस जैमे सी। डी। लियोन

संपादन 2 व्यक्तिपरक है, मैं सहमत हूं।
सीन

0

यदि आप Accountभविष्य में कक्षा का विस्तार करने की योजना बना रहे हैं, तो मैं कहूंगा कि यह एक ऐसी स्थिति है जहां Transactionवस्तु को अधिक सामान्य उद्देश्य बनाना कानून के नियमों का एक अच्छा झुकना होगा।

उदाहरण के लिए:

public class Amount {

    public void process( Transaction t ) {
        ....
    }
}

public abstract class Transaction {

    public String getType();

}

मुझे लगता है कि मैं मूल प्रश्न से भटका हुआ हूं, लेकिन मेरी बात यह है कि जब आप चिंतित हो सकते हैं कि आप लॉ ऑफ डेमेटर से भटक रहे हैं, तो नकारात्मक चीजों को दूर करने के फायदे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.