[리팩토링]팩토리패턴과 데코레이터 패턴을 활용한 스타 프로리그 앱 리팩토링 하기

5월 17일, 최범균님과 함께 예전에 안드로이드로 만들었던 “스타 프로리그“앱을

오랜만에 꺼내서 리팩토링을 진행했다.

약 2시간 반동안 함께 코드리뷰를 하고 리팩토링을 하면서 얻은 가장 큰 성과는 바로

팩토리패턴“과 “데코레이터패턴“을 활용하여 기존에 쓸데없이 여기저기

흩어져있던 파일관련한 유틸클래스를 파일을 다루는 책임을 가진 한 곳으로 모아두어

코드의 가독성을 높이고 유지보수 효율을 좋게 만든 것이다.

===========================================================

우선, 리팩토링 이전에 전체적인 구조를 UML로 살펴보자.

20130517_리팩토링이전_UML

UML에서 보다시피, 각 3개의 액티비티들은 비동기로 데이터(파일 혹은 HTML)를 가져와

서 보여주는 추상클래스 AsyncDataViewer에게 FileUtils를 전달한다.

그리고, AsyncDataViewer를 구현한 3개의 콘크리트 클래스들은 액티비티에서 받은

FileUtils 객체를 이용해 상황에 맞게 File 데이터를 읽어오거나 저장하는 역할을 한다.

여기서의 가장 큰 문제는 바로 파일처리와 관련된 부분과 직접적으로 연관이 있지 않은

AsyncDataViewer에서 FileUtils 객체를 이용해 파일 관련된 처리를 하고 있다는 것이었다.

AsyncDataViewer는 단지 데이터를 가져와 보여주는 책임과 역할을 하는 것인데도 말이다.

그래서, 각 객체의 책임과 역할을 명확히 분리하고 쓸데없이 여기저기 흩어져있던  FileUtils

관련 코드를 제거하기 위해 “팩토리패턴“과 “데코레이터패턴“을 활용해 리팩토링을

진행했다.

===========================================================

먼저, 리팩토링 후의 UML을 다시 한번 살펴보자.

20130517_리팩토링이후1_UML

UML이 좀 복잡한데 하나씩 뜯어보면,

  • 데이터를 제공하는 인터페이스 StarLeagueDataProvider를 두고 각각 파일데이터와HTML데이터를 제공하는 2개의 구현체를 두었다.
  • AsyncDataViewer는 StarLeagueDataProviderFactory를 통해 StarLeagueDataProvider 구현체인 FileCacheStarLeagueDataProvider를 데이터의 파서로 이용한다. 이때, StarLeagueDataProvider의 구현체를 생성하는 곳에  “팩토리패턴”을 사용하여 한개의 객체만 생성되도록 구현하였다.
  • 그리고, StarLeagueDataProviderFactory에서 실질적으로 만들어진 FileCacheStarLeagueDataProvider객체에는 파일에 데이터가 없을 것을 대비해 실제 HTML페이지에서 데이터를 읽어오는 EsportSiteHtmlDataProvider 객체가 참조변수로 저장되어 있다.
  • 리팩토링 전에는, FileUtils 객체를 각기 액티비티에서 생성해 데이터를 가져와 보여주는 AsyncDataViewer에게 전달하여 그 안에서 파일을 읽고 저장하였다면, 리팩토링후에는 AsyncDataViewer에서 팩토리클래스를 만들어 원래 데이터 파서로 사용하던 EsportSiteHtmlDataProvider 대신 FileCacheStarLeagueDataProvider 객체를 생성해 사용하고 있다.
  • 이는, 기존에 HTML페이지를 파싱하기 전에 FileCacheStarLeagueDataProvider로 한번 감싸서 파일관련된 처리를 진행하고, 파일이 없으면 원래 HTML 파싱을 담당하던 EsportSiteHtmlDataProvider가 데이터를 가져오는 역할을 담당하게 된다.  곧, EsportSiteHtmlDataProvider전에 FileCacheStarLeagueDataProvider로 한번 감싸는 “데코레이터패턴”을 활용한 예이다.

이렇게 리팩토링을 한 덕분에,  각 액티비티들은 FileUtils객체를 생성해

AsyncDataViewer에게 전달하지 않아도 되고, AsyncDataViewer 또한 원래 역할인

데이터를 가져와 보여주는 것에 충실하게 되었다.

이 리팩토링에는 아래의 추상화도 한몫했다.

“데이터를 가져와 보여준다”

저 간단한 추상화 덕분에 StarLeagueDataProvider 인터페이스가 나왔고,

이를 구현한 두개의 콘크리트 클래스를 데코레이터 패턴을 활용해 중구난방 흩어져있던

파일과 관련된 처리를 하는 FileUtils 객체를 한곳에 모아 처리할 수 있게 되었다.

Advertisements

[리팩토링]팩토리패턴과 데코레이터 패턴을 활용한 스타 프로리그 앱 리팩토링 하기”에 대한 1개의 생각

  1. 핑백: [Android]스타크래프트 프로리그 소스 공개! | To the Professional Programmer

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

w

%s에 연결하는 중