Проблема з розумінням слова «шов»


20

Я читаю "Ін'єкцію залежності в .NET" від Марка Семана (це фантастично і повинно бути), і автор часто використовує слово "шов". Але я не можу зрозуміти, що це означає. Ось приклад використання цього слова:

Глава 7 пояснює, як складати об'єкти в різних конкретних рамках, таких як ASP.NET MVC, WPF, WCF тощо. Не всі рамки підтримують DI однаково добре, і навіть серед тих, хто це робить, способи, які вони роблять, сильно відрізняються. Для кожної основи може бути важко визначити SEAM, який дозволяє DI в цьому рамках. Однак, як тільки буде знайдено SEAM, ви маєте рішення для всіх програм, які використовують цей конкретний фреймворк. У главі 7 я виконав цю роботу для найбільш поширених рамок додатків .NET. Розгляньте це як каталог каркасів SEAMS.

Я був би вдячний за допомогу мені з розумінням цього слова.


3
У блозі автора є підказки, що означає це слово . А оскільки він є учасником тут : @MarkSeemann, це для вас :)
yannis

Відповіді:


25

Я думаю, що цей термін походить від Майкла Пір'єса, що працює ефективно зі спадковим кодексом, в якому він пояснює шов у програмному забезпеченні як місце, де зустрічаються дві частини програмного забезпечення та де щось інше можна вводити. Аналогія - шов в одязі: Місце, де дві деталі зшиті. Шматок з кожної сторони торкається лише іншого правого шва. Повернення до програмного забезпечення: Якщо ви визначите шов, ви визначили місце, де є чітко визначений інтерфейс. Це те, на що ви можете скористатися в DI, оскільки такий інтерфейс дозволяє замінити реалізацію, не маючи можливості решти програмного забезпечення (без будь-якого обману).


7
c2.com/cgi/wiki?SoftwareSeam - як орієнтир для тих, хто не має книги.
янніс

Я читаю цю книгу прямо зараз!
Мальфіст

10
+1 FWIW, я ввожу це поняття в розділі 1.3.1 на сторінці 22.
Марк Семанн

13

Спираючись на відповідь Крістіана, наскільки мені відомо, термін "шов" походить з книги "Пір'я", що працює ефективно з кодексом спадщини . Визначення знаходиться на сторінці 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(). Будь тестовий модуль для MyClass«S doBunchOfStuff()метод мав би тест MyStaticClass.staticCall()і (new MyInstanceClass()).instanceCall()і все їх залежностей , які викликаються. І навпаки, використовуючи нефінальні класи з нефінальними методами (а ще краще - інтерфейсами), введені екземпляри Fooта BarFactoryроблять одиничні тести для MyClassможливості запису, полегшуючи глузування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.