응집도는 높이고, 결합도는 낮추라.
응집도 : 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성. 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져 재사용이나 기능의 수정, 유지보수가 용이 (클래스 내의 메소드끼리 엮이도록 구현하는게 좋다는 듯.)
결합도 : 모듈간의 상호 의존 정도로서 결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어 객체의 재사용이나 수정, 유지보수가 용이.
ex : 하나의 필드가 하나의 클래스에선 A, 다른 클래스에선 B의 의미로 통하는 경우,
여자 클래스에 군번이 있는 경우(모든 남성만 군대를 가고, 모든 여성은 군대를 안 간다고 가정.)
하나의 메서드에서 분기 처리를 위한 if문이 존재 할 때.
ex : 강아지 클래스에서 소변보다() 메서드를 구현 할 때, 암컷 / 수컷을 나누어서 if문으로 분기처리 하는 경우.
상위 클래스 / 인터페이스에 의존하게 함으로써, 의존하는 클래스가 다른 클래스로 바뀌더라도 상위 클래스 / 인터페이스의 메소드를 사용하므로 확장에는 개방되어 있고, 변경에는 폐쇄되어 있다.
ex : 데이터베이스 프로그래밍(JDBC를 사용할 때, Oracle → Mysql로 DB를 바꿔도 Connection만 수정하면 끝. )
위 두가지를 만족하면, LSP를 만족하는 것 → 상속이 분류도
형태로 잘 되어있기 때문(상속이 조직도 / 계층도 형태로 돼있으면 안된다!)
하나의 큰 클래스를, 세부적인 인터페이스로 나누는 방법.
결국 SRP와 ISP는 한 문제에 대한 두가지의 다른 해결책이다.
일반적으로 SRP가 더 좋은 해결책이라고 한다.(인터페이스로 분할해서 쓰면, 쓰이지 않는 메서드가 많아지므로?)
상위클래스가 풍성하면, LSP를 적용할 때 하위 클래스가 상위 클래스의 풍부한(다양한) 멤버변수를 이용할 수 있으므로 좋고,
인터페이스가 작으면, 해당 객체가 쓸(필요한) 메서드만 누릴 수 있기 때문에 좋다.
자신보다 변하기 쉬운 것(구체 클래스)에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것.