SOLID: Фундаментальные принципы разработки программного обеспечения с использованием PHP (2)

Это продолжение нашей реализации принципов 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();

}

Войти в полноэкранный режим Выйти из полноэкранного режима

Спасибо за прочтение. Вы можете оставить свои комментарии, вопросы или предложения.

Оцените статью
devanswers.ru
Добавить комментарий