2011-12-01 3 views
1

방금 ​​프로젝트 중 하나에서 문제가 발생했습니다. 어쩌면 나는 캡슐화에 대한 잘못된 개념을 가지고 있을지도 모른다. 캡슐화는 getters와 setters 메소드를 정의함으로써 멤버 변수를 클래스에서 보호합니다. 이제는 setter가 무효화되어야한다는 것을 읽고 있었지만,이 경우 함수가 실제로 인수로 전달 된 값을 설정했는지 어떻게 알 수 있습니까? 예를 들어세터 반환 값 정의

void setArea(int a) { 
    if(a>0) 
    Area = a; 
} 

어떻게 확인인가요이

bool setArea(int a) { 
    if(a>0) { 
    Area = a; 
    return true; 
    } 
    return false; 
} 

같은 함수를 정의 좋을 wouldnt가, "A"올바른 값였습니다 인수 확신 할 수 있습니까? 그렇게하면 변화가 실제로 일어 났는지 알 수 있습니다.

답변

1

나는 당신이 찾고있는 것은 잘못된 값이 설정되어있는 경우 예외가 던져 guard clause 생각 :

void setArea(int a) { 
    if (a <= 0) throw new InvalidArgumentException(...); 
    Area = a; 
} 

을하지만 클라이언트 코드를 설정 전에 잘못된 값 을 테스트하려는 경우

bool isAreaValid(int a) { 
    return a > 0; 
} 

void setArea(int a) { 
    if (!isAreaValid(a)) throw new InvalidArgumentException(...); 
    Area = a; 
} 

클라이언트는 다음과 같이 코딩 할 수 있습니다 :

if (obj.isAreaValid(myArea)) { 
    obj.setArea(myArea); 
} 
이있을 수 있습니다

하지만 거기서 멈추지 마십시오. 영역의 개념이 중요한 경우, 자신의 value object으로 존재시켜 봄으로써 디자인을 명확하게 만듭니다.