가끔 조건문에 따라 다른걸 생성할때 if else 노가다를 쓴다.

그리고 어느순간 코딩량이 늘어나고 가독성이 떨어지면서 고민에 빠진다.


그러면서 몇가지 단계를 거치는데 보통 다형성과 switch문에서 머물게 된다.  (내가 그랬다)


(처음) if elseif 노가다로 분기한다.

if ( "xls".equals(filetype) ) {

    ~~~~

}

else if ("ppt".equals(filetype) {

    ~~~~

}

else if ("html".equals(filetype) {

   ~~~~

}else {

   ~~~~

}




(진화 1단계) switch문을 쓴다. (enum을 섞어서 쓰기시작한다)

TextExtractor txtExt = null;


switch (fileType)

{

case DOC:

txtExt = new DOCTextExtractor();

break;


... 생략.... 

case PPT:

txtExt = new PPTTextExtractor();

break;


case HTML:

txtExt = new HTMLTextExtractor();

break;


default:

break;


}

그런데... 가독성은 좋은데... 코딩 노가다는 똑같다.

그러다가 IBATIS 소스를 우연히 보다가 유사한 케이스를 발견했다.





(진화:2단계) MAP을 이용한 방법 예제


public class TextExtractorFactory

{

static Map <FILETYPE, TextExtractor> EXTRACTOR_DIC = new HashMap<FILETYPE,TextExtractor> ();

static {

EXTRACTOR_DIC.put(FILETYPE.DOC,  new DOCTextExtractor());

EXTRACTOR_DIC.put(FILETYPE.XLS,  new XLSTextExtractor());

...생략...

EXTRACTOR_DIC.put(FILETYPE.PPTX,  new PPTXTextExtractor());

EXTRACTOR_DIC.put(FILETYPE.HTML,  new HTMLTextExtractor());

}


public TextExtractor createExtractor(FILETYPE fileType) throws IOException

{

TextExtractor txtExt = EXTRACTOR_DIC.get(fileType);

if(txtExt == null)

{

throw new IOException("input file type is not valid");

}

return txtExt; 

}

}


사실 IBATIS에서 MAP을 사용해서 분기를 처리하는 구조를 보고 나는 깜짝놀랐다... 

물론... 주의할것이... 해당 클래스(여기서는 TextExtractor 가 되겠)에 상태값이 유지되어 결과가 나오는 구조라면...

병렬처리시 문제가 될수 있다. (동일한 클래스의 인스턴스가 공유되는 구조이므로)


이때는 clone() 형태로 복제된 인스턴스를 리턴하거나.  뭐 그래야겠지?





+ Recent posts