鍍金池/ 教程/ Android/ Compiled functions
Custom observables
Compiled functions
Reactive programming
Reservoirs and parallelism
Incrementally Agerifying legacy code
Observables and updatables
Compiled repositories
Repositories

Compiled functions

compiled repository的數(shù)據(jù)處理流程可以做到數(shù)據(jù)類(lèi)型無(wú)關(guān)的(除了封裝的Result哈,ps:就是說(shuō)泛型唄)。 在實(shí)踐中, 很常見(jiàn)的list數(shù)據(jù)處理(比如 RecyclerView中)。尤其像下面這種典型的從網(wǎng)絡(luò)下載list數(shù)據(jù)的處理流:

  1. 下載數(shù)據(jù):byte[]類(lèi)型;
  2. 將byte[]解析成數(shù)據(jù)對(duì)象;
  3. 從數(shù)據(jù)對(duì)象中讀取內(nèi)容;
  4. 數(shù)據(jù)給UI層(比如 Adapter)展示前,對(duì)數(shù)據(jù)可以做一些轉(zhuǎn)換工作:對(duì)list進(jìn)行and、or、sort等任何集合篩選操作;
  5. 將結(jié)果集(list)設(shè)置為Adapter的數(shù)據(jù)源。

開(kāi)發(fā)者也許想把前4步封裝成一個(gè)函數(shù)Function,這個(gè)叫做:a compiled repository,然后用一個(gè) Updatable 作為repository的響應(yīng)實(shí)現(xiàn)第5步, 為UI提供list數(shù)據(jù)。如果大多數(shù)子程序都單獨(dú)編寫(xiě)UI模型轉(zhuǎn)換方法,勢(shì)必影響代碼可讀性 (比如:將領(lǐng)域模型數(shù)據(jù)轉(zhuǎn)換成UI模型數(shù)據(jù))。

Agera 為compiled repository提供了實(shí)用工具:編譯規(guī)模較小,可重用操作符,相同風(fēng)格:

// For type clarity only, the following are smaller, reused operators:
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);

所謂_reused_是指 operator背后的邏輯部分在別的地方需要使用到, 并且只需要一小點(diǎn)工作就可以包裝成有用的operator接口。此外,如果超過(guò)Function/Predicate的函數(shù)定義(ps:相對(duì)復(fù)雜的函數(shù)),更要使用function compiler, 要比簡(jiǎn)單寫(xiě)一個(gè)自定義的Function好的多,已經(jīng)發(fā)生的開(kāi)銷(xiāo) (編譯時(shí)間:編譯附加的類(lèi)的時(shí)間;運(yùn)行時(shí)時(shí)間:加載、創(chuàng)建、鏈接這些類(lèi)的時(shí)間)。使用function compiler可以有效減少代碼行。

function編譯器對(duì)應(yīng)的編譯器狀態(tài),定義在FunctionCompilerStates 接口中。 就像使用 [[repository compiler|Compiled-repositories]], 編譯function的表達(dá)式是不能中間中斷的.