본문 바로가기

issue & tip

토비의 봄 TV 재사용성과 다이나믹 디스패치 그리고 더블디스패치

반응형

Dependency


의존관계(dependency relationship)

-Supplier의 변화가 Client에 영향을 주는 경우


Client ----------> Supplier


 -의존관계발생

 supplier가 Client의 필드

 supplier가 Client 메서드의 파라미터

 supplier가 Client의 로컬변수

 supplier로 메시지를 보냄



 재사용가능한? 객체지형 설계/개발

- Client는 재사용이 어렵다.

- Client는 컴포넌트/서비스가 될 수 없다.


 "컴포넌트란 이를 만든 개발자의 손이 미치지 않는 곳에서도,

 아무 변경없이, 필요에 따라 확장해서 사용될 수 있는 소프트웨어 덩어리다."


 "오브젝트 패턴은 런타임시에 바뀔 수 있는 (상속 관계보다) 더 동적인 오브젝트(의존) 관계를 다룬다."



 class패턴 상속을 기반

 Factory Method, Adaptor, Interperter Template Method


object패턴 composition 합성


컴파일 타임이 아니라 런타임시에 결정/구성되는 오브젝트 의존관계

1. 구현대신 인터페이스 사용

- 클래스(구현) 의존관계 제거

- 클래스에 대한 의존성은 생성 패턴처럼 3자에게 위임

2. 오브젝트합성(composition)사용

- 재사용성을 확보하기 위한 방법의 한가지(상속의 대안)

- 인터페이스 사용이 전제(블랙바스 재사용)

- 새롭고 복잡한 기능을 얻기 위해서 오브젝트를 조합/합성

- 런타임시에 다른 오브젝트에 대한 레퍼런스 획득

- 각 클래스가 캡슐화되고 자신의 역할에 충실하게 도와줌



Inversion of control

- Designing Reusable Classes 1988(랄프존슨)

- Object Oriented 컨텍스트

- Design Patterns (GoF)

클래스 스코프 : 화이트박스 프레임워크

오브젝트 스코프: 블랙박스 프레임워크

- Callback/EventDeriven



Class Dependency

C -----------> C


programming to Interface

C -----------> I


  I


C  C



Dynamic Method Dispatch

Double Dispatch

Visitor Pattern

Visitor Proxy Pattern(Hibernate)


Service svc = new MyServce1();

svc.run() //receiver parameter


List<Service> svc = Arrays.asList(new MyService1(), new MyService2());

svc.forEach(s -> s.run());

svc.forEach(Service::run);


Method signature

(name, parameter types)

이름과 파라미터

 return type은 메서드 시그니처가 아님

예)

String hello(int id) {return ""; }

List hello(int id) { return null; }


Method Type

(return type, method type parameter, method argument types, exception)

=> Method Reference


Double Dispatch

다이나믹 디스패치를 두번하는경우


스태틱 메서드 오버로딩

컴파일시 체크


스태틱 디스패치에서 사용


Double Dispatch

Multi Method

지원하는 언어

CommonLisp

Julia


다이나믹 디스패치 경우 성능이 스태틱 디스패치보다 떨어진다.등

초창기에는 안썼음 (인터페이스 쓰지마라)


타입 체킹하기에 복잡해서

싱글 디스패치로 사용했었음


비지터 패턴으로 불렸음


장점

새로운 연산을 추가할수 있음


단점

요소에 추가할 때 모두 추가해야함.



Proxy Visitor Pattern


repository.findXXX();

에서 가져온 오브젝트를 instancOf로 사용할수 없음

그래서 더블 디스패치를 사용하여 처리가능



package com.example.demo;


import java.util.Arrays;

import java.util.List;


public class Dispatch {


interface Post {

void postOn(Sms sms);

}

static class Text implements Post {

@Override

public void postOn(Sms sms) {

sms.post(this); // Visitor

}

}

static class Picture implements Post {

@Override

public void postOn(Sms sms) {

sms.post(this);

}

}

interface Sms {

void post(Text post);

void post(Picture post);

}

static class FaceBook implements Sms {

@Override

public void post(Text post) {

System.out.println("text-facebook");

}

@Override

public void post(Picture post) {

System.out.println("picture-facebook");

}

}

static class Twitter implements Sms {

@Override

public void post(Text post) {

System.out.println("text-Twitter");

}

@Override

public void post(Picture post) {

System.out.println("picture-Twitter");

}

}

public static void main(String[] args) {

List<Post> posts = Arrays.asList(new Text(), new Picture());

List<Sms> sms = Arrays.asList(new FaceBook(), new Twitter());

posts.forEach(p -> sms.forEach(s -> p.postOn(s)));

}

}



반응형

'issue & tip' 카테고리의 다른 글

인터페이스 기반 프로그래밍  (0) 2018.07.02
결합도  (0) 2018.05.17
응집도  (0) 2018.05.09
파일 입출력  (0) 2018.04.25
래퍼클래스와 제네릭  (0) 2018.04.24