В своей первой статье на Medium я решил начать с одного из классиков дизайна программного обеспечения: универсального принципа доступа Бертрана Мейера. Эта фундаментальная концепция, изложенная в книге«Object-Oriented Software Construction» (1997), имеет решающее значение для современной разработки программного обеспечения и повлияла на целое поколение разработчиков. Ниже мы проанализируем важность принципа единого доступа и то, как его можно применять для создания простого в обслуживании программного обеспечения.
Бертран Мейер: пионер в разработке программного обеспечения
Бертран Мейер — влиятельный исследователь, писатель и консультант в области компьютерных языков, создатель языка программирования Eiffel. Его работа сыграла важную роль в создании основ современного дизайна программного обеспечения и повлияла на целое поколение разработчиков.
Единый принцип доступа Мейера
Принцип гласит, что свойства и операции объекта должны быть доступны единообразно, без раскрытия того, являются ли они сохраненными атрибутами или результатами операций. Это позволяет клиентам объекта сосредоточиться на его функциональности и поведении, а не беспокоиться о его реализации.
Пример, нарушающий принцип
Чтобы лучше понять этот принцип, полезно увидеть пример, который ему не соответствует. Рассмотрим класс Square, представляющий квадрат на двумерной плоскости. Этот класс имеет общедоступное свойство $sideLength
и два общедоступных метода getArea()
и getPerimeter()
, которые вычисляют площадь и периметр квадрата соответственно.
class Square { public $sideLength; public function __construct($sideLength) { $this->sideLength = $sideLength; } public function getArea() { return pow($this->sideLength, 2); } public function getPerimeter() { return 4 * $this->sideLength; } }
В этом примере показано, как можно получить прямой доступ к свойству $sideLength
, что нарушает унифицированный принцип доступа и предоставляет доступ к внутренней реализации класса внешнему коду. Это может вызвать проблемы с ремонтопригодностью и гибкостью.
Практический пример на PHP
Чтобы решить эту проблему, можно применить этот принцип, используя методы получения и установки для унифицированного взаимодействия с атрибутами и операциями объекта. Например, вот новая версия класса Square, соответствующая принципу:
class Square { private $sideLength; public function __construct($sideLength) { $this->sideLength = $sideLength; } public function getSideLength() { return $this->sideLength; } public function getPerimeter() { return 4 * $this->getSideLength(); } public function getArea() { return pow($this->getSideLength(), 2); } }
В этом примере метод getSideLength
был создан для свойства $sideLength
. Это гарантирует, что изменения во внутренней реализации класса не повлияют на внешних пользователей.
Чтобы продемонстрировать гибкость этого принципа, мы можем изменить класс Square, чтобы он хранил периметр вместо длины стороны:
class Square { private $perimeter; public function __construct($sideLength) { $this->perimeter = $sideLength * 4; } public function getSideLength() { return $this->getPerimeter() / 4; } public function getPerimeter() { return $this->perimeter; } public function getArea() { return pow($this->getSideLength(), 2); } }
В этой версии класса Square
свойство, в котором хранится информация, заменено местами. Теперь периметр сохраняется вместо длины стороны, а метод getter
был изменен, чтобы возвращать правильное значение. Несмотря на эти внутренние изменения в реализации класса, клиенты могут продолжать единообразно взаимодействовать с классом с помощью методов getter
и setter
, не зная о внутренних изменениях. Это демонстрирует гибкость и простоту обслуживания, которые обеспечивает этот принцип.
Риски неправильного использования геттеров и сеттеров
Важно помнить, что чрезмерное использование getters
может привести к проблемам проектирования программного обеспечения и нарушить принцип инкапсуляции. Поэтому важно следовать принципу "говорить, а не спрашивать" при разработке классов и объектов, чтобы предоставлять методы, которые выполняют желаемую задачу, а не обращаются к внутренней части объекта. информация.
В следующей статье я подробно расскажу о принципе "говори, не спрашивай" и о рисках неправильного использования getters
.
Заключение
Унифицированный принцип доступа — это фундаментальная концепция проектирования программного обеспечения, которая сыграла ключевую роль в разработке программного обеспечения. Применяя этот принцип, можно создать более эффективное, простое в обслуживании и гибкое программное обеспечение.
В будущих статьях я продолжу делиться информацией и знаниями о классических концепциях проектирования программного обеспечения, которые могут быть полезными и интересными.