Pull to refresh

Tell-Don’t-Ask

Reading time2 min
Views17K
Original author: Martin Fowler
Tell-Don’t-Ask является принципом, который помогает вспомнить, что объектно-ориентированное программирование предназначено для связки данных и функций для их обработки. Он напоминает нам, что вместо того, чтобы спрашивать данные у объекта, мы должны сказать объекту что с ними делать. Для этого все поведение объекта надо заключить в его методы.
image

Разберемся на примере. Давайте представим, что нам нужно контролировать сигнализацию, которая сработает, если число поднимется выше определенной планки. Если мы напишем это в стиле «ask», мы получим структуру данных…
class AskMonitor...
  private int value;
  private int limit;
  private boolean isTooHigh;
  private String name;
  private Alarm alarm;

  public AskMonitor (String name, int limit, Alarm alarm) {
    this.name = name;
    this.limit = limit;
    this.alarm = alarm;
  }

… затем совместим это с методами доступа к данным:
class AskMonitor...
  public int getValue() {return value;}
  public void setValue(int arg) {value = arg;}
  public int getLimit() {return limit;}
  public String getName()  {return name;}
  public Alarm getAlarm() {return alarm;}

И использовали бы это так:
    AskMonitor am = new AskMonitor("Time Vortex Hocus", 2, alarm);
    am.setValue(3);
    if (am.getValue() > am.getLimit()) 
      am.getAlarm().warn(am.getName() + " too high");

«Tell-Don’t-Ask» напоминает нам, что поведение следует описать внутри объекта(используя те же поля):
class TellMonitor...
  public void setValue(int arg) {
    value = arg;
    if (value > limit) alarm.warn(name + " too high");
  }

И это будет работать так:
    TellMonitor tm = new TellMonitor("Time Vortex Hocus", 2, alarm);
    tm.setValue(3);

Многие люди находят принцип «Tell-Don’t-Ask» полезным. Одним из фундаментальных принципов объекто-ориентированного дизайна является совмещение данных и поведения, поэтому простые элементы системы (объекты) совмещают это в себе. Часто это хорошо, потому что данные и их обработка тесно связанны: изменения в одном вызывают изменения в других. Вещи, которые тесно связанны должны быть одним компонентом. Помнить об этом принципе поможет программистам увидеть, как можно совмещать данные и поведение.

Но лично я не использую этот принцип. Я просто стараюсь размещать в одном месте данные и поведение, что часто ведет к тем же результатам. Одна из проблем — этот принцип стимулирует людей убирать методы запрашивающие информацию. Но бывает, когда объекты эффективно сотрудничают предоставляя информацию. Хорошим примером будут объекты, упрощающие информацию для других объектов. Я видел код, который на столько закручен, что подходящие запрашивающие методы решили бы эту проблему. Для меня «Tell-Don't-Ask» шаг к объединению поведения и данных, но это не первоочередная задача.

Прим. переводчика: я сомневаюсь в необходимости перевода названия принципа, но как один из вариантов предлагаю — «проси, а не спрашивай»
Only registered users can participate in poll. Log in, please.
Придерживаетесь ли вы принципа «Tell Don't Ask»?
34.01% Да84
18.62% Нет46
21.05% Придерживаюсь позиции Мартина Фаулера52
23.48% Так и не понял смысл принципа58
2.83% Свое, в комментариях7
247 users voted. 110 users abstained.
Tags:
Hubs:
Total votes 11: ↑8 and ↓3+5
Comments11

Articles