Говорите, не спрашивайте — это принцип разработки программного обеспечения, согласно которому класс должен выполнить какое-либо действие, а не проверять, можно ли его выполнить. См. пример ниже.

AirplaneState = {
  STOPPED: 1,
  MOVING: 2
}
class MissingTakeOffPermissionException extends Exception { }
class Airplane {
  constructor() {
    hasTakeoffPermission = false;
    state =  AirplaneState.STOPPED;
  }
}
boeing747 = new Airplane();
if (boeing747.hasTakeoffPermission) {
  boeing747.state = AirplaneState.MOVING;
} else {
  throw new MissingTakeOffPermissionException();
}

У нас есть класс Airplane с двумя атрибутами (hasTakeoffPermisison и state). После этого у нас есть экземпляр с именем boeing747. Для изменения состояния самолета существует правило. Во-первых, нам нужно проверить, получил ли самолет разрешение на начало взлета, если да, мы можем обновить его состояние на движение, иначе мы должны вызвать исключение.

Сколько раз нам нужно будет использовать это действие с правилом? Наверное много раз. В результате многие строки кода будут дублироваться. Кроме того, существует еще один принцип под названием Принцип единой ответственности, который, вкратце, говорит нам, что каждый класс или функция должны нести ответственность только за одну уникальную функциональность. Поэтому мы проведем рефакторинг кода, чтобы следовать принципам.

AirplaneState = {
  STOPPED: 1,
  MOVING: 2
}
class MissingTakeOffPermissionException extends Exception { }
class Airplane {
  constructor() {
    hasTakeoffPermission = false;
    state =  AirplaneState.STOPPED;
  }
  takeoff() {
    if (this.hasTakeoffPermission) {
      this.state = AirplaneState.MOVING;
    } else {
      throw new MissingTakeOffPermissionException();
    }
  }
}
boeing747 = new Airplane();
boeing747.takeoff();

Концепция Fail Fast направлена ​​на инициирование сбоя раньше, чем это возможно, прерывая текущую операцию. См. приведенный ниже код рефакторинга, чтобы лучше понять:

AirplaneState = {
  STOPPED: 1,
  MOVING: 2
}
class MissingTakeOffPermissionException extends Exception { }
class Airplane {
  constructor() {
    hasTakeoffPermission = false;
    state =  AirplaneState.STOPPED;
  }
  takeoff() {
    if (!this.hasTakeoffPermission) {
      throw new MissingTakeOffPermissionException();
    }
    this.state = AirplaneState.MOVING;
  }
}
boeing747 = new Airplane();
boeing747.takeoff();

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

Спасибо за прочтение и до скорой встречи!