목록Architecture (18)
devseop08 님의 블로그
상속의 목적은 코드 재사용이 아닌, 타입 계층을 구조화하기 위함이다.타입 계층은 다형성의 기반을 제공한다.상속을 단순히 코드를 재사용하기 위한 목적으로 사용하는 것인지, 클라이언트 관점에서 인스턴스들을 동일하게 행동하는 그룹으로 묶기 위한 목적으로 사용하는 것인지 분명하게 구별해야 한다.다형성이 런타임에 메시지를 처리하기에 적절한 메서드를 동적으로 탐색하는 과정을 통해 구현된다는 사실과상속이 이러한 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하는 방법임을 이해해야 한다.1. 다형성다형성의 분류오버로딩 다형성: 하나의 클래스 안에 동일한 이름의 메서드가 존재하는 경우강제 다형성: 동일한 연산자를 다양한 타입에 사용할 수 있는 방식이다.ex) 자바의 이항 연산자 +매개변수 다형성: 제네..
상속에서 부모 클래스와 자식 클래스 사이의 의존성은 컴파일타임에 해결되지만합성에서 두 객체 사이의 의존성은 런타임에 해결된다.상속을 제대로 활용하기 위해서는 부모 클래스의 내부 구현에 대해 상세하게 알아야 한다.자식 클래스와 부모 클래스의 결합도가 높아질 수 밖에 없다.합성은 구현에 의존하지 않는다.합성은 내부에 포함되는 객체의 구현이 아닌 퍼블릭 인터페이스에 의존한다.합성을 이용하면 변경에 더 안정적인 코드를 얻을 수 있다.합성 관계는 객체 사이의 동적인 관계다. 상속 관계는 클래스 사이의 정적인 관계다변경에 유연하게 대처할 수 있는 설계가 대부분 정답합성을 사용하면 구현에 대한 의존성을 인터페이스에 대한 의존성으로 변경할 수 있다.클래스 사이의 높은 결합도를 객체 사이의 낮은 결합도록 대체할 수 있다..
객체지향에서는 코드를 재사용하기 위해 코드 복사가 아닌 '새로운' 코드를 추가한다.객체지향에서 클래스를 재사용하는 전통적인 방법은 새로운 클래스를 추가하는 것이다.재사용 관점에서 상속이란 클래스 안에 정의된 인스턴스 변수와 메서드를 자동으로 새로운 클래스에 추가하는 구현 기법1. 상속과 중복 코드중복 코드는 개발을 주저하게 만들 뿐만 아니라 동료들을 의심하게 만든다.이것만으로도 중복 코드를 제거해야 할 충분한 이유가 되고도 남겠지만 결정적인 이유는 따로 있다.DRY 원칙중복 코드는 변경을 방해한다. 이것이 중복 코드를 제거해야 하는 가장 큰 이유다.중복 코드는 코드를 수정하는 데 필요한 노력을 몇 배로 증가시킨다.우선 어떤 코드가 중복인지를 찾아야 한다.중복 코드의 묶음을 찾았다면 찾아낸 모든 코드를 일..
의존성 관리 기법들을 원칙이라는 관점에서 정리한다.1. 개방-폐쇄 원칙개방-폐쇄 원칙: "소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다."키워드는 '확장'과 '수정'확장에 대해 열려 있다: 애플리케이션의 요구사항이 변경될 때 이 변경에 맞게 새로운 '동작'을 추가해서 애플리케이션의 기능을 확장할 수 있다.수정에 대해 닫혀 있다: 기존의 '코드'를 수정하지 않고도 애플리케이션의 동작을 추가하거나 변경할 수 있다.개방-폐쇄 원칙에서 유연한 설계란 기존의 코드를 수정하지 않고도 애플리케이션의 동작을 확장할 수 있는 설계라고 말한다.일반적으로 애플리케이션의 동작을 확장하기 위해서 코드를 수정하지 않는 거 아닌가?어떻게 코드를 수정하지 않으면서 새..
1. 의존성 이해하기변경과 의존성어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이에 의존성이 존재의존성은 실행 시점과 구현 시점에 서로 다른 의미를 갖는다.실행 시점: 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다.구현 시점: 의존 대상 객체에 변경이 발생할 경우 의존하는 객체도 함께 변경된다.public class PeriodCondition implements DiscountCondition { private DayOfWeek dayOfWeek; private LocalTime startTime; private LocalTime endTime; public boolean isSatisfiedBy(Screening ..
실제적 문제 해결을 위해 인간이 사용하는 기억 저장소는 장기 기억이 아닌 단기 기억문제 해결을 위해 필요한 정보들을 먼저 단기 기억 안으로 불러들여야 하는데 단기 기억은 시간적 공간적 제약을 갖는다문제 해결에 필요한 요소의 수가 단기 기억의 용량을 초과하는 순간 문제 해결 능력 급감이런 현상을 인지 과부화라고 한다.인지 과부화를 방지하기 위해선 단기 기억 안에 보관할 정보의 양을 조절해야 한다.한 번에 다뤄야 하는 정보의 수를 줄이기 위해 불필요한 정보를 제거하고 현재 문제 해결에 필요한 핵심만 남기는 작업을 추상화라고 한다.일반적인 추상화 방법은 한 번에 다뤄야 하는 문제의 크기를 줄이는 것큰 문제를 해결 가능한 작은 문제로 나누는 작업을 분해라고 한다.분해의 목적은 큰 문제를 인지 과부화의 부담없이 ..
유연하고 재사용 가능한 퍼블릭 인터페이스를 만드는 데 도움이 되는 설계 원칙과 기법을 익히고 적용해봐야 한다.1. 협력과 메시지클라이언트-서버 모델두 객체 사이의 협력 관계를 설명하기 위해 사용하는 전통적인 메타포, 클라이언트-서버 모델협력 안에서 메시지를 전송하는 객체를 클라이언트, 메시지를 수신하는 객체를 서버라고 부른다.협력은 클라이언트가 서버의 서비스를 요청하는 단방향 상호 작용객체는 협력에 참여하는 동안 클라이언트와 서버의 역할을 동시에 수행협력의 관점에서 객체는 두 가지 종류의 메시지 집합으로 구성하나는 객체가 수신하는 메시지의 집합다른 하나는 외부의 객체에게 전송하는 메시지의 집합협력과 관련된 다양한 용어의 의미와 차이점을 이해해야 한다.메시지와 메시지 전송메시지는 객체들이 협력하기 위해 사..
책임에 초점을 맞춰서 설계할 때 직면하는 가장 큰 어려움은 어떤 객체에게 어떤 책임을 할당할지를 결정하기가 쉽지 않다는 것이다.GRASP 패턴은 책임 할당의 어려움을 해결하기 위한 답을 제시해 줄 것이다.객체에 책임을 할당하는 기본적인 원리를 살펴보자1. 책임 주도 설계를 향해데이터보다 행동을 먼저 결정하라너무 이른 시기에 데이터에 초점을 맞추면 캡슐화가 약화되어 낮은 응집도와 높은 결합도를 가진 객체들로 넘쳐나 변경에 취약한 설계를 얻게 된다.객체의 데이터에서 행동으로 무게 중심을 옮기기 위한 기법이 필요하다.객체를 설계하기 위한 질문의 순서를 바꿔야 한다."이 객체가 수행해야 하는 책임은 무엇인가"를 결정한 후에 "이 책임을 수행하는 데 필요한 데이터는 무엇인가"를 결정책임을 먼저 결정한 후 객체의 ..