मार्टिन स्थिरता मीट्रिक को ध्यान में रखें और "स्थिरता" से उसका क्या अर्थ है:
Instability = Ce / (Ca+Ce)
या:
Instability = Outgoing / (Incoming+Outgoing)
यही है, एक पैकेज को पूरी तरह से अस्थिर माना जाता है यदि इसकी सभी निर्भरताएं आउटगोइंग हैं: यह अन्य चीजों का उपयोग करता है, लेकिन कुछ भी इसका उपयोग नहीं करता है। उस मामले में, यह केवल उस चीज के ठोस होने के लिए समझ में आता है। यह कोड को बदलने के लिए सबसे आसान तरह का कोड होने जा रहा है क्योंकि इसके अलावा और कुछ भी इसका उपयोग नहीं करता है, और इसलिए उस कोड को संशोधित करने पर कुछ और नहीं टूट सकता है।
इस बीच जब आपके पास एक या अधिक चीजों द्वारा उपयोग किए जाने वाले पैकेज के साथ पूर्ण "स्थिरता" का विपरीत परिदृश्य होता है, लेकिन यह अपने आप में किसी भी चीज का उपयोग नहीं करता है, जैसे कि सॉफ्टवेयर द्वारा उपयोग किए जाने वाले केंद्रीय पैकेज, जब मार्टिन कहता है कि यह चीज होनी चाहिए सार। यह भी एसओएलआई (डी) के डीआईपी भाग, डिपेंडेंसी इनवर्जन सिद्धांत द्वारा प्रबलित है, जो मूल रूप से बताता है कि निर्भरता कम और उच्च-स्तरीय कोड दोनों के लिए समान रूप से अमूर्त की ओर प्रवाहित होनी चाहिए।
यही है, निर्भरताएँ "स्थिरता" की ओर समान रूप से प्रवाहित होनी चाहिए, और अधिक सटीक रूप से, निर्भरताएँ आउटगोइंग निर्भरताओं की तुलना में अधिक आवक निर्भरता वाले पैकेजों की ओर प्रवाहित होनी चाहिए और, निर्भरताएँ अमूर्तता की ओर प्रवाहित होनी चाहिए। इसके पीछे तर्क का सार यह है कि अमूर्त सांस लेने के लिए दूसरे के लिए एक उपप्रकार स्थानापन्न करने के लिए श्वास कक्ष प्रदान करते हैं, ठोस भागों के लिए लचीलेपन की उस डिग्री को पेश करते हैं जो उस अमूर्त इंटरफ़ेस पर आने वाली निर्भरता को तोड़ने के बिना इंटरफ़ेस को लागू करने के लिए बदल देता है।
क्या अमूर्तता के आधार पर कोई महत्वपूर्ण नुकसान हैं?
खैर, मैं वास्तव में कम से कम अपने डोमेन के लिए यहां मार्टिन से असहमत हूं, और यहां मुझे "स्थिरता" की एक नई परिभाषा प्रस्तुत करने की आवश्यकता है, "बदलने के लिए अभाव"। उस स्थिति में मैं कहूंगा कि निर्भरता स्थिरता की ओर प्रवाहित होनी चाहिए, लेकिन अमूर्त इंटरफेस मदद नहीं करते हैं यदि अमूर्त इंटरफेस अस्थिर हैं ("अस्थिर" की मेरी परिभाषा के अनुसार, जैसा कि बार-बार बदले जाने की संभावना है, मार्टिन की नहीं)। यदि डेवलपर्स एब्स्ट्रैक्ट को सही नहीं कर पाते हैं और क्लाइंट बार-बार अपने दिमाग को उन तरीकों से बदलते हैं जो सॉफ्टवेयर को अपूर्ण या अप्रभावी बनाने के लिए एब्सट्रैक्ट प्रयासों को प्रस्तुत करते हैं, तो हम अब कैस्केड निर्भरता-ब्रेकिंग परिवर्तनों के खिलाफ सिस्टम की सुरक्षा के लिए एब्सट्रैक्ट इंटरफेस के बढ़े हुए लचीलेपन से लाभ नहीं उठा सकते हैं। । अपने व्यक्तिगत मामले में, मैंने ईसीएस इंजन पाया है, जैसे कि एएए गेम्स में पाए गए,सबसे ठोस : कच्चे डेटा की ओर, लेकिन ऐसा डेटा अत्यधिक स्थिर होता है (जैसे, "कभी बदलने की आवश्यकता नहीं है")। मैंने अक्सर एसई के फैसलों को निर्देशित करने में कुल बदलावों के अनुपात के मुकाबले भविष्य में बदलाव की आवश्यकता के बारे में अधिक उपयोगी मीट्रिक होने की संभावना पाई है।
इसलिए मैं डीआईपी को थोड़ा बदल दूंगा और बस इतना कहूंगा, "उन घटकों की ओर निर्भरता बढ़नी चाहिए जिनमें आगे बदलाव की सबसे कम संभावना है", चाहे वे घटक सार इंटरफेस या कच्चे डेटा हों। मेरे लिए यह सब मायने रखता है कि उन्हें प्रत्यक्ष डिज़ाइन-ब्रेकिंग परिवर्तनों की आवश्यकता हो सकती है। सार केवल स्थिरता के इस संदर्भ में उपयोगी होते हैं यदि कुछ, अमूर्त होने से, उस संभावना को कम कर देता है।
ऐसे कई संदर्भों के लिए, जो सभ्य इंजीनियरों और क्लाइंट के साथ हो सकते हैं, जो सॉफ़्टवेयर अपफ्रंट और डिज़ाइन की आवश्यकताओं का अनुमान लगाते हैं (जैसे कि, अपरिवर्तित) सार, जबकि उन अमूर्तियों में वे सभी साँस लेने वाले कमरे की पेशकश करते हैं जो उन्हें ठोस कार्यान्वयन स्वैप करने की आवश्यकता होती है। लेकिन कुछ डोमेन में, अमूर्त अस्थिर हो सकता है और अपर्याप्त होने का खतरा हो सकता है, जबकि इंजन के लिए आवश्यक डेटा अग्रिम में स्थिर और अनुमानित करने के लिए बहुत आसान हो सकता है। तो उन मामलों में, यह वास्तव में एक स्थिरता के दृष्टिकोण से अधिक फायदेमंद हो सकता है (निर्भरता को बदलने के लिए और सिस्टम को बदलने में आसानी)। एक ईसीएस में, सबसे अस्थिर भागों (जैसा कि भागों में सबसे अधिक बार बदला जाता है) आमतौर पर सिस्टम में रहने वाली कार्यक्षमता है (PhysicsSystem
, जैसे), जबकि सबसे स्थिर भागों (कम से कम बदलने की संभावना के रूप में) ऐसे घटक हैं जो सिर्फ कच्चे डेटा ( MotionComponent
, जैसे) से युक्त होते हैं जो सभी सिस्टम का उपयोग करते हैं।