Страницы

Поиск по вопросам

среда, 3 октября 2018 г.

Почему нужно инкапсулировать то, что изменяется?

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


Ответ

Инкапсулировать то, что изменяется, нужно потому что это экономит время и силы на изменения того, что зависит от того, что может быть изменено.
Практический пример
Исходя из того, что под инкапсуляцией изменяемого обычно понимается абстрагирование в смысле скрытия конкретного принципа действия, можно предложить следующий пример.
Вы проектируете объект банковского счета, который сейчас работает с одной базой данных. Если представить что объект счета может работать с совершенной другой базой данных (или даже с текстовыми файлами), то, если вы сразу заложитесь на это при проектировании интерфейса этого объекта, вам не придётся переписывать код, который задействует объект счета.
protected function save() { // сохраним в файл file_put_contents('account.txt', json_encode($this)); }
public function add($amount, $explanation) { $this->balance += $amount; $this->account[] = [$amount, $explanation]; $this->save(); }
public function withdraw($amount, $explanation) { $this->balance -= $amount; $this->account[] = [-$amount, $explanation]; $this->save(); }
/* Пропустим другие методы */ }
Если для изменения баланса счета вызывается метод, в числе параметров содержащий только сумму и обоснование, то пользователю объекта будет совершенно не нужно знать, к какой именно базе данных обращается объект счета чтобы сохранить изменения.
Например, этой функции нет никакой разницы от того, использует ли переданный её счет какую-то базу данных или файлы - вся разница в работе счета инкапсулирована
add($this->totalCharge, $this->getExplanation()); }
/* Пропустим другие методы */ }
Функция addToAccount будет одинаково хорошо работать как с экземпляром класса Account, так и с экземпляром класса DatabaseAccount
account as list ($amount, $explanation)) { $this->database->updateRec($amount, $explanation); } }
/* Пропустим другие методы */ }
Благодаря правильно спроектированному интерфейсу класса Account вы сможете как угодно менять принципы сохранения данных внутри Account без необходимости менять что-то в классах, использующих класс счета.
Зачем ещё это может быть нужно?
Кроме удобства для последующего изменения стоит учитывать и фактор когнитивной нагрузки на программиста. И абстрагирование, и сокрытие информации позволяют её снизить. Например, для использования того же объекта счета программисту не нужно думать ни о БД, ни об ручной обработке исключительных ситуаций. Инкапсуляция делает несущественными конкретные детали, которые программисту не нужно изменять, в идеальном случае полностью избавляя от необходимости думать о них.

Комментариев нет:

Отправить комментарий