“완벽한”단어 이해에 문제


20

Mark Seemann의 "Dependency Injection in .NET"을 읽고 있는데, 필자는 종종 "seam"이라는 단어를 사용합니다. 그러나 나는 그것이 무엇을 의미하는지 이해할 수 없습니다. 이 단어를 사용하는 예는 다음과 같습니다.

7 장에서는 ASP.NET MVC, WPF, WCF 등과 같은 다양한 구체적인 프레임 워크에서 객체를 구성하는 방법에 대해 설명합니다. 모든 프레임 워크가 DI를 똑같이 잘 지원하는 것은 아니며, 심지어는 프레임 워크가 수행하는 방식도 크게 다릅니다. 각 프레임 워크마다 해당 프레임 워크에서 DI를 사용 가능하게하는 SEAM을 식별하기가 어려울 수 있습니다. 그러나 일단 SEAM이 발견되면이 특정 프레임 워크를 사용하는 모든 응용 프로그램에 대한 솔루션을 갖게됩니다. 7 장에서는 가장 일반적인 .NET 응용 프로그램 프레임 워크에 대해이 작업을 수행했습니다. 이를 프레임 워크 SEAMS의 카탈로그로 생각하십시오.

이 단어를 이해하는 데 도움을 주신 것에 대해 감사드립니다.


3
저자의 블로그 에 단어의 의미에 대한 힌트가 있습니다 . 그리고 그가 여기멤버 이기 때문에 : @MarkSeemann 이것은 당신을위한 것입니다 :)
yannis

답변:


25

필자는이 용어 가 레거시 코드효과적으로 작업 하는 마이클 페더스 (Michael Feathers)에서 유래 한 것으로 생각 되는데, 소프트웨어의 이음새가 소프트웨어의 두 부분이 만나고 다른 부분이 주입 될 수있는 곳으로 설명합니다. 비유는 옷의 이음새입니다. 두 부분이 함께 꿰매는 곳입니다. 양쪽의 조각은 솔기에서 다른쪽에 만 닿습니다. 소프트웨어로 돌아 가기 : 이음새를 식별하면 잘 정의 된 인터페이스가있는 장소를 식별 한 것입니다. DI에서 활용할 수있는 것은 그러한 인터페이스를 통해 나머지 소프트웨어가 알 수없는 부정 행위없이 구현을 대체 할 수 있기 때문입니다.


7
c2.com/cgi/wiki?SoftwareSeam- 책이없는 사람들을위한 참고 자료입니다.
yannis

나는 지금 그 책을 읽고 있습니다!
Malfist

10
+1 FWIW, 22 페이지 1.3.1 절의 개념을 소개합니다.
Mark Seemann

13

내가 아는 한, 크리스천의 대답을 바탕으로 솔기라는 용어는 Feathers의 저서 인 레거시 코드로 효과적으로 작업하는 것에서 유래 합니다. 정의는 31 페이지에 있습니다.

이음새는 해당 위치에서 편집하지 않고 프로그램의 동작을 변경할 수있는 장소입니다.

이음새가 무엇인지 아닌지에 대한 예를 제공하려면 다음 Java 코드를 고려하십시오.

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()MyClassdoBunchOfStuff()MyStaticClass.staticCall()(new MyInstanceClass()).instanceCall()FooBarFactoryMyClass

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.