Является ли это нарушением принципа единой ответственности? - PullRequest
0 голосов
/ 21 октября 2019

Я читаю Прагматический Программист, выпуск 20th Anniversary Edition, и я думаю о том, нарушает ли этот фрагмент кода Принцип Единой Ответственности:

class Line {

  private double length;
  private Point start;
  private Point end;

  public Line(Point start, Point end) {
    this.start = start;
    this.end = end;
    calculateLength();
  }

  void setStart(Point p) { 
    this.start = p; 
    calculateLength();
  }

  private void calculateLength() {
    this.length = start.distanceTo(end);
  }
}

Подробно, метод setStart() обаустанавливает начальную позицию и рассчитывает обновленную длину. Я думаю, что это нарушение.

1 Ответ

1 голос
/ 21 октября 2019

Я думаю, что звонков на calculateLength следует избегать, прежде чем они понадобятся. Поскольку это закрытый метод, его можно вызывать при необходимости, а не каждый раз, когда изменяется начало / конец. Это относится как к setStart, так и к init методам. Так что ответ да, это нарушение, и не единственное. Пример с одним вызовом длины может вообще не нуждаться в методе вычисления:

class Line {

  private Point start;
  private Point end;

  public Line(Point start, Point end) {
    this.start = start;
    this.end = end;
  }

  void setStart(Point p) { 
    this.start = p; 
  }

  double getLength() {
    return start.distanceTo(end);
  }
}

Потребуются ли для примеров с большим количеством вызовов предварительно вычисленное значение? Если это не называется миллион раз, может быть, нет. Так что атрибут длины тоже не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...