본문 바로가기

IT Book Summary/Object: 객체지향설계

(16)
Appendix C 동적인 협력, 정적인 코드 객체는 동적이고 프로그램은 정적이다. 객체는 다른 객체와 협력하면서 젼하고 다양한 방식으로 행동한다. 프로그램의 실행 구조를 표현하는 동적 모델 dynamic model : 객체의 협력으로 구성 코드의 구조를 담는 정적모델 static model : 타입(동일한 타입 객체들이 수행할 수 있는 모든행동을 합축해 표현)과 관계로 구성 좋은 설계는 객체 사이의 협력과 행동을 표현하는 동적 모델을 기반으로 함 01 동적 모델과 정적 모델 행동이 코드를 결정한다. 행동을 고려해 상속계층을 구성 객체가 외부에 제공하는 행동을 고려해 타입계층 생성 ex) Bird - Penguin - FlyingBird 동적모델 (행동) 이 정적모델 (클래스 타입) 을 결정해야 함 변경을 고려하라 상속계층을 합성으로 변경 다양하게 ..
Appendix B 타입계층의 구현 타입 != 클래스 타입은 개념의 분류를 의미하고 클래스는 타입을 구현하는 한가지 방법일 뿐. 타입은 다양한 방법으로 구현가능 다양한 방식으로 구현된 타입들을 하나의 타입계층 안에 조합. 클래스를 이용한 타입 계층 구현 : 사용자 정의 타입 user-defined data type ex) 10장의 Phone 클래스 Phone은 calculateFee 메시지에 응답할 수 있는 타입을 선언하는 동시에 객체 구현을 정의 퍼블릭 인터페이스는 동일하지만 다른 방식으로 구현해야 하는 객체가 필요하다면 상속을 이용 But 부모클래스와 강하게 결합되므로 가급적 추상클래스 상속과 인터페이스 구현하는 방법이 바람직 인터페이스를 이용한 타입 계층 구현 상속으로 인한 결합도 문제를 피하고 다중 상속이라는 구현 제약도 해결할 수..
Appendix A 계약에 의한 설계 Design By Contract 메서드 구현이 복잡하다면 인터페이스 만으로 객체의 행동을 파악하기 어려움. 명령의 부수효과를 쉽게 표현할 수 있는 커뮤니케이션 수단이 필요함. 계약의 의한 설계를 사용해 협력에 필요한 제약과 부수효과를 정의하고 문서화 할 수 있음. -> 실행 가능한 검증도구 01 협력과 계약 부수효과를 명시적으로 메시지와 파라미터는 시그니처를 통해 전달할 수 있지만 협력을 위한 약속과 제약은 인터페이스를 통해 전달 못하기 때문에 협력과 관련된 내용이 암시적으로 남음. ex) 6장의 명령-쿼리 분리 원칙 , 일정관리 프로그램 class Event { //RecurringSchedule의 조건을 만족시키는지 여부 확인후 Reschedule 메서드 호출 public bool IsSatisfied(RecurringSchedul..
Chapter15 디자인 패턴과 프레임워크 디자인 패턴 - 소프트웨어 설계에서 반복적으로 발생하는 문제에 대해 반복적으로 적용할 수 있는 해결방법 - 설계를 재사용하기 위함 - 협력을 일관성있게 만들기 위해 재사용할 수 있는 설계의 묶음 프레임 워크 - 설계와 코드를 함께 재사용하기 위한것. - 애플리케이션의 아키텍처를 구현 코드의 형태로 제공 - 일관성 있는 협력을 제공하는 확장 가능한 코드. 01 디자인 패턴과 설계 재사용 소프트웨어 패턴 패턴이란 무엇인가? 패턴은 반복적으로 발생하는 문제와 해법의 쌍으로 정의된다 패턴을 사용함으로써 이미 알려진 문제와 이에 대한 해법을 문서로 정리할 수 있으며, 이 지식을 다른 사람과 의사소통할 수 있다. 패턴은 추상적인 원칙과 실제 코드 작성 사이의 간극을 메워주며 실질적인 코드 작성을 돕는다. 패턴의 요..
Chapter 14 일관성 있는 협력 유사한 기능을 구현하기 위해 유사한 협력패턴을 사용해라. 설계 재사용을 위해 객체 협력방식을 일관성 있게 만들어야 함. 01 핸드폰 과금 시스템 변경하기 기본정책 확장 핸드폰 과금 시스템 요금 정책 테이블 유형 형식 예 고정요금 방식 : 일정단위로 요금부과 A초당 B원 10초당 18원 시간대별 방식 : 시간구간별로 다른요금 부과 A시부터 B시까지 C초당 D원 B시부터 C시까지 D초당 E원 평일에는 10초당 38원 공휴일에는 10초당 19원 요일별 방식 : 요일별로 요금 차등부과 평일에는 A초당 B원 공휴일에는 A초당 C원 평일에는 10초당 38원 공휴일에는 10초당 19원 구간별 방식 : 전체 통화시간을 일정한 통화시간에 따라 나누고 구간별로 요금을 차등부과 초기 A분 동안 B초당 C원 A분 ~ D분까지..
Chapter 13 서브클래싱과 서브타이핑 상속의 두가지 용도 - 타입계층을 구현하는 것 : 부모클래스는 자식클래스의 일반화(generalization), 자식클래스는 부모클래스의 특수화(specialization) - 코드 재사용 : 점진적으로 어플리케이션을 확장. 부모 자식이 강하게 결합. 동일한 메시지에 대해 다르게 행동할 수 있는 다형적인 객체를 구현하기 위해 객체의 행동은 기반으로 타입계층을 구성 객체지향 프로그래밍(Object-Based Programming)과 객체기반 프로그래밍(Object-Oriented Programming) 객체지향 프로그래밍은 상속과 다형성을 지원, 객체기반 프로그래밍은 지원하지 않음. 종종 객체기반이 자바스크립트처럼 프로토타입 기반 언어(Prototype-Based Language) 를 사용한 클래스 없이 ..
Chapter 12 다형성 상속의 목적은 코드 재사용이 아닌 타입 계층을 구조화하기 위해 사용해야 함. 상속을 사용하려는 목적이 단순히 코드 재사용을 위해서인가? 클라이언트 관점에서 인스턴스들을 동일하게 행동하는 그룹으로 묶기 위해서인가? 상속의 관점에서 다형성이 구현되는 기술적인 메커니즘 - 다형성이 런타임에 메시지를 처리하기에 적합한 메서드를 동적을 탐색하는 과정을 통해 구현됨. - 이런 탐색 경로를 클래스 계층의 형태로 구현하기 위한방법 01 다형성(Polymorphism) poly(많은) morph(형태) 를 가질 수 있는 능력 정의 -> 하나의 추상 인터페이스에 대해 코드를 작성하고 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력 : 여러 타입을 대상으로 동작할 수 있는 코드를 작성할 수 있는 방법 다형..
Chapter 11 합성과 유연한 설계 상속 합성 부모클래스와 자식클래스 사이의 의존성은 컴파일 타임에 해결 두 객체 사이의 의존성은 런타임에 해결 is-a 관계 has-a 관계 부모클래스의 구현에 의존 결합도가 높음. 구현에 의존하지 않음. 내부에 포함되는 객체의 구현이 아닌 퍼블릭 인터페이스에 의존. 클래스 사이의 정적인 관계 객체사이의 동적인 관계 부모클래스 안에 구현된 코드 자체를 재사용 포함되는 객체의 퍼블릭 인터페이스를 재사용 01 상속을 합성으로 변경하기 상속을 남용했을때 직면하는 3가지 문제점 불필요한 인터페이스 상속문제 메서드 오버라이딩의 오작용 부모클래스와 자식클래스의 동시 수정 문제 불필요한 인터페이스 상속문제 java.util.Properties와 java.util.Stack 합성관계로 변경한 후 Properties의 클..