“Dikiş” kelimesini anlama sorunu


20

Mark Seemann tarafından ".NET Bağımlılık Enjeksiyonu" okuyorum (harika ve olması gerekir) ve yazar genellikle "dikiş" kelimesini kullanır. Ama bunun ne anlama geldiğini anlayamıyorum. İşte bu kelimeyi kullanmanın bir örneği:

Bölüm 7, ASP.NET MVC, WPF, WCF ve benzeri gibi çeşitli beton çerçevelerde nesnelerin nasıl oluşturulacağını açıklar. Tüm çerçeveler DI'yi eşit derecede desteklemez ve bunu yapanlar arasında bile, yaptıkları yollar çok farklıdır. Her çerçeve için, bu çerçevede DI'yi etkinleştiren SEAM'i tanımlamak zor olabilir. Ancak, SEAM bulunduğunda, bu özel çerçeveyi kullanan tüm uygulamalar için bir çözümünüz vardır. Bölüm 7'de, bu işi en yaygın .NET uygulama çerçeveleri için yaptım. Bunu bir çerçeve SEAMS kataloğu olarak düşünün.

Bu kelimeyi anlamamda bana yardımcı olduğum için minnettar olurum.


3
Yazarın blogunda kelimenin ne anlama geldiğine dair ipuçları var . Ve burada üye olduğu için: @MarkSeemann bu tam size göre :)
yannis

Yanıtlar:


25

Bu terimin , yazılımdaki bir dikişi, yazılımın iki bölümünün buluştuğu ve başka bir şeyin enjekte edilebileceği bir yer olarak açıkladığı Michael Feathers'ın Eski Kod ile Etkili Çalışması'ndan kaynaklandığını düşünüyorum . Analoji giyimde bir dikiştir: İki parçanın birbirine dikildiği yer. Her iki taraftaki parça sadece dikişteki diğer sağa temas eder. Yazılıma geri dön: Dikişi belirlerseniz, iyi tanımlanmış bir arayüzün bulunduğu yeri belirlediniz. Böyle bir arabirim, yazılımın geri kalanı söyleyemeden (hile yapmadan, yine de) uygulamayı değiştirmenize izin verdiği için DI'de kaldırabileceğiniz şey budur.


7
c2.com/cgi/wiki?SoftwareSeam - kitabı olmayanlar için referans olarak.
yannis

Şu anda bu kitabı okuyorum!
Malfist

10
+1 FWIW, kavramı bölüm 1.3.1 sayfa 22'de
tanıttım

13

Christian'ın cevabına dayanarak, bilgim dahilinde, dikiş terimi , Eski Kod ile Etkili Çalışma , Tüylerin kitabından kaynaklanmaktadır . Tanım 31. sayfadadır:

Bir dikiş, o yerde düzenleme yapmadan programınızdaki davranışı değiştirebileceğiniz bir yerdir.

Bir dikişin ne olduğuna ve ne olmadığına dair örnekler vermek için aşağıdaki Java kodunu göz önünde bulundurun:

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();
  }
}

Yukarıda örneklenen dikişler, aşağıdakiler olmadıkça dikişler olacaktır:

  1. Enjekte edilen sınıf kesindir.
  2. Çağrılan yöntem kesindir.

Temel olarak, dikişler ünite testini kolaylaştırır. Ben için bir birim test yazamıyor MyClassçünkü aramaların MyStaticClass.staticCall()ve (new MyInstanceClass()).instanceCall(). İçin herhangi bir birim test MyClassbireyin doBunchOfStuff()yönteme testine olurdu MyStaticClass.staticCall()ve (new MyInstanceClass()).instanceCall()ve tüm denilen olsun onların bağımlılıkları. Tersine, final dışı sınıfları final dışı yöntemlerle (veya daha iyisi - arayüzlerle) kullanarak, enjekte edilen örnekleri Foove alay işlemlerini kolaylaştırarak yazma BarFactoryiçin birim testleri yapmak MyClass.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.