Это продолжение нашей реализации принципов SOLID с помощью PHP. Я рекомендую вам просмотреть первую часть, где мы реализовали первый принцип, Принцип Единой Ответственности.
В этом эпизоде мы реализуем второй принцип, Принцип Открытости и Закрытости. В конце всей серии мы напишем реальное приложение на чистом языке. Пожалуйста, дочитайте серию до конца, задавайте вопросы, если какая-то часть нуждается в пояснении. Также не забудьте поделиться. Спасибо.
SOLID означает:
S — Single-Responsibility Principle (принцип единой ответственности)
O — принцип открытости-закрытости
L — Принцип замещения Лискова
I — Принцип разделения интерфейсов
D — Принцип инверсии зависимостей
Принцип открытости-закрытости гласит, что объекты или сущности должны быть открыты для расширения, но закрыты для модификации.
В первой части мы создали приложение, которое собирает фигуры, вычисляет их площади и возвращает их сумму. Если предположить, что у нас есть другие фигуры, нам придется модифицировать класс areasumcalculator, что противоречит принципу.
Наша цель состоит в том, чтобы гарантировать, что класс или объект можно расширить, но нельзя модифицировать.
Для этого мы создаем интерфейс, которому должны следовать все фигуры.
`интерфейс ShapeArea{
public function area();
}`
« // исключение, на случай, если будет предоставлена форма, не реализующая наш интерфейс.
class InvalideShapeException extends Exception
{
public $message;
function __construct($mess = ‘Invalid shape’)
{
$this->message = $mess;
//return ‘This shape is invalid’;
}
public function getMyMessage()
{
return $this->message;
}
}`
Мы создадим классы формы, которые будут реализовывать интерфейс
class Square implements ShapeArea
{
public $length;
function __construct($length)
{
$this->length = $length;
}
public function area()
{
$area = $this->length * $this->length;
return $area;
}
}
class Circle implements ShapeArea{
public $radius;
function __construct($radius)
{
$this->radius = $radius;
}
public function area()
{
$area = pi() * ($this->radius * $this->radius);
return $area;
}
}
Чтобы проверить наше исключение, создадим еще одну форму, которая не реализует shapesurface
class Triangle{
public $breadth;
public $height;
function __construct($breadth,$height)
{
$this->breadth = $breadth;
$this->height = $height;
}
public function myArea()
{
$area = 1/2 * ($this->breadth * $this->height);
return $area;
}
}
Теперь вернемся к нашему классу areasumcalculator
class AreaSumCalculator{
protected $shapes;
public function __construct($shapes = [])
{
$this->shapes = $shapes;
}
public function sum()
{
$area = [];
foreach($this->shapes as $shape)
{
if(is_a($shape, 'ShapeArea'))
{
$area[] = $shape->area();
}
else{
throw new InvalideShapeException;
}
}
return array_sum($area);
}
}
Затем в класс для вывода вычисленной суммы
class AreaSumCalculatorOutput{
public $areasumcalculator;
public function __construct(AreaSumCalculator $areasumcalculator)
{
$this->areasumcalculator = $areasumcalculator;
}
public function jsonOutput()
{
$data = [
'sum' => $this->areasumcalculator->sum(),
];
return json_encode($data);
}
}
Позволяет создавать фигуры или объекты (экземпляры классов)
$circle = new Circle(10);
$square = new Square(5);
$triangle1 = new Triangle(10,23);
$triangle = new Triangle(1,23);
Создайте переменную shape, которая будет принимать массив площадей фигур (созданный объект).
$shapes1 = [$circle, $square];
$shapes2 = [$triangle1, $triangle];
Проверим наши первые фигуры (круг и квадрат), они реализуют интерфейс.
/ calculate the sum of the areas of the shapes
try{
$area_sum_calculator = new AreaSumCalculator($shapes1);
// answer :
/* {
"sum": 339.1592653589793
}
*/
// output the sum
$area_sum_output = new AreaSumCalculatorOutput($area_sum_calculator);
// call the output
$json_output = $area_sum_output->jsonOutput();
echo $json_output .'<br>';
}catch(InvalideShapeException $e)
{
echo "Caught my exception: n ";
echo $e->getMyMessage();
}
Протестируем вторую фигуру
try{
$area_sum_calculator = new AreaSumCalculator($shapes2);
// answer :
// Caught my exception Invalid shape
// output the sum
$area_sum_output = new AreaSumCalculatorOutput($area_sum_calculator);
// call the output
$json_output = $area_sum_output->jsonOutput();
//echo $json_output;
}catch(InvalideShapeException $e)
{
echo "Caught my exceptionn";
echo $e->getMyMessage();
}
Спасибо за прочтение. Вы можете оставить свои комментарии, вопросы или предложения.