Поиск…


замечания

цели

Основная цель Свободного интерфейса - повышенная читаемость.

При использовании для построения объектов выбор, доступный для вызывающего, может быть четко и принудительно осуществлен с помощью проверок времени компиляции. Например, рассмотрим следующее дерево опций, представляющее шаги по пути для создания некоторого сложного объекта:

A -> B 
  -> C -> D -> Done
       -> E -> Done
       -> F -> Done.
       -> G -> H -> I -> Done.

Строитель, используя свободный интерфейс, позволит вызывающему пользователю легко увидеть, какие опции доступны на каждом этапе. Например, A -> B возможен, но A -> C не является и приведет к ошибке времени компиляции.

Истина - Свободное тестирование

Из раздела «Как использовать правду» http://google.github.io/truth/

String string = "awesome";
assertThat(string).startsWith("awe");
assertWithMessage("Without me, it's just aweso").that(string).contains("me");

Iterable<Color> googleColors = googleLogo.getColors();
assertThat(googleColors)
    .containsExactly(BLUE, RED, YELLOW, BLUE, GREEN, RED)
    .inOrder();

Свободный стиль программирования

В беглом стиле программирования вы возвращаете this из беглого (сеттера) методов, которые ничего не вернут в ненадежном стиле программирования.

Это позволяет вам связывать различные вызовы методов, которые делают ваш код короче и легче обрабатывать для разработчиков.

Рассмотрим этот непрозрачный код:

public class Person {
  private  String firstName;
  private String lastName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public String whoAreYou() {
    return "I am " + firstName + " " + lastName;
  }

  public static void main(String[] args) {
    Person person = new Person();
    person.setFirstName("John");
    person.setLastName("Doe");
    System.out.println(person.whoAreYou());
  }
}

Поскольку методы setter ничего не возвращают, нам нужно 4 инструкции в main методе, чтобы создать экземпляр Person с некоторыми данными и распечатать его. С быстрым стилем этот код можно изменить на:

public class Person {
  private  String firstName;
  private String lastName;

  public String getFirstName() {
    return firstName;
  }

  public Person withFirstName(String firstName) {
    this.firstName = firstName;
    return this;
  }

  public String getLastName() {
    return lastName;
  }

  public Person withLastName(String lastName) {
    this.lastName = lastName;
    return this;
  }

  public String whoAreYou() {
    return "I am " + firstName + " " + lastName;
  }

  public static void main(String[] args) {
    System.out.println(new Person().withFirstName("John")
      .withLastName("Doe").whoAreYou());
  }
}

Идея состоит в том, чтобы всегда возвращать некоторый объект, чтобы создать построение цепочки вызовов метода и использовать имена методов, которые отражают естественную речь. Этот свободный стиль делает код более удобочитаемым.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow