Problema al entender la palabra "costura"

14

Estoy leyendo "Dependency Injection in .NET" de Mark Seemann (es fantástico, y debo tenerlo) y el autor a menudo usa la palabra "seam". Pero no puedo entender lo que significa. Aquí hay un ejemplo del uso de esta palabra:

  

El Capítulo 7 explica cómo componer objetos en varios marcos concretos       como ASP.NET MVC, WPF, WCF, etc. No todos los frameworks soportan DI       igualmente bien, e incluso entre los que lo hacen, las formas en que lo hacen difieren mucho. por       En cada marco, puede ser difícil identificar el SEAM que permite DI en ese       marco de referencia. Sin embargo, una vez que se encuentra SEAM, tiene una solución para todas las aplicaciones       que utilizan este marco particular. En el capítulo 7, he hecho este trabajo.       Para los frameworks de aplicaciones .NET más comunes. Piense en ello como un catálogo de       Marco SEAMS.

Le agradecería que me ayudara a entender esta palabra.

    
pregunta user278618 30.01.2012 - 21:03

2 respuestas

18

Creo que el término se origina en Michael Feathers Trabajo efectivo con el código heredado en lo que explica una costura en el software como un lugar donde se encuentran dos partes del software y donde se puede inyectar otra cosa. La analogía es una costura en la ropa: el lugar donde se unen dos partes. La pieza en cada lado solo toca la otra derecha en la costura. Volver al software: si identifica la costura, ha identificado el lugar donde hay una interfaz bien definida. Eso es lo que puede aprovechar en DI, ya que dicha interfaz le permite reemplazar la implementación sin que el resto del software sea capaz de decirlo (sin trampas, de todos modos).

    
respondido por el Christian Horsdal 30.01.2012 - 21:12
11

Basándome en la respuesta de Christian, a mi entender, el término costura se origina en el libro de Feathers, Working Effectively with Código heredado . La definición está en la página 31:

  

Una costura es un lugar donde puedes alterar el comportamiento de tu programa sin editar en ese lugar.

Para dar ejemplos de qué es una costura y qué no, considere el siguiente código 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();
  }
}

Las costuras ejemplificadas anteriormente serían costuras a menos que:

  1. La clase que se inyecta es definitiva.
  2. El método que se llama es final.

Básicamente, las costuras facilitan las pruebas unitarias. No puedo escribir una prueba de unidad para MyClass debido a las llamadas a MyStaticClass.staticCall() y (new MyInstanceClass()).instanceCall() . Cualquier prueba de unidad para el método MyClass ' doBunchOfStuff() tendría que probar MyStaticClass.staticCall() y (new MyInstanceClass()).instanceCall() y todas de sus dependencias a las que se llama. A la inversa, al utilizar clases no finales con métodos no finales (o, mejor aún, interfaces), las instancias inyectadas de Foo y BarFactory hacen que sea posible escribir pruebas de MyClass facilitando la burla.

    
respondido por el entpnerd 25.02.2016 - 21:14

Lea otras preguntas en las etiquetas