Вопрос по проектированию. Почему нужно отделить то, что не будет изменяться, от того, что может изменится, при помощи инкапсуляции?
Ответ
Инкапсулировать то, что изменяется, нужно потому что это экономит время и силы на изменения того, что зависит от того, что может быть изменено.
Практический пример
Исходя из того, что под инкапсуляцией изменяемого обычно понимается абстрагирование в смысле скрытия конкретного принципа действия, можно предложить следующий пример.
Вы проектируете объект банковского счета, который сейчас работает с одной базой данных. Если представить что объект счета может работать с совершенной другой базой данных (или даже с текстовыми файлами), то, если вы сразу заложитесь на это при проектировании интерфейса этого объекта, вам не придётся переписывать код, который задействует объект счета.
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 без необходимости менять что-то в классах, использующих класс счета.
Зачем ещё это может быть нужно?
Кроме удобства для последующего изменения стоит учитывать и фактор когнитивной нагрузки на программиста. И абстрагирование, и сокрытие информации позволяют её снизить. Например, для использования того же объекта счета программисту не нужно думать ни о БД, ни об ручной обработке исключительных ситуаций. Инкапсуляция делает несущественными конкретные детали, которые программисту не нужно изменять, в идеальном случае полностью избавляя от необходимости думать о них.
Комментариев нет:
Отправить комментарий