Grasp 패턴 이용한 객체 설계 예제(2)
DB로부터 ProductionDescription 조회
- 실제로는 필요할 때마다 로드가 됨
endSale 설계
판매 총액의 계산
- Expert를 찾기 위한 과정
- 책임: 판매 총액을 아는 것은 누가 책임져야 하는가?
- 필요한 정보 요약:
- 판매 합계(total)는 모든 판매 품목의 소계(subtotal) 합계
- 판매 품목 소계 := 품목 수량 * 제품 가격
- 이 책임을 수행하기 위해 필요한 정보와 이 정보를 알고 있는 클래스를 나열함
Sale.getTotal 설계
makePayment의 설계
payment의 생성
- by Creator 후보는 register 과 sale
- register -> low coupling and high cohesion
- sale -> coupling 증가
- 대체 설계 선택이 있는 경우
- 향후 변경 가능성이 있는 경우 응집력, 결합성 및 안정성이 우수한 대안을 선택
판매 로그 기록
- by Information Expert 후보는 sale과 salesLedger
- domain model에 salesLedger를 추가
잔액 계산
- 영수증 출력하기 위해 필요함
- Bal = pmt.amount(받은 돈) - s.total;
- by Informaition Expert 후보로 payment와 sale
- payment는 sale을 알지 못합
- sale이 payment를 만들었기 때문에 payment를 알고 있음
Iteration 1에서의 최종 NextGen DCD
UI 객체와 도메인 객체의 연결
UI 계층이 도메인 계층의 객체에 대한 가시성을 얻는 방법
- 초기화 객체
- UI와 도메인 객체를 모두 생성함
- 도메인 객체를 UI에 전달함
- UI 개체는 도메인 개체 생성을 담당하는 factory object와 같이 잘 알려진 소스에서 도메인 객체를 검색함
- 자바 코드 예제
- swing
- 내부 속성에 register를 담아 놓고 사용
- web -> stateless
- 도메인 객체를 다음 동작에서 알 수 없음
- request마다 register 얻어서 사용함
-> 복잡하면 factory
초기화와 Start Up 유즈케이스
초기 도메인 객체의 선택
- 초기 도메인 객체로 선택
- 도메인 객체의 포함 또는 집계 계층 구조의 루트 또는 그 근처에 있는 클래스
register과 같은 facade 컨트롤러 또는 store와 같은 대부분의 다른 개체를 포함하는 것으로 간주되는 다른 객체
Store.create의 설계
- 이전 설계 작업의 요구에서 파생
- 지금까지 만들었던 Interation Diagram에서 필요했던 가정은 무엇인가? Class Diagram에서 찾아보자
- 초기화 작업 목록
1. Store, Register, ProductCatalog 및 ProductDescriptions를 생성
- ProductCatalog를 ProductDescriptions와 연결 (연관관계)
- Store를 ProductCatalog와 연결 (연관관계)
- Store를 Register와 연결 (연관관계)
- Register를 ProductCatalog와 연결 (연관관계)
가시성 설계
객체 간의 가시성
- 객체에 메시지를 보내려면 메시지를 받는 수신 객체를 볼 수 있어야 함
가시성이란?
-
Scope에 관련된 이슈
-
동기
- 객체 A가 객체 B에 메시지를 보내려면 B가 A에게 보여야 함
-
4가지 가시성
- Attribute visibility: B is an attribute of A. (B가 A에 연관)
- Parameter visibility: B is a parameter of a method of A. (B가 A의 파라미터)
- Local visibility B is a local object in a method of A. (B가 A의 메소드 내의 지역 객체)
- Global visibility B is in some way globally visible. (B가 전역 변수)
속성 가시성
- 속성으로 정의
- 영속적 가시성
- 가장 일반적임
객체가 살아있을 때만
매개변수 가시성
- 매개변수로 전달
- 상대적으로 일시적인 가시성
- 자주 발생하는 가시성
메서드가 호출되는 동안
지역 가시성
전역 가시성
- 객체를 전역 변수에 할당
- c++가능, Java 불가능
- Java에서는 Singleton 패턴 사용
설계를 코드로 매핑하기
프로그래밍과 반속적이고 진화적인 개발
설계 완료 -> class diagram & interaction diagram
설계를 코드로 매핑
- 구현
- Class Diagram으로 부터 클래스와 인터페이스 정의
- Interaction Diagram으로 부터 메소드 정의
DCD로부터 클래스 정의 생성
- 메소드 프로토타입과 속성을 가진 클래스 정의
인터렉션 다이어그램으로부터 메소드 생성
예제: 클래스 다이어그램에서 클래스 정의 (다시 확인)