개폐 원리

9501 단어 csharpbeginners
개방 폐쇄 원칙(또는 줄여서 OCP)은 다음과 같이 말합니다.

Objects or entities should be open for extension but closed for modification.



"Open for Extensions"는 새로운 요구 사항이 생성될 때 기능을 추가하기 위해 코드를 개발해야 함을 의미하고 "Closed for Modifications"는 테스트 및 검증을 거친 코드를 이미 개발했음을 의미합니다. 이는 변경만 가능합니다. 버그가 발견된 경우.

public class Rectangle
{
    public double Height { get; set; }
    public double Width { get; set; }
}



public class AreaCalculator
{
    public double TotalArea(Rectangle[] rectangles)
    {
        double result = 0;
        foreach(Rectangle rectangle in rectangles
            result += rectangle.Height * rectangle.Width;

        return result;
    }
}


그러나 우리 응용 프로그램은 원의 면적을 계산하기 위한 새로운 요구 사항을 받았습니다.

public class Circle
{
    public double Radius { get; set; }
}


이것이 작동하려면 AreaCalculator 클래스도 변경해야 합니다.

public class AreaCalculator
{
  public double TotalArea(object[] shapes)
  {
      double result = 0;

      foreach(object shape in shapes)
      {
          if(shape is Rectangle)
          {
              Rectangle rectangle = (Rectangle)obj;
              result += rectangle.Height * rectangle.Width;
          }
          if(shape is Circle)
          {
              Circle circle = (Circle)obj;
              result += circle.Radius * circle.Radius * Math.PI;
          }
      }
    return result;
  }
}


이러한 수정으로 애플리케이션에 Circle를 추가했습니다.
그러나 Triangle 또는 Square를 추가해야 하는 경우에는 어떻게 합니까? if 메서드에 점점 더 TotalArea 명령문을 추가해야 합니다.
이것이 바로 개방-폐쇄 원칙이 우리의 도움이 되는 곳입니다.
이 예에서 RectangleCircle 는 동일한 추상 개념인 a Shape 에서 파생될 수 있습니다.

public abstract class Shape
{
    public double CalculateArea();
}


이제 "Shapes"에서 Shape 클래스를 사용하겠습니다.

public class Rectangle: Shape
{
    public double Height { get; set; }
    public double Width { get; set; }

    public double CalculateArea()
    {
        return Height * Width;
    }
}

public class Circle: Shape
{
    public double Radius { get; set; }

    public double CalculateArea()
    {
        return Radius * Radius * Math.PI;
    }
}


Shapes가 CalculateArea 클래스에서 Shape를 구현하므로 AreaCalculator 클래스를 업데이트해야 합니다.

public class AreaCalculator
{
  public double TotalArea(Shape[] shapes)
  {
      double result = 0;

      foreach(Shape shape in shapes)
      {
          result += shape.CalculateArea();
      }

    return result;
  }
}


이러한 변경으로 이제 우리는 개방-폐쇄 원칙을 구현하고 있습니다. 우리 응용 프로그램은 확장(예: Triangle 클래스 생성)을 위해 열려 있지만 버그가 발견된 경우에만 수정을 위해 닫힙니다.

좋은 웹페이지 즐겨찾기