"सीम" शब्द को समझने में समस्या


20

मैं मार्क सीमेन द्वारा ".NET में निर्भरता इंजेक्शन" पढ़ रहा हूं (यह शानदार है, और होना चाहिए) और लेखक अक्सर "सीम" शब्द का उपयोग करता है। लेकिन मैं इसका मतलब नहीं समझ सकता। इस शब्द का उपयोग करने का एक उदाहरण इस प्रकार है:

अध्याय 7 बताता है कि विभिन्न ठोस रूपरेखाओं में वस्तुओं की रचना कैसे करें जैसे ASP.NET MVC, WPF, WCF, और इसी तरह। सभी चौखटे डीआई को समान रूप से अच्छी तरह से समर्थन करते हैं, और यहां तक ​​कि उन लोगों के बीच भी, जिस तरह से वे करते हैं वह बहुत भिन्न होता है। प्रत्येक ढांचे के लिए, उस फ्रेम में DI को सक्षम करने वाले SEAM की पहचान करना मुश्किल हो सकता है। हालाँकि, एक बार जब SEAM मिल जाता है, तो आपके पास सभी एप्लिकेशंस के लिए एक समाधान होता है जो इस विशेष रूपरेखा का उपयोग करते हैं। अध्याय 7 में, मैंने यह काम सबसे सामान्य .NET एप्लीकेशन फ्रेमवर्क के लिए किया है। इसे फ्रेमवर्क SEAMS की सूची के रूप में सोचें।

इस शब्द को समझने में मेरी मदद करने के लिए मैं आभारी रहूंगा।


3
इस बात के संकेत हैं कि लेखक के ब्लॉग पर इस शब्द का क्या अर्थ है । और जब से वह यहाँ एक सदस्य है : @MarkSeemann यह एक तुम्हारे लिए है :)
yannis

जवाबों:


25

मुझे लगता है कि यह शब्द माइकल फेदर से प्रभावी रूप से लिगेसी कोड के साथ काम करता है , जिसमें वह सॉफ्टवेयर में एक सीम को एक ऐसी जगह के रूप में समझाता है, जहां सॉफ्टवेयर के दो हिस्से मिलते हैं और जहां कुछ और इंजेक्शन लगाया जा सकता है। सादृश्य कपड़ों में एक सीम है: वह स्थान जहाँ दो भागों को एक साथ सिला जाता है। प्रत्येक तरफ का टुकड़ा केवल सीम पर दूसरे अधिकार को छूता है। सॉफ्टवेयर पर वापस जाएं: यदि आप सीम की पहचान करते हैं तो आपने उस स्थान की पहचान की है जहां एक अच्छी तरह से परिभाषित इंटरफ़ेस है। डीआई में आप इसका लाभ उठा सकते हैं, क्योंकि इस तरह के एक इंटरफ़ेस से आपको बाकी सॉफ्टवेयर के बिना कार्यान्वयन को बदलने की अनुमति मिलती है (बिना धोखा दिए, वैसे भी)।


7
c2.com/cgi/wiki?SoftwareSeam - उन लोगों के लिए एक संदर्भ के रूप में जिनके पास पुस्तक नहीं है।
यानिस ३०'१२

मैं अभी वह किताब पढ़ रहा हूँ!
मालफिस्ट

10
+1 एफडब्ल्यूआईडब्ल्यू, मैं पृष्ठ 22 पर धारा 1.3.1 में अवधारणा प्रस्तुत करता हूं।
मार्क सेमन

13

क्रिश्चियन के जवाब पर, मेरे ज्ञान के सर्वश्रेष्ठ के लिए, शब्द सीम की उत्पत्ति पंख की पुस्तक, वर्किंग इफेक्टिवली विथ लिगेसी कोड से हुई है । परिभाषा 31 पृष्ठ पर है:

सीम एक ऐसी जगह है जहां आप उस स्थान पर संपादन के बिना अपने कार्यक्रम में व्यवहार को बदल सकते हैं।

सीम क्या है और क्या नहीं है, इसके उदाहरण देने के लिए, निम्नलिखित जावा कोड पर विचार करें:

public class MyClass {
  private final Foo foo;

  public MyClass(Foo foo) {
    this.foo = foo;
  }

  public void doBunchOfStuff(BarFactory barFactory) {
    // foo.doStuff() is a seam because I can inject a mock instance of Foo
    this.foo.doStuff();

    // barFactory.makeBars() is a seam because I can replace the default
    // BarFactory instance with something else during testing
    List<Bar> bars = barFactory.makeBars();
    for(Bar bar : bars) {
      // bar.cut() is also a seam because if I can mock out BarFactory, then
      // I can get the mocked BarFactory to return mocked Bars.
      bar.cut();
    }

    // MyStaticClass.staticCall() is not a seam because I cannot replace
    // staticCall() with different behavior without calling a class besides
    // MyStaticClass, or changing the code in MyStaticClass.
    MyStaticClass.staticCall();

    // This is not a seam either because I can't change the behavior of what
    // happens when instanceCall() occurs with out changing this method or
    // the code in instanceCall().
    (new MyInstanceClass()).instanceCall();
  }
}

जब तक ऊपर उदाहरण दिए गए हैं, तब तक सीम होंगे:

  1. इंजेक्ट किया जा रहा वर्ग अंतिम है।
  2. कहा जा रहा विधि अंतिम है।

मूल रूप से, सीम इकाई परीक्षण की सुविधा प्रदान करते हैं। मैं नहीं करने के लिए एक इकाई परीक्षण लिख सकते हैं MyClassक्योंकि आने वाले कॉल की MyStaticClass.staticCall()और (new MyInstanceClass()).instanceCall()। के लिए किसी भी इकाई परीक्षण MyClassकी doBunchOfStuff()विधि परीक्षण करने के लिए होगा MyStaticClass.staticCall()और (new MyInstanceClass()).instanceCall()और सब है कि कहा जाता हो उनकी निर्भरता की। इसके विपरीत, गैर-अंतिम वर्गों के साथ गैर-अंतिम तरीकों (या बेहतर अभी तक - इंटरफेस) का उपयोग करके, मॉकिंग को सुविधाजनक बनाने के द्वारा लिखने के लिए संभव के इंजेक्शन उदाहरण Fooऔर BarFactoryइकाई परीक्षण करें MyClass

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