조영호님의 특강👍👏🙇♀️
객체지향에서는 역할, 책임, 협력이 핵심이다.
가장 중요한 것은 책임이다.
책임-주도 설계
Responsibility-Driven Design
1.애플리케이션의 요구사항을 파악한다.
2.요구사항을 시스템의 책임으로 변환한다.
3.시스템의 책임을 객체의 책임으로 변환한다.
4.책임을 담당할 수 있는 적절한 객체를 선택한다.
-> 클래스나 객체를 먼저 선택하는게 아니라 책임을 먼저 선택하고, 책임에 적합한 객체를 선택해야한다!
5.객체의 책임 일부를 수행하기 위해 외부의 도움이 필요하다면 다른 객체에게 도움을 요청한다.
6.책임을 담당할 수 있는 적절한 객체를 선택한다.
메소드는 송신하는 쪽의 입장에서 이름을 짓는 것이 적합하다. → "수신하는 쪽에서 무엇을 한다" 가 아닌, "송신하는 쪽에서 무엇을 원한다" 라고 짓는게 적합하다.
What(책임)을 결정한 다음에 → Who(어떤 객체가 수행할지)를 결정한다.
Q. 클래스가 많은쪽이 좋다는 말은 DB설계할때도 테이블을 최대한 많이 쪼개는게 좋다는 말인가? (by Kyu)
No. 테이블 설계와 객체 설계 패러다임은 완전 다르다.
테이블은 데이터의 중복을 제거하면서 관련된 데이터들을 같이 모으는게 좋다.
테이블은 데이터 관점이고 객체는 행동 관점(런타임에 어떤 행동을 수행할건지)이다.
테이블을 설계하는 정규화 원칙과 객체를 설계하는 책임 기반 설계 원칙의 연관성은 없다.
결합도와 의존성
결합도가 높고 의존성이 높으면 안 좋다고 이야기한다. 하지만 객체끼리 메시지를 주고받으면서 협력하기 때문에 결합도와 의존성은 불가피하다.
때문에 응집도를 높이고(SRP) 결합도를 낮추도록(DIP) 설계하는게 핵심이다.
Q. DI와 IoC?
Dependency Inversion : A가 B의 기능을 쓸 때 전통적인 Dependency의 방향은 A → B로 흐른다.
그런데 B가 인터페이스(혹은 추상클래스)이고 B 밑에 서브 클래스들이 있다고 하면, Dependency가 반대로 B의 서브클래스에서 A로 흐른다. 즉, 의존성을 역전시킨다.
Inversion of Control (제어 역전) : 헐리우드 원칙, 내가 클래스를 만드는데 내가 스프링의 어떤 코드를 호출을 하는게 아니라 스프링이 나의 코드를 호출한다. 호출하는 쪽이 제어권을 갖고 있다. 내가 코드를 호출하면 제어가 나한테 있는것이고, 내가 호출할 수 있는 제어권이 스프링과 같은 프레임워크에게 넘어가면 제어가 역전 되었다고 본다.
숙제!ㅠㅠㅠㅠㅠ 저도 아직 못했는데 이젠 미룰 수 없게 되었네요ㅠㅠ 오늘 조영호님 세미나 정리해주셔서 감사합니당ㅎㅎㅎ