SOLID: PHP를 사용한 소프트웨어 개발의 기본 원칙(2)

4517 단어
이것은 PHP를 사용한 SOLID 원칙 구현의 연속입니다. 첫 번째 원칙인 .

이 에피소드에서는 두 번째 원칙인 개방 및 폐쇄 원칙을 구현합니다. 전체 시리즈의 마지막에는 clean으로 실제 애플리케이션을 작성할 것입니다. 끝까지 읽어주시고 명확성이 필요한 부분이 있으면 질문을 남겨주세요. 또한 공유하는 것을 잊지 마십시오. 고맙습니다.

SOLID는 다음을 의미합니다.

S — 단일 책임 원칙

O — 개방-폐쇄 원칙

L — Liskov 대체 원리

I — 인터페이스 분리 원리

D — 종속성 역전 원칙

Open-Closed 원칙은 개체 또는 엔터티가 확장에는 열려 있지만 수정에는 닫혀 있어야 한다고 말합니다.

첫 번째 부분에서는 도형을 수집하고 면적을 계산한 다음 합계를 반환하는 앱을 만들었습니다. 다른 모양이 있다고 가정하면 원칙에 위배되는 areasumcalculator 클래스를 수정해야 합니다.

여기서 우리의 목표는 클래스나 엔터티가 확장될 수 있지만 수정되지 않도록 하는 것입니다.

이를 달성하기 위해 모든 도형이 따라야 하는 인터페이스를 만듭니다.

` 인터페이스 ShapeArea{
공용 기능 영역();

}`

`//예외, 우리의 인터페이스를 구현하지 않는 모양이 제공되는 경우.
InvalideShapeException 클래스는 예외를 확장합니다.
{
공개 $메시지;

함수 __construct($mess = '잘못된 모양')
{
$this->message = $mess;
//'이 모양은 유효하지 않습니다'를 반환합니다.
}

공개 함수 getMyMessage()
{
$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);


셰이프 영역의 배열을 허용하는 셰이프 변수 만들기(객체가 생성됨)
$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 exception\n";
  echo $e->getMyMessage();

}



읽어 주셔서 감사합니다. 의견, 질문 또는 제안을 삭제할 수 있습니다.

좋은 웹페이지 즐겨찾기