2008. 8. 19. 00:57

정보 은닉의 가치

전형적인 객체 지향적인 설계는 세계를 객체로 모델링할 수 있는 발견적인 능력을 제공하지만, 객체 지향적인 사고는 여러분이 ID를 int 대신 IdType으로 선언하는 데 도움을 주지 않을 것이다.

객체 지향적인 설계자는

"ID가 객체로 다루어져야 하는가?"

라고 물을 것이다. 프로젝트의 코드 작성 표준에 따라서 "네"라는 답변은 프로그래머가 생성자와 소멸자, 복사 연산자, 할당 연산자를 작성하고 모든 코드에 주석을 작성한 다음, 코드를 구성 제어에 저장해야 한다는 것을 의미한다. 대부분의 프로그래머들은 "아니요,ID를 위해서 완전한 클래스를 생성할 필요는 없습니다. 그냥 int를 사용하겠습니다"라고 결정할 것이다.

방금 무슨 일이 있어났는지 주의 깊게 관찰해 본다.

ID의 게이터 타입을 간단하게 숨길 수 있는 유용한 설계 대안은 고려되지도 않았다.

만약 설계자가

"ID가 감추어져야 할까?"

라고 물었다면, 그는 int 대신 IdType으로 대체하는 간단한 타입을 선언하여 ID의 타입을 숨기기로 결정할 것이다. 이 예제에서 객체 지향적인 설계와 정보 은닉의 차이점은 확실하게 규칙에 충돌하는 것보다 미묘하다. 객체 지향적인 설계도 정보 은닉처럼 이러한 설계 결정을 받아들일 것이다.

이 경우에 차이점은, 정보 은닉에 대한 발견적인 사고가 객체 지향적인 사고가 하지 않는 설계 결정들을 장려한다는 것이다.

"이 클래스에서 무엇을 숨겨야 하는가?"

라고 묻는 것이 인터페이스 설계 문제를 해결하기 위해서 가장 중요하다. 만약 클래스의 비밀을 손상시키지 않고 함수나 데이터를 public 인터페이스에 놓을 수 있다면, 그렇게 하도록 한다. 하지만, 그렇지 않다면 하지 말라.

=> "내가 무엇을 숨겨야 하지?"라고 질문하도록 버릇을 들인다. 그러면 여러분은 얼마나 많은 어려운 설계 문제들이 사라지는지에 놀랄 것이다.

출처 : CODE COMPLETE 2nd Edition -스티브 맥코넬