You are on page 1of 26

OObject

bject--OOriented

riented DDesign

esign

for Agile

for

Agile Software

Software Development

Development

Second

Second Story

Story 2.

2.

작성자

: 고형호

: hyungho.ko@gmail.com

홈페이지

: http://www.innosigma innosigma.com

최종 수정일

: 2008.06.27

http://www.innosigma.com

Goal

Goal

Structure for

Structure

for reusable

reusable Object

Object--Oriented

Oriented Design

Design

http://www.innosigma.com

Contents

Part

Part 1.

1. Inheritance

Inheritance

  • 1. Implementation Inheritance

  • 2. Interface Inheritance

Part

Part 2.

2. Coupling

Coupling

  • 1. Tight Coupling

  • 2. Loose Coupling

Part

Part 3.

3. Delegation

Delegation

  • 1. Decoupling

  • 2. Extending Run-Time

Part

Part 4.

4. Design

Design Template

Template

  • 1. Hypothesis

  • 2. Responsibility Naming

  • 3. Responsibility Character

  • 4. Responsibility Feature

Part

Part 5.

5. Design

Design Patterns

Patterns

1. Inheritance

http://www.innosigma.com

Inheritance

Inheritance

Inheritance

  • Implementation Inheritance

  • Interface Inheritance

http://www.innosigma.com

Implementation Inheritance

Shape

+ DoSomething()

http://www. innosigma .com Implementation Inheritance Shape + DoSomething() RectangleShape + DoSomethingEx() public class Shape { public
   
   

RectangleShape

+ DoSomethingEx()

public class Shape

{

public void DoSomething()

{ // 공통 요소 구현

}

}

public class RectangleShape : Shape {

public void DoSomethingEx()

{ // 추가 요소 구현

}

}

Abstraction 확장(Compile-Time) Rectangle 서비스 요청 상속 Shape (Abstraction) 기본 기능 추가 기능(코드 재사용)
Abstraction 확장(Compile-Time)
Rectangle
서비스 요청 상속
Shape
(Abstraction)
기본 기능
추가 기능(코드 재사용)
장점
장점

코드 재사용

효과
효과

중복 코드 없이 기능 추가

결과
결과

Abstraction Abstraction 확장확장

http://www.innosigma.com

Interface Inheritance

<<interface>>

 

ISort

+ DoSomething()

 
<<interface>> ISort + DoSomething() QuickSort + DoSomething()
   

QuickSort

+ DoSomething()

public interface ISort

{ void DoSomething();

}

public class QuickSort : ISort {

public virtual void DoSomething()

}

{ // Quick Sort 구현 ...

}

변화하지 않는 것 방죽 변화하는 것 Something ... ... 인터페이스
변화하지 않는 것
방죽
변화하는 것
Something
...
...
인터페이스
장점
장점
구현 은닉 효과
구현 은닉
효과

외부에 아무런 영향 없이 내부 구현 코드 수정

결과
결과

변화변화 구현구현

2. Coupling

http://www.innosigma.com

Coupling

결합도

결합도(Coup

(Coupling)

ling)

:: 클래스

간의 서로 다른 책임들이 얽혀 있어서 상호 의존도가 높은 정도

응집도

응집도(Cohesion

(Cohesion))

: 하나클래스하나기능을 온전히 순도 높게 담당하고 있는 정도

Coupling

Coupling

  • Tight Coupling

  • Loose Coupling

http://www.innosigma.com

Tight Coupling

Implementation Inheritance

Shape

+ DoSomething()

http://www. innosigma .com Tight Coupling Implementation Inheritance Shape + DoSomething() RectangleShape + DoSomethingEx() Interface Inheritance <<interface>>
   
   

RectangleShape

+ DoSomethingEx()

Interface Inheritance

 

<<interface>>

 

ISort

+ Sort()

 
<<interface>> ISort + Sort() or QuickSort + Sort()

or

     

QuickSort

+ Sort()

public class RectangleShape : Shape { ...

public class QuickSort : ISort

{ ... Inheritance
{
...
Inheritance
  • 1. Compile-Time에 관계가 결정된다.

  • 2. 소스 코드 수정 없이는 관계를 수정할 수 없다.

  • 3. 파생 클래스는 상위 클래스 변화영향받는다.

http://www.innosigma.com

11

Loose Coupling

요청 수신 객체
요청
수신 객체
요청
요청

위임자(Delegate)

http://www. innosigma .com 11 Loose Coupling 요청 수신 객체 요청 위임자 (Delegate) Control Shape 서비스 요청

Control

http://www. innosigma .com 11 Loose Coupling 요청 수신 객체 요청 위임자 (Delegate) Control Shape 서비스 요청

Shape

서비스 요청

<<delegation>>

http://www. innosigma .com 11 Loose Coupling 요청 수신 객체 요청 위임자 (Delegate) Control Shape 서비스 요청

+ Draw(g : Graphics)

http://www. innosigma .com 11 Loose Coupling 요청 수신 객체 요청 위임자 (Delegate) Control Shape 서비스 요청

+ Draw(g : Graphics)

http://www. innosigma .com 11 Loose Coupling 요청 수신 객체 요청 위임자 (Delegate) Control Shape 서비스 요청
public class Control { private Shape _shape = null; public void Draw(Graphics g) { _shape.Draw(g); //
public class Control
{
private Shape _shape = null;
public void Draw(Graphics g)
{
_shape.Draw(g);
// delegation
}
...
}

?

public class Shape {

public void Draw(Graphics g)

{ // do something ...

}

}

http://www. innosigma .com 11 Loose Coupling 요청 수신 객체 요청 위임자 (Delegate) Control Shape 서비스 요청
http://www. innosigma .com 11 Loose Coupling 요청 수신 객체 요청 위임자 (Delegate) Control Shape 서비스 요청
Delegation
Delegation
http://www. innosigma .com 11 Loose Coupling 요청 수신 객체 요청 위임자 (Delegate) Control Shape 서비스 요청
  • 1. Run-Time에 관계가 결정된다.

  • 2. 소스 코드 수정 없이는 관계를 수정할 수 있다.

  • 3. 위임자는 수신 객체 변화영향받지 않는다.

Shape을 상속 받는 어떤 객체(?)대체될 수 있다.

위임자는 수신 객체의 어떤 정보갖고 있지 않다.

(Shape)

(Control)

3. Delegation

http://www.innosigma.com

13

Decoupling

http://www. innosigma .com 13 Decoupling Interface Inheritance <<interface>> IInputStream + Read() FileInputStream + Read() Implementation Inheritance

Interface Inheritance

<<interface>>

IInputStream

 

+ Read()

 
+ Read() FileInputStream + Read()
   

FileInputStream

+ Read()

http://www. innosigma .com 13 Decoupling Interface Inheritance <<interface>> IInputStream + Read() FileInputStream + Read() Implementation Inheritance
http://www. innosigma .com 13 Decoupling Interface Inheritance <<interface>> IInputStream + Read() FileInputStream + Read() Implementation Inheritance

Implementation Inheritance

StreamReader + DoSomething() TimeoutStreamReader + DoSomethingEx()
StreamReader
+ DoSomething()
TimeoutStreamReader
+ DoSomethingEx()

<<delegation>>

http://www. innosigma .com 13 Decoupling Interface Inheritance <<interface>> IInputStream + Read() FileInputStream + Read() Implementation Inheritance
목적
목적

Abstraction 확장확장

Abstraction

http://www. innosigma .com 13 Decoupling Interface Inheritance <<interface>> IInputStream + Read() FileInputStream + Read() Implementation Inheritance
목적
목적

변화변화 구현구현

분리

FileInputStream존재알지 못한다.

StreamReaderTimeoutStreamReader존재알지 못한다.

Delegation 결과
Delegation
결과

Abstraction 확장변화 구현분리 시킨다.

http://www.innosigma.com

Extending Run-Time

<<interface>> IInputStream <<delegation>> public class MemoryInputStream : IInputStream + Read() { private IInputStream _inputStream = null;
<<interface>>
IInputStream
<<delegation>>
public class MemoryInputStream : IInputStream
+ Read()
{
private IInputStream _inputStream = null;
public void Read()
{
// memory stream 관련 구현
// ...
FileInputStream
MemoryInputStream
_inputStream.Read(); // delegation
}
...
+ Read()
+ Read()
}
Recursive Delegation 결과
Recursive Delegation
결과

변화변화 확장확장

변화하지 않는 것 방죽 변화하는 것
변화하지 않는 것
방죽
변화하는 것

14

...

http://www. innosigma .com Extending Run-Time <<interface>> IInputStream <<delegation>> public class MemoryInputStream : IInputStream + Read() {
Something 인터페이스
Something
인터페이스
변화 확장(Run-Time) Memory 서비스 요청 위임 Stream
변화 확장(Run-Time)
Memory
서비스 요청 위임
Stream
http://www. innosigma .com Extending Run-Time <<interface>> IInputStream <<delegation>> public class MemoryInputStream : IInputStream + Read() {

...

4. Design Template

http://www.innosigma.com

Hypothesis

Structure for reusable Object-Oriented Design 가설

  • 1. 객체AbstractionImplementation으로 구성된다.

  • 2. 하나Abstraction다양Implementation으로 구현된다.

2.1 AbstractionImplementation분리된다.

2.2 Abstraction확장되고, Implementation변화 된다.

2.3 Run-TimeImplementation확장된다.

http://www.innosigma.com

Hypothesis(cont.)

1. 객체AbstractionImplementation으로 구성된다.

Abstraction
Abstraction
<<interface>> Implementation
<<interface>>
Implementation

http://www.innosigma.com

Hypothesis(cont.)

2. 하나Abstraction다양Implementation으로 구현된다.

2.1 AbstractionImplementation분리된다.

분리

http://www. innosigma .com Hypothesis(cont.) 2. 하나 의 Abstraction 는 다양 한 Implementation 으로 구현된다 . 2.1
<<interface>> Implementation
<<interface>>
Implementation
Abstraction
Abstraction

<<delegation>>

http://www. innosigma .com Hypothesis(cont.) 2. 하나 의 Abstraction 는 다양 한 Implementation 으로 구현된다 . 2.1
http://www. innosigma .com Hypothesis(cont.) 2. 하나 의 Abstraction 는 다양 한 Implementation 으로 구현된다 . 2.1

http://www.innosigma.com

Hypothesis(cont.)

2. 하나Abstraction다양Implementation으로 구현된다.

2.1 AbstractionImplementation분리된다.

2.2 Abstraction확장되고, Implementation변화 된다.

Abstraction
Abstraction
http://www. innosigma .com Hypothesis(cont.) 2. 하나 의 Abstraction 는 다양 한 Implementation 으로 구현된다 . 2.1
   

AbstractionEx

<<delegation>>

http://www. innosigma .com Hypothesis(cont.) 2. 하나 의 Abstraction 는 다양 한 Implementation 으로 구현된다 . 2.1
<<interface>> Implementation
<<interface>>
Implementation
http://www. innosigma .com Hypothesis(cont.) 2. 하나 의 Abstraction 는 다양 한 Implementation 으로 구현된다 . 2.1
   

AnotherImplementation

상속
상속

Abstraction 확장확장

Abstraction

상속
상속

변화변화 구현구현

http://www.innosigma.com

Hypothesis(cont.)

2. 하나Abstraction다양Implementation으로 구현된다.

2.1 AbstractionImplementation분리된다.

2.2 Abstraction확장되고, Implementation변화 된다.

2.3 Run-TimeImplementation확장된다.

Abstraction
Abstraction
http://www. innosigma .com Hypothesis(cont.) 2. 하나 의 Abstraction 는 다양 한 Implementation 으로 구현된다 . 2.1
   

AbstractionEx

<<interface>>
<<interface>>

<<recursive delegation>>

http://www. innosigma .com Hypothesis(cont.) 2. 하나 의 Abstraction 는 다양 한 Implementation 으로 구현된다 . 2.1
Implementation AnotherImplementation AnotherImplementationEx
Implementation
AnotherImplementation
AnotherImplementationEx

http://www.innosigma.com

Responsibility Naming

설계 의도를 명확히 표현하기 위하여 Responsibility Naming을 추가한다.

WHAT Abstraction Sub-WHAT AbstractionEx
WHAT
Abstraction
Sub-WHAT
AbstractionEx
IMPL <<interface>> Implementation HOW Sub-HOW AnotherImplementation AnotherImplementationEx
IMPL
<<interface>>
Implementation
HOW
Sub-HOW
AnotherImplementation
AnotherImplementationEx

WHAT : Abstraction

Sub-WHAT : 확장된 Abstraction

IMPL : Implementation

HOW : 변화된 Implementation

Sub-HOW : 확장된 Implementation

http://www.innosigma.com

Responsibility Character

변화하지 않는 것

<<interface>> Abstraction Implementation AbstractionEx AnotherImplementation AnotherImplementationEx 확장(Compile-Time) 변화하는 것 확장(Run-Time)
<<interface>>
Abstraction
Implementation
AbstractionEx
AnotherImplementation
AnotherImplementationEx
확장(Compile-Time)
변화하는 것
확장(Run-Time)
http://www. innosigma .com Responsibility Character 변화하지 않는 것 <<interface>> Abstraction Implementation AbstractionEx AnotherImplementation AnotherImplementationEx 확장(Compile-Time) 변화하는

확장

http://www.innosigma.com

Responsibility Feature

Abstraction
Abstraction
Abstraction AbstractionEx
   

AbstractionEx

<<interface>>
<<interface>>
Implementation AnotherImplementation AnotherImplementationEx
Implementation
AnotherImplementation
AnotherImplementationEx
http://www. innosigma .com Responsibility Feature Abstraction AbstractionEx <<interface>> Implementation AnotherImplementation AnotherImplementationEx Feature Feature 목적 Abstraction 확장
Feature
Feature
Feature
Feature

목적

Abstraction 확장

변화 구현(확장)

Client

공개

은닉

역할

비즈니스

API

(Application Programming Interface)

관계

1

N

5. Design Patterns

http://www.innosigma.com

25

Design Patterns

  • 1. Bridge

1.

Bridge Pattern

Pattern

} WHAT Abstraction + Operator() Sub-WHAT RefinedAbstraction public void Operator() { _impl.OperationImp();
}
WHAT
Abstraction
+ Operator()
Sub-WHAT
RefinedAbstraction
public void Operator()
{
_impl.OperationImp();
 

IMPL

 
   
 

Implementor

+ OperationImp()

http://www. innosigma .com 25 Design Patterns 1. Bridge 1. Bridge Pattern Pattern } WHAT Abstraction +
HOW HOW ConcreteImplementorA ConcreteImplementorB + OperationImp() + OperationImp()
HOW
HOW
ConcreteImplementorA
ConcreteImplementorB
+ OperationImp()
+ OperationImp()
http://www. innosigma .com 25 Design Patterns 1. Bridge 1. Bridge Pattern Pattern } WHAT Abstraction +
  • 2. 2. Strategy

Strategy Pattern

Pattern

 

WHAT

 
   
   

Context

+ ContextInterface()

 

IMPL

 
 

<<interface>>

   
   

Strategy

+ AlgorithmInterface()

http://www. innosigma .com 25 Design Patterns 1. Bridge 1. Bridge Pattern Pattern } WHAT Abstraction +
HOW HOW ConcreteStrategyA ConcreteStrategyB + AlgorithmInterface() + AlgorithmInterface()
HOW
HOW
ConcreteStrategyA
ConcreteStrategyB
+ AlgorithmInterface()
+ AlgorithmInterface()
http://www. innosigma .com 25 Design Patterns 1. Bridge 1. Bridge Pattern Pattern } WHAT Abstraction +

http://www.innosigma.com

26

Design Patterns(cont.)

  • 3. 3. Decorator

Decorator Pattern

Pattern

public override void Operation() { _component.Operation(); } IMPL Component + Operation() HOW ConcreteComponent Decorator _component +
public override void Operation()
{
_component.Operation();
}
IMPL
Component
+ Operation()
HOW
ConcreteComponent
Decorator
_component
+ Operation()
+ Operation()
Sub-HOW Sub-HOW ConcreteDecoratorA ConcreteDecoratorA - addedState + Operation() - AddedBehavior() + Operation() public override void Operation()
Sub-HOW
Sub-HOW
ConcreteDecoratorA
ConcreteDecoratorA
- addedState
+ Operation()
- AddedBehavior()
+ Operation()
public override void Operation()
{
base.Operation()
AddedBehavior()
}