4장은 1~3장과 달리 데이터 중심으로 프로그램을 설계했을 때 나타나는 문제점들에 대해 생각해보며 데이터 중심이 아닌 역할 및 협력을 중심으로하는 사고의 효용을 드러낸다. 데이터 중심 설계의 단점은 어떤 것이 있을까? 데이터 중심 설계는 기존의 절차형 프로그래밍에서 자주 사용하던 방식으로 클래스 및 객체는 단순히 데이터를 저장하는 용도로 사용되고 프로세스에서 이러한 데이터의 값을 제어하는 방식을 취한다. 1장에서 리팩토링 하기 전의 상태가 데이터 중심설계와 비슷하다고 할 수 있다. 이러한 설계에서 객체는 단순히 데이터를 전달하는 역할만을 하기 때문에 객체 내부의 상태와 행위에 대해서 (행위가 존재하지 않을 지도 모른다) 외부로 가능한 많이 노출하고자 한다. 이렇게 설계된 프로그램의 단점은 아래와 같다.
위의 단점은 모두 객체의 캡슐화를 위반하면서 동시적으로 발생하는 문제점이다. 캡슐화를 통해 객체는 변경될 수 있는 부분은 내부로 감추고 변경되지 않을 것 같은 부분만을 공용 인터페이스로 노출하는데 캡슐화를 위반하는 경우 변경사항에 대해서 데이터를 담당하는 그 객체와 객체를 이용하고 있는 프로세스 모두에서 수정을 필요로 하기 때문이다. 물론 이러한 캡슐화를 일부 수정하여 변경할 수 있다. 하지만 이 경우에도 데이터 중심 설계는 객체의 역할에 초점을 두는 것이 아니라 상태에 초점을 맞추고 있기 때문에 지정된 상태에 국한된 즉 역할에 충실하기 위한 객체가 아니라 상태가 처리할 수 있는 부분에 초점을 맞춰 개발할 수 밖에 없다.
객체를 하나의 데이터로 간주하고 가져야할 상태와 데이터만을 명시한다. 이 후 외부에서 값을 가져갈 수 있도록 데이터에 대해서 전부 외부 인터페이스로 노출하고 심지어는 더 많은 것을 외부로 노출하고자 한다 왜냐하면 단순히 데이터로써의 역할만을 담당하는 부분이기때문에 사용할 수 있는 범위를 늘리기 위해서.
캡슐화란 결국 각 객체가 자신이 가지고 있는 상태와 구현을 숨기고 외부에 특정 인터페이스만을 노출함으로써 불완전한 부분을 객체가 담당하는 것이다. 캡슐화를 하게 되면 자연스럽게 응집성은 높아지고 결합도는 낮아지는데 이유는 객체가 가지고 있는 행동과 상태에 집중하여 내부구현을 담당하게 되고 외부에서는 객체가 외부적으로 보여주는 인터페이스만을 사용할 수 있기 때문에 객체는 자율적존재가 되고 외부는 객체 데이터 하나하나에 의존하는 것이 아니라 얻고싶은 메세지의 결과를 반환하는 인터페이스에만 의존하는 관계가 형성된다. 따라서 변경이 발생하더라도 내부로직을 통해 인터페이스의 반환값을 제대로 설정한다면 변경해야 할 부분은 단하나 캡슐화된 코드일 뿐이다.