코컴2 585p를 보던중 복잡한 if 문 대신 데이터 테이블을 활용하는 기법을 보던중..

 

 

이벤트 = 헤더 + 구체적 데이터

이벤트 헤더 테이블 = 이벤트 헤더 타입(key)에 따른 동작될 리스너들(value)의 집합

 

이벤트 처리

 1.이벤트가 있다면 가져온다.

 2.이벤트의 헤더를 읽는다.

 3.헤더로부터 이벤트의 종류를 해석한다.(열거형 decode)

 4.이벤트 헤더 테이블에서 동작할 연산(리스너)을 찾는다.

 5.해당 리스너를 수행한다.

 

awt 이벤트 멀티 캐스터의 동작과 유사하지 않은가..  위의 이벤트 헤더 테이블이 이벤트 소스 풀인가 머가 하는 개념일테고..

(실제 이벤트 핸들링은.. 옵저버패턴을 통한 콜백, 상속트리를 이용한 템플릿 메소드 패턴, 또 머있엇드라..아.. 리스너 생성자

 에 내가 정의한 리스너 넣어서 재정의 해주는게.. 아.. 그게 뭐였더라.. 데코레이터였나? 글고 내 리스너 재정의할때 편하게

 끔 어댑트 윈도우 리스너 머시기도 있었고 )

 

c에서 콜백용 함수 테이블을 만들어 사용했던걸 본 기억도 있다.(일반적인 메세지 처리에서 콜백형식 = awt.component(윈도

우,다이얼로그등)이 이벤트를 정의하고 클라이언트가 구독하는 방식으로, delegate를 통해 event에 내 메서드를 등록하는

방식이다)

 

 

****************************************************************

아래는 대박 설계?

****************************************************************

class AbstractField

{

   public abstract void readAndPrint(FieldData, FileStatus);
}

 

class FloatingPointField implements AbstractField

{

   protected final void readAndPrint(FieldData, FileStatus)

   {

       sysout(xxx);
    }
}

 

class IntergerField implements AbstractField

{...}

class StringField implements AbstractField

{...}

...

***************

 

 

 

enum FieldType

{

FieldType_FloatingPoint,

FieldType_Integer,

FieldType_String,

...
}

struct FieldData

{

String xxx

xxx xxx

...
}

 

struct FieldDescription

{

   FieldData fieldData;

   FieldType fieldType;
}

 

 

FieldDescription[] fieldDescription = FieldDescription.load(); //임의로

 

AbstractField[] fields = new AbstractField[5]; //매직 넘버는 안되지만 이해의 편의상

 

fields[FIELD_FLOATINGPOINT] = new FloatingPointField();

fields[FIELD_INTEGER] = new IntergerField();

fields[FIELD_STRING] = new StringField();

...

*******************

 

int fieldIndex = 1;

while( (fieldIndex <= numFieldIInMessage) && (fileStatus == OK) )

{

   fieldType = fieldDescription[fieldIndex].fieldType;

   fieldData = fieldDescription[fieldIndex].fieldData;
  

   fields[fieldType].readAndPrint(fieldData , fileStatus);
}

********************

 

반복적으로 볼것!

 

테이블을 이용해 비지니스 로직을 단순화 시키자!!

 

(2013/12/2추가) 아래의 RUBY의 스크립팅 처리 방식이 위와 같이 테이블을 만드는 방식 같다.

*************************************

(ex)

?

1
2
3
4
5
6
7
#ruby
  puts 'What is your name?'
  name = gets
  process_name(name)
  puts 'What is your quest?'
  quest = gets
  process_quest(quest)

 

******************************************

 

********************************************

추가로 0~17 =공통, 18,19,20... 65=개별적  66~?? =공통일때

0~17, 66~?를 하나의 키값으로 사상하는 방법

max( min( 66 , num) , 17)   <--- 아름다운 방법이다.

추가로 18,19,20,..65를 5단위로 쪼개서 사상하고 싶을때

num을 5로 나누고(왜냐하면 몫이 같을테니까) 적절하게 max() , min()을 조합해주면.. 이건 hash의 ?

 

그리고 595p의 인덱스 접근 방식에선 인덱스 테이블및 기타 참조 테이블을 활용해 주 데이터 테이블에 접근하는 효율성을

고찰하는데.. 이건db 테이블및 키값 설계 & select 할때 참조 키 선택에 따른 효율성과 같은 개념 아닌가? ㅎㄷㄷ

*************************

 

데코레이터 vs 스트레티지 패턴의 차이가 명확치 않다. 데코레이터가 생성자를 통해 특정 객체를 받아들이고 그 객체의 메서드를

자신의 메서드 이름으로 사용하는 거였나?  스트레티지도 다른 객체를 받아들여 자신의 행동을 변환시키는 거였고.. (Word , Format)  데코레이터는 메서드 동작을 동적으로 확장시키는 것이었다. 자신의 동작 a에 추가로 자신과 같은 타입의 다른 객체 b의 동작b'을 동적으로 받아서 추가로 사용하는 것 (한마디로 또다시 파생 시킬 필요없이 동작을 확장한다)

 

 

 

체크리스트:테이블을 활용한 기법들

1.복잡한 논리 코드에 대한 대안으로 테이블을 활용한 기법들을 고려해 보았는가

2.복잡한 상속 구조에 대한 대안으로 테이블을 활용한 기법들을 고려해 보았는가

3.코드를 변경하지 않고 데이터를 수정할 수 있도록 테이블의 데이터를 외부에 저장하여 실행시

  읽는 방법을 고려해 보았는가?(스크립트 처리)

4.직관적인 배열 인덱스를 통해서 직접적으로 테이블에 접근할 수 없다면(나이예제), 인덱스

  계산 코드를 코드에 중복하여 작성하는 대신 접근 키 계산 코드를 루틴으로 작성하였는가?

 

 

요점 정리

1.테이블은 복잡한 논리 코드와 상속 구조에 대한 대안을 제공한다. 만약 프로그램의 논리나 상속

  트리가 혼란스럽다고 생각한다면, 참조 테이블을 사용하여 단순화시킬 수 있는지 확인해 본다.

2.테이블을 사용할 때 고려해야 하는 한가지 핵심 사랑은 테이블 접근 방법을 결정하는 것이다.

  여러분은 직접 접근 방식이나 인덱스 접근 방식, 또는 단계적 접근 방식을 사용하여 테이블에 접근할 수 있다.

3.테이블을 사용할 때 고려해야 하는 또 다른 핵심 사항은 테이블에 입력할 내용을 결정하는 것이다.

by givingsheart 2014. 1. 1. 15:31