
한 클래스가 여러가지 일을 할 수 있는 것은 좋지 않다. 하나의 클래스는 하나의 일만 처리하자. 예를 들면 employee 클래스가 문서 읽고쓰기, xml 변환 등 여러가지 일을 수행한다면, xml 변환 프로그램을 바꿀때 이 클래스도 바꿔야하고, 문서관련 프로그램을 바꿀때도 이 클래스를 바꿔야 한다. 이렇게 하지말고 employee xml , employee databse 클래스 두개를 생성해서 이것을 해결한다.
모듈 자체를 변경하지 않고 모듈을 둘러싼 환경을 바꿀 수 있어야 한다.


테스트를 진행할때 이렇게 설계하면 UnitTestDatabase로 값을 쉽게 옮길 수 있다.
서브타입은 언제나 자신의 기반타입으로 교체할 수 있어야 한다.
고차원 모듈은 저차원 모듈에 의존하면 안된다. 이 둘 모두 다른 추상화 된것에 의존해야 한다.
추상적인 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상적인것에 의존한다.
클라이언트는 자신이 사용하지 않는 메서드에 의존관계를 맺으면 안된다.


클래스를 설계할 때는 반드시 메서드 중심 즉,행위 중심으로 분할 설계해야한다.
그리고 허깨비 클래스 (API 함수만을 호출하는 클래스) 들의 생성에 주의해라.
물리적 실체의 흐름과 아무런 관계가 없다. 메시지를 원하는 쪽이 의존한다.