2016-09-21 5 views
0

다음 코드가 올바른지 확인해주십시오. 사실은 내가 유도 코드에서 비슷한 것을 발견했고, 그것이 Open/Closed 원리와 일치하는지 의심 스럽다.개방/폐쇄 원칙 및 캡슐화 위반

public abstract class CustomClass { 

    private ClassThatSetEnvironmentProperty sysProp = new ClassThatSetEnvironmentProperty("SYS_PROPETY", "SYS_PROPERTY_VALUE"); 

    // some code here 

    void setSysProp(ClassThatSetEnvironmentProperty sysProp) { 
     this.sysProp = sysProp; 
    } 
} 

내 이해 세터 만 (ClassThatSetEnvironmentProperty를 모방) 단위 테스트 가능성에 대해 정의된다. 그러나이 경우 setter는 구체적인 상속자가 정의 된 상태를 변경할 수있게합니다. 내 관점에서 보면 캡슐화에 위배됩니다. 내가 생각하기에 그것은 또한 공개/공개 된 prinicple을 위반하는 것이라고 생각합니다. 솔직히, 내 동료 중 일부는 반대 의견을 가지고 있습니다. 나는 정말로 많은 경험을하지 않았기 때문에 그것을 인식하는 것이 어렵다. 여기에 의견을 말하십시오. 고맙습니다.

+0

나는 setter 주입에 비해 생성자 주입을 선호합니다. – duffymo

+0

당신이 옳았고 전적으로 당신과 동의합니다. 그러나 현재의 사건은 어떻습니까? – aime

+1

열기/닫기 원칙의 정의는 소스 코드를 수정하지 않고 클래스의 동작을 변경할 수 있어야한다고 명시합니다. 이 경우 나는 그것이 원칙을 전혀 위반하지 않는다고 생각합니다. 소스 코드는 동일하게 유지되지만 'sysProp'은 변경됩니다. – christopher

답변

5

이것은 Open Closed Principle과 직접적인 관련이 없으며, Open Closed Principle은 시스템에 새로운 동작을 추가한다는 것을 의미하기 때문에 기존의 클래스를 변경하는 대신 새 구현 클래스를 만들어야합니다. 그것을 위해 추상 클래스를 사용하는 것이 좋습니다.

다른 원칙 인 캡슐화를 위반하는 한 가지는 패키지 액세스 가능 종속성 설정 프로그램입니다. 해당 설정을 보호 된 설정자로 변경하여 해당 문제를 해결할 수 있습니다. 확장 클래스는 자체적으로 설정할 수 있지만 외부 호출자는 객체의 상태를 변경할 수 없습니다.

protected final void setSysProp(ClassThatSetEnvironmentProperty sysProp) { 
    this.sysProp = sysProp; 
} 
+0

동의합니다. 고맙습니다. – aime

+0

보호 된 패키지는 개인 (기본값) 패키지보다 제한적입니다. –

+0

@ OleV.V. 그것들은 다르게 제한적입니다. Protected는 모든 확장 클래스가 해당 클래스에 액세스 할 수있게합니다. 공유 API의 경우 중요한 요구 사항입니다. –