2010-05-25 4 views
5

다음은 클래스의 속성 사용과 관련된 질문입니다.속성 및 캡슐화

저는 멤버 변수를 공개적으로 노출하는 대신 public 속성을 사용하고 있습니다. 대다수는이 접근법이 캡슐화에 도움이된다고 조언합니다. 그러나, 나는 캡슐화 이점을 그것을 속성으로 만듦으로써 이해하지 못한다.

많은 사람들이 속성을 사용하는 실제 이유를 알지 못합니다. 그들은 단지 코딩 표준의 일부로 그것을합니다.

공개 속성 변수보다 속성이 더 좋은 방법과 캡슐화가 어떻게 개선되는지 명확하게 설명 할 수 있습니까?

답변

6

캡슐화는 호출 클래스를 단절하여 변경으로부터 보호합니다.

자동차 엔진을 모델링하는 간단한 클래스가 있다고 가정 해 봅시다 (모든 OO 예제에는 자동차 유추가 포함되어야합니다 :)). 이 같은 간단한 필드가있을 수 있습니다 :

private bool engineRunning; 

단순히이 필드를 공개하거나 다른 것으로 나타나지 않는 IsEngineRunning() 게터을 제공한다. 당신이 가서이를 변경해야 이전 engineRunning 필드를 액세스하는 많은 클래스가있는 경우 지금

private bool ignitionOn; 
private bool starterWasActivated; 

:

이제 해당 필드를 제거하고 그것을 대체 할, 당신은 당신의 클래스가 더 정교하게 가정 모두 (나쁜시기).

당신이 시작했던 대신하는 경우 :

public bool IsEngineRunning() 
{ 
    return this.engineRunning; 
} 

당신은 지금은 변경할 수 :

public bool IsEngineRunning() 
{ 
    return ignitionOn && starterWasActivated; 
} 

및 클래스의 인터페이스는 동일 (좋은 시간을) 남아있다.

+0

합니다. 이전과 같은 방식으로 동일한 의미로 engineRunning 속성을 노출해야 함을 의미합니다. 유일한 차이점은 점화 및 스타터 속성을 업데이트 할 때마다 engineRunning 속성도 업데이트해야한다는 것입니다. 읽기/업데이트 빈도에 따라 성능에 긍정적 또는 부정적 영향을 미칠 수 있습니다. –

1

어떤 생각 :

  • 당신은 호출 클래스에 영향을주지 않고 데이터의 내부 표현을 변경할 수 있습니다.

    예. 코드가 (즉, 코드가 제 3 자입니다) 다른 사람에 의해 사용하는 경우

    public boolean isActive() { 
        return this.is_active && this.approved && this.beforeDeadline; 
    } 
    

    public boolean isActive() { 
        return this.is_active; 
    } 
    

    (후) (전)이 특히 중요합니다. 어느 정도 인터페이스/API는 안정적이어야합니다. 작은 변화는 그것을 사용하는 다른 코드의 코드에 영향을주지 않습니다.

  • 더 복잡한 작업을 수행 할 수 있습니다. 변수 is_active을 고려하십시오. 어쩌면이 변수의 값을 변경하면 객체의 다른 속성에도 영향을 줄 수 있습니다. 메소드에 액세스를 캡슐화하면이 메소드 내에서 액세스를 처리 할 수 ​​있으며 호출자는 신경 쓸 필요가 없습니다.

    예.

    public void setActive(boolean active) { 
        this.is_active = active; 
        this.startTimeout(); 
        this.updateOtherInformation(); 
    } 
    

    따라서 일련의 작업이 시행됩니다. 은 호출자가이 작업을 올바르게 실행한다는 사실에 의존하지 않습니다. 개체는 항상 올바른 상태가됩니다.

2

나는 그것을 짧게 만들 것이다. 속성 = 유연성

속성은 항상 클래스에 보관하고 싶지 않거나 기존 멤버의 집계/기능 인 멤버를 만드는 데 유용합니다.

예 : 나이가 출력 생년월일을 기반으로 할 수 있습니다, canSwim이 hasLimbs & &에서 생성 할 수 있습니다 예기치 않은 변화를 처리 할 때 도움이 될 수있는 속성으로

2 노출 회원 수레 [한 사람은 이제까지 모든 클라이언트의 요청을 예측?]은있는 시스템에 기존 데이터베이스.

예 : isAllowed는 사용자가 18 세 이상이고 성능을 위해 캐시 된 경우 true입니다. 클라이언트가 미국에서 서비스를 실행하려고하고 false가 채워지고 캐시가 참인 경우에만 false를 반환 할 수 있습니다.

4

모든 종류의 작업을 수행 할 수 있으므로 멤버 변수 대신 속성을 노출하는 것이 좋습니다. 멤버 변수의 값을 설정하거나 가져올 때 검사합니다.

유 멤버 변수가 있다고 가정

private int id; 

을 당신은 공공 재산이 :이 변화는 클라이언트가 변경되어야 함을 의미하지는 않는다는 것을 지적하고 싶습니다

public int ID 
{ 
    get 
    { 
     // do something before returning 
    } 
    set 
    { 
     // do some checking here may be limits or other kind of checking 
    } 
}