반응형
오브젝트: 코드로 이해하는 객체지향 설계 | 위키북스 (wikibook.co.kr)
객체 내부 데이터는 객체 스스로 처리한다.
- 캡슐화란 자신의 데이터 수정의 책임을 객체 스스로 갖는것
- 객체지향 세계의 객체는 의인화된 객체이다.
- 책임은 행동(협력 문맥 => 메세지에 응답할 책임)에 의해 정해진다.
앞으로 자주 나오는 그림 설명
프로그래밍 패러다임은 보완재다.
객체지향이 적합하지 않은 상황에서는 언제라도 다른 패러다임을 적용할 수 있는 시야를 갈고 닦아라.
절차지향의 문제점을 객체지향으로 해결하기.
package org.eternity.theater.step01;
public class Theater {
private TicketSeller ticketSeller;
public Theater(TicketSeller ticketSeller) {
this.ticketSeller = ticketSeller;
}
public void enter(Audience audience) {
if (audience.getBag().hasInvitation()) {
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().setTicket(ticket);
} else {
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().minusAmount(ticket.getFee());
ticketSeller.getTicketOffice().plusAmount(ticket.getFee());
audience.getBag().setTicket(ticket);
}
}
}
다른 객체의 상태를 극장이 맘대로 바꾸고 있다.
해결 방안 : 자신의 데이터는 자신이 처리한다.
- 극장이 관객과 매표원에 대해 너무 많이 알고 있음
- 클래스가 데이터 역할만 하여 절차지향적인 코드를 만듬
- Theater의 enter 메서드는 프로세스이며 Bag, Aucience, TicketSeller, TicketOffice는 데이터임
- 데이터와 프로세스를 별도의 모듈에 위치시키는 방식을 절차적 프로그래밍이라 한다.
- 관람객과 판매원을 자율적인 존재로 만든다.
- 관람객이 스스로 가방 안의 현금과 초대장을 처리
- 판매원이 스스로 매표소의 티켓과 판매 요금을 다룸
데이터와 데이터를 사용하는 프로세스가 동일한 모듈 내부에 위치하도록 프로그래밍 하는 방식을 객체 지향 프로그래밍이라 한다.
응집도 : 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에 위임.
결합도 : 객체 사이의 의존도. 결합도가 크면 함께 변경될 가능성이 커져 유지보수가 어려워짐.
캡슐화 : 객체 내부의 세부적인 사항을 감추는 것 (변경하기 쉬운 객체를 만듬)
- 내부 접근을 막아 객체와 객체 사이의 결합도를 줄일 수 있음
- 인터페이스만 호출하고 내부 상태를 직접 변경할 수 없도록 함
public class TicketOffice {
private Long amount;
private List<Ticket> tickets = new ArrayList<>();
public TicketOffice(Long amount, Ticket... tickets) {
this.amount = amount;
this.tickets.addAll(Arrays.asList(tickets));
}
// 아래 코드는 책에서 설명한 것처럼 트레이드오프 후에 원래의 step02의 구현으로 복구해야 합니다.
public void sellTicketTo(Audience audience) {
plusAmount(audience.buy(getTicket()));
}
private Ticket getTicket() {
return tickets.remove(0);
}
private void plusAmount(Long amount) {
this.amount += amount;
}
}
설계는 트레이드 오프다.
설계는 코드의 배치다.
객체지향의 세계에서 화내고 웃는 가방과 매표소를 만나도 놀라지 마라.
반응형
'BackEnd' 카테고리의 다른 글
오브젝트 5장. 책임 할당하기 (0) | 2021.12.17 |
---|---|
오브젝트 4장 설계 품질과 트레이드오프 정리 (0) | 2021.12.17 |
오브젝트 3장 역할, 책임, 협력 정리 (0) | 2021.12.17 |
오브젝트 2장 객체지향 프로그래밍 정리 (0) | 2021.12.17 |
[컨버런스 리뷰] TDD는 오브젝트 디자인(객체 설계)에 도움이 되는가? (0) | 2021.12.14 |