1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.

  2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.

  3. 상속보다는 구성을 활용한다.

  4. 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.(상호작용 하지만 서로에 대해 잘 몰라야 한다.)

  5. 클래스는 확장에 대해서는 열려있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.(Open-Closed Principle(OCP))

  6. 추상화된 것에 의존하도록 만들어라. 구상 클래스에 의존하도록 만들지 않도록 한다.

    • 의존성 뒤집기 원칙(Dependency Inversion Principle)

      • 어떤 변수에서 구상 클래스에 대한 레퍼런스를 저장하지 말자.

      • 구상 클래스에서 유도된 클래스를 만들지 말자.

      • 베이스 클래스에 이미 구현되어 있던 메소드를 오버라이드 하지 말자.

  7. 최소 지식 원칙 - 정말 친한 친구하고만 얘기하라.(=데메테르의 법칙(Law of Demeter))

    • 어떤 메소드에서든 다음 네 종류 객체 메소드만 호출

      1) 객체 자체

      2) 메소드에 매개변수로 전달된 객체

      3) 그 메소드에서 생성하거나 인스턴스를 만든 객체

      4) 그 객체에 속하는 구성요소

  8. 헐리우드 원칙 - 먼저 연락하지 마라.

  9. 클래스를 바꾸는 이유는 한가지 뿐이어야 한다. -> 한 역할은 한 클래스에서만 맡아야 한다.