소프트웨어 공부/프로그래밍

내부의 것은 너무 노출시키지 말라.

야곰야곰+책벌레 2021. 4. 20. 15:00
728x90
반응형

클래스가 관리하는 내부 테이터에 대한 핸들을 리턴하여 클라이언트가 개체의 상태를 좌우하게끔 만드는 것은 좋지 않다. 다음 코드를 보자.

 

class Socket {
public:
    .................
    int GetHandle() const { return handle_; } // 이렇게 해서는 안된다.
private:
    int handle_;
};

 

데이터를 숨기는 것은 강력한 추상화와 모듈화의 도구이다. 하지만 데이터를 숨겨놓고 그 제어권을 내주는 것은 스스로를 파괴하는 행동이며, 마치 대문을 잠가놓고 열쇠를 꽂아두는 것과 같다. 그 이유는 다음과 같다.

 

  •  클라이언트가 기능을 제어할 두 가지 방법을 가지게 된다
    클래스의 추상체(Socket)를 이용하거나, 클래스가 의존하고 있는 임플리먼테이션을 제어할 수도 있다.두 번째의 경우 개체는 스스로 소유하고 있는 자원의 분명한 변화조차 감지하지 못할 수 있으며,클라이언트로 넘어간 제어권 때문에 클래스가 자신의 기능을 보다 안정적으로 발전(프록싱, 로깅, 상태 수집 등)시키기 힘들어진다.
  •  클래스는 추상체의 근본이 되는 임플리먼테이션을 클라이언트 때문에 변경할 수 없다.
    만약 socket이 이 후에 업데이트되어 다른 프로토콜과 다른 저수준 요소들을 지원하게 되면 이를 사용하는 코드의 올바른 실행이 보장받을 수 없게 된다.
  •  호출 코드에서 클래스의 상태를 수정할 수 있기 때문에 클래스는 자신의 불변성을 유지할 수 없다.
    예를 들어 누군가 socket 멤버 함수를 거치지 않고 socket 개체에 의해 사용되던 핸들을 닫아버렸다면 개체의 작업은 실패하게 된다.
  •  클래스가 리턴한 값을 클라이언트가 저장하고 있다가, 클래스가 그 값과는 관련이 없게 바뀐 다음에 그 값이 사용되는 경우도 생길 수 있다.

 

728x90
반응형