실제 값을 나타내는 상수를 업데이트하는 것이 공개 폐쇄 원칙을 위반합니까?


10

근로자의 연간 순소득을 계산하는 수업이 있습니다. 세금 비율을 나타내는 상수가 있습니다. 그러나 어느 날 세율이 변경되었으므로 코드를 수정해야합니다.

이 상수를 수정하는 행위 는 클래스가 수정을 위해 폐쇄되어야한다고 가정하기 때문에 공개 폐쇄 원칙 위반을 나타 냅 니까?


10
실제 환경이 변하기 때문에 소프트웨어가 변경됩니다. 반면에 세금 비율을 일정하게 유지하는 것은 단지 무지한 일이므로 공개 폐쇄 원칙을 위반하는 것은 아닙니다. 세금 비율은 런타임시 바인딩해야하는 명백한 변경 가능한 항목입니다.
Richard Chambers

4
전 Richard에 동의합니다. 이 "일정한"문제를 해결하기 위해 코드를 변경해야하는 경우 OCP가 가장 적은 문제입니다.
Robert Harvey

3
OCP 위반을 구성하는 것은 매우 주관적 이며 어쨌든 전체가 다소 쓸모가 없습니다 (구현 상속이 더 이상 모범 사례가 아니기 때문에). 질문을하는 사람이 어떻게 생각하는지 추측해야하는 일반적인 질문입니다.
Robert Bräutigam

2
@DocBrown : "새로운 요구 사항"은 무엇입니까? 몇 가지 코드를 보여 주면 OCP가 준수하는 방식에 관계없이 코드를 변경 해야하는 새로운 요구 사항을 지적 할 수 있습니다. 다시 질문으로 돌아가십시오. 개발자가 비즈니스 전문가에게 이에 대해 물었고 2 년에 한 번 이상 세율이 변경 될 것으로 기대하지 않았다면,이를 구성하거나 주입 할 수있는 시점은 없습니다. 간단하게 유지하고 알고 있는 것을 준비하십시오 . 그리고 그런 것들을 위해, 그것을 수업의 외부에 두십시오. 따라서 다릅니다 .
Robert Bräutigam

1
@ RobertBräutigam : 내 요점은 IMOC는 "OCP 준수"와 같은 것은 없으며 "특정 범주의 요구 사항과 관련하여 OCP 준수"만 있다는 것입니다. 컴포넌트가 "OCP 준수"해야하는 범주에는 분명한 주관성이있을 수 있습니다. 그러나이 질문에 설명 된 경우, 내가 이해하는 방식으로 변화하는 요구 사항이 이미 확인 되었으므로이 "소득 계산 클래스"가이 특정 요구 사항과 관련하여 OCP에 분명히 순종하지 않습니다.
Doc Brown

답변:


14

사용자 B, C 및 D의 사용을 위해 어떤 종류의 블랙 박스 라이브러리에서 공급 업체 A가 제공하는 클래스 또는 구성 요소를 생각할 때 OCP를 더 잘 이해할 수 있습니다 (이는 명확성을 위해 사용하는 정신적 모델입니다. 실제로 클래스의 유일한 사용자가 A 자신인지 여부는 중요하지 않습니다.

라이브러리 소스 코드를 수정할 필요없이 B, C 및 D가 제공된 클래스를 다른 사용 사례에 사용하거나 재사용 할 수있는 경우 구성 요소는 OCP를 충족합니다 ( 사용 사례 범주와 관련하여 ). 이것을 달성하는 다른 방법이 있습니다.

  • 클래스를 상속 가능하게 만들기 (일반적으로 템플릿 메소드 패턴 또는 전략 패턴과 함께)

  • 의존성 주입을위한 "주 입점"제공

  • 클래스 또는 구성 요소에 대한 구성 매개 변수를 제공하여 (예 : 생성자 매개 변수 "tax percent"를 사용하거나 다른 구성 메커니즘을 사용하여)

  • 프로그래밍 언어 또는 생태계에 따라 다른 수단

교과서에서 발견되는 전형적인 예는 종종 첫 번째 또는 두 번째 유형입니다 (이 책의 저자의 눈에는 세 번째 유형이 언급하기에 너무 사소하기 때문에).

보시다시피, 이것은 공급 업체 A 가 소스 코드 변경하는 것을 금지하는 것과 아무런 관련이 없습니다 (버그 수정, 최적화 또는 이전 버전과 호환되는 방식으로 새 기능 추가 등). 이는 OCP와 관련이 없습니다. OCP는 A가 lib에서 구성 요소의 인터페이스와 세분성을 설계하는 방법에 관한 것이므로 다른 재사용 시나리오 (세율이 다른 재개와 같은)가 변경 요구 사항을 자동으로 유도하지는 않습니다.

따라서 다른 사람들이 여기에서 말한 내용에도 불구하고 그 대답은 분명히 "예" 입니다. OCP를 위반하는 것입니다.

편집 : 누군가 가이 주제에 대한 자세한 블로그 게시물을 쓴 것 같습니다 . Derek Elkins가 지적한 것처럼 그 일부를 더 잘 표현할 수 있었지만 저자는 일반적으로 "OCP 이행"이 절대적인 속성이 아니라 특정 상황에서만 평가할 수있는 것으로 생각합니다. 요구 사항 변경 범주


좋아, OCP는 다른 사용 사례에 대해 세 가지 방법 중 하나를 사용하여 확장 가능한 동작을 제공하는 것입니다. 그러나 OP의 사례가 근본적인 변화가 임박했음을 암시한다면 어떻게 될까요? 국가 OP의 출처는 모르겠지만 국가의 세율은 자주 바뀌지 않습니다. 그 예는 좋지 않았지만, 의도적으로 꾸준히 추출하여 그 요점을 강조했습니다. 나는 그것이 구성 가능하거나 확장 가능하지 않다고 확신합니다. 아마도 문제는 "이것은 공급 업체 A에 의한 소스 코드의 변경을 금지하는 것과 아무 관련이 없습니다"라는 부분이었습니다.
Vadim Samokhin

적어도 나는 그런 식으로 이해했습니다. 그의 대답을 삭제 한 가난한 사람은 그렇게 생각합니다. 조금 다른 각도에서 보았습니다. 요점을 이해하고 동의합니다. 그러나 가장 현명한 의견은 @Robert Bräutigam에 의해 주어진 것 같습니다. 지금까지 나는 OCP가 주관적이라는 것을 깨닫지 못했습니다.
Vadim Samokhin

1
같은 질문을한다면 답을 구해야 할 질문이 하나 있습니다. 그렇다면 클래스 자체를 직접 수정하는 것보다 OCP를 위반하는 것입니다. 해당 상황에서 OCP 이상이 적용되지 않는 경우
Vadim Samokhin

1
@ Zapadlo : 구성 요소 가 요구 사항 클래스의 OCP 충족시키는 지 여부는 매우 주관적이지 않습니다. 새로운 요구 사항이 구성 요소의 소스 코드를 수정 해야하는지 또는 구성 요소 가이 요구 사항을 지원하는지 여부는 대부분 분명합니다 ". 그것을 구현하는 가능한 접근 방식은 내가 열거 한 첫 3 가지 수단으로 제한되지 않습니다. 편집 내용을 참조하십시오. OCP의 이름이 잘못되어 많은 교과서에서 설명하기가 어려우므로 주관성 개념이 발생할 수 있습니다.
Doc Brown

내 주관성에 대한 개념은 당신이 한 말을 완전히 이해하지 못했기 때문입니다.하지만 지금은 생각합니다. 통찰력있는 의견과 답변에 감사드립니다.
Vadim Samokhin

4

다른 사람들이 말했듯이, 이상적으로 노동자 소득 계급은 상수의 매개 변수화를 허용 하여이 계급을 그 가치와 독립적으로 만듭니다.

궁극적으로 호출 응용 프로그램은 외부 구성 (예 : 파일) 측면에서 매개 변수화를 허용 할 수도 있습니다. 외부 구성을 설정 한 후에는 세율을 변경할 수 있습니다. 시작시 구성 파일을 한 번만 읽은 경우 업데이트 된 세율을 적용하려면 응용 프로그램을 다시 시작해야하므로 고려해야합니다. 마음. 우리는 지시가있을 때 구성을 다시 읽는 응용 프로그램 기능을 제공하거나 구성 파일이 변경 될 때 알 수있는보다 복잡한 메커니즘을 제공 할 수 있습니다 ...

장기적으로 세금 문제는 단지 몇 퍼센트 이상을 요구할 수 있습니다. 예를 들어 언젠가는 세금 법이 더 복잡하고 몇 퍼센트와 일부 상수가 필요합니다 (예 : X %에서 세금이 10 만 달러 미만인 경우). 나머지는 Y %로 과세됩니다.

이것은 기본적으로 전략 패턴 사용을 제안합니다. 여기서 주요 클래스는 세금 계산을위한 전략 객체를 받아들입니다.

구성 파일에서 다양한 전략 (및 % 및 $ 상수)을 선택할 수 있어야합니다. 이제 새로운 전략을 추가하려면 새로운 코드를 추가해야하지만 기존 코드를 반드시 업데이트 할 필요는 없습니다.

각 전략은 실제 세금 계산 방법과 함께 자체 외부 구성 인수를 구문 분석 / 해석하는 방법을 알고 있습니다.

역동적으로 세금은 해당 지역에 따라 달라질 수 있으므로 수입 또는 직원 (또는 둘 다)과 관련된 지역이있을 수 있습니다. 외부 구성에서는 로캘을 세금 전략과 연결할 수 있습니다.


또한 이러한 것들을 명시 적으로 관리하는 의존성 주입을 참조하십시오 .


1
문제는 코드에 세금 비율과 같은 것을 묻는 것이 나쁜 아이디어가 아니라는 것입니다. 문제는 "이것이 OCP를 위반합니까?"였습니다. 그래서 나는 당신의 대답 이이 질문을 어떻게 나타내는 지 알 수 없습니다.
Doc Brown

1

세금 값을 변경하기 위해 클래스를 수정해야하는 경우 실제로 해당 디자인이 OCP를 위반하는 것입니다. 지금까지 설명한 내용에 적합한 디자인은 계산기 클래스가 세금 값을 매개 변수로 사용하는 것입니다.

클래스가 인스턴스화 된 경우 (정적 클래스가 아님) 생성자에 값이 주입되는 세금 변수 클래스 속성을 만들어 클래스 응집력을 향상시킵니다.

요컨대, 현재 디자인은 클래스가 실제로 상수가 아닌 상수 값에 의존하게합니다 (PI의 값과 같이 아무 것도 변하지 않는 값으로 상수 정의). OCP를 위반합니다. 세금 값을 생성자 인수로 받도록 디자인을 변경하십시오.


0

@Becuzz에 전적으로 동의하고 이것을 요약하고 싶습니다. OCP는 클래스에 주입 된 재사용 된 (따라서 유용한) 추상화를 찾는 것입니다. 따라서 클래스의 동작은 코드를 변경하는 것이 아니라 다른 구현을 제공하여 수정됩니다. 이것은 Robert Martin의 저서 " Agile Software Development, Principles, Patterns, and Practices " 에서 명확하게 밝혀졌으며 해당 장의 "개방형 원칙", "추상이 핵심"하위 장을 확인하십시오. 상속을 통해서만 행동을 수정할 수 있다는 또 다른 오해를 분명히한다. 1988 년 Robert Martin이 아니라 " Object Oriented Software Construction " 이라는 책에서 제안한 것은 Bertrand Meyer였습니다 .


-2

내가 보는 방식은 공개 폐쇄 원칙을 위반하는 것이 아닙니다. 그러나 시간에 변화가있는 것 (예 : 세금 비율)이 상수라는 사실은 설계상의 결함입니다. 상수 값을 변경하지 말고 세금 비율을 처리하는 방법을 변경해야합니다. 이것은 전체를 다시 컴파일하지 않고 수정할 수있는 일종의 설정이어야합니다.


"디자인 결함"은 상수를 변경하기 위해 코드를 다시 컴파일해야 할 때 열린 닫힌 원칙을 위반한다는 것입니까?
Erdrik Ironrose
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.