-
Notifications
You must be signed in to change notification settings - Fork 3
Compiled functions
Compiled repository의 데이터 처리 흐름은 비종속적(agnostic) (Result
wrapper를 제외하면) 데이터 구조이다. 실제로, 목록을 다루는 것은 매우 흔하다 (예를 들면, RecyclerView에서 사용하기 위해서). 특히 다음 과정은 네트워크를 통해 다운로드된 데이터의 목록을 제공(render)하는 처리에서 일반적이다:
- Data를 byte array로 다운로드한다.
- 데이터를 어떠한 객체 표현(object representation)으로 분석(parse)한다.
- 그 객체 표현에서 항목들을 추출한다.
- 각 아이템이 Adapter에게 제공 될 준비가 된 형태(UI 모델 객체)가 되도록 추가적인 변형을 수행한다. 그리고/또는, 목록에서 특정 항목들을 추가하거나 제외하는 필터링 작업을 수행한다.
- 결과로 나온 목록이 Adapter의 데이터 source가 되도록 한다
코더는 Compiled repository에 의해 호출 될 하나의 Function
에 첫 네 단계를 캡슐화하고, 다섯번째 단계를 그 UI 모델 객체들의 목록을 제공하는 repositiory에 대한 reaction안에 Updatable
로 구현하고자 할 것이다. 만약 대부분의 서브루틴들이 (예를 들어 데이터 모델을 UI 모델로 변형하는 것) 별도로 사용 가능하면, 전체 과정을 하나의 Function
에 랩핑하는 것은 대부분 boilerplate 코드이며 가독성에 영향을 줄 것이다.
Agera는 compiled repository와 동일한 형식으로 더 작고, 재사용된 operator들을 한 function에 엮어내기 위한 유틸리티를 제공한다 :
// 오직 타입 명료성을 위해, 다음은 더 작고, 재사용된 operator들이다:
Function<String, DataBlob> urlToBlob = …;
Function<DataBlob, List<ItemBlob>> blobToItemBlobs = …;
Predicate<ItemBlob> activeOnly = …;
Function<ItemBlob, UiModel> itemBlobToUiModel = …;
Function<List<UiModel>, List<UiModel>> sortByDateDesc = …;
Function<String, List<UiModel>> urlToUiModels =
Functions.functionFrom(String.class)
.apply(urlToBlob)
.unpack(blobToItemBlobs)
.filter(activeOnly)
.map(itemBlobToUiModel)
.morph(sortByDateDesc)
.thenLimit(5);
'재사용된'이라는 용어는 operator에 숨겨진 로직이 이미 코드 내부의 다른 곳에서 요구되었다는 것을 의미하며, 그것들이 compiled function에 도움이 되도록 만들기 위해서 operator intefaces로 감싸는데는 작업이 거의 필요하지 않는다. 반면 funcion compiler를 사용할 있도록 하기 위해서는 추가적인 Function/Predicate
정의들이 한 쌍 이상이 필요하기 때문에, 부가적인 오버헤드(추가적인 클래스들로 인한 컴파일 타임에서와 이 클래스들을 로딩하고 그들의 객체를 생성하고 그들을 compiled function으로 연결함으로 인한 런타임에서 둘 다)는 단순히 커스텀 Function
을 작성하는 것보다 나쁜 선택으로 만들 것이다. 코더가 사용을 고려할 수 있는 황금률 하나는 function compiler는 오직 코드 라인 수가 순-감소하는 결과를 낳을 때만 사용 되어야 한다는 것이다(필요한 추가 operator들을 고려해야 한다).
Function compiler는 FunctionCompilerStates
인터페이스 내부의 compiler state interface을 통해 제공된다. repository compiler를 사용하는 것처럼, function을 엮는 표현식(expression)은 중간에 끊겨서는 안된다.