В родительском классе я должен сделать свойства класса частными, заставляя наследников использовать методы получения / установки? - PullRequest
0 голосов
/ 04 апреля 2019

Например, с таким родителем:

class Music {
  private $timbre;   // This?
  protected $timbre; // Or this?

  public function getTimbre(){
    return $this->timbre;
  }
}

В наследующем дочернем элементе нормально ли с точки зрения ОО получить прямой доступ к переменной-члену или лучше использовать геттеры / сеттеры??

class PostPunk extends Music {
  public function doSomethingTimbreRelated(){
    $punk_timbre = $this->getTimbre(); // This?
    $punk_timbre = $this->timbre;      // Or this?

    // ... do something ...
  }
}

Я читал, что хранить закрытые переменные-члены лучше для инкапсуляции, но действительно ли это имеет значение в иерархии наследования?

И я понимаю, что это очень тривиально, но ячто-то вроде вафли туда-сюда, чтобы сделать это в обе стороны, поэтому я бы хотел остановиться на одном:

1 Ответ

1 голос
/ 05 апреля 2019

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

В небольшом проекте с несколькими разработчиками и простыми классами преимущества этого не очевидны.

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

Если в будущем вам потребуется изменить или добавить некоторую бизнес-логику к значению, возвращенному получателем, вам придется перемонтировать все наследники, чтобы использовать VS получателей, получая прямой доступ к свойствам.

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

Аналогия: вместо того, чтобы дать своему ребенку свободный доступ к вашему кошельку / кошельку, вы заставляете ее просить у вас денег, а затем вы решаете, что и сколько дать ей.

...