RxJava是遺留程式碼的解藥 - PawełMatyjasik
遺留程式碼。我們都討厭它。因為它只能停留在舊技術上,有時候對程式碼進行即使輕微地更改也會導致您無法想象的錯誤。專業工程師不應該害怕遺產。
RxJava是一個庫,可以幫助您改善遺留專案的情況,並從建立的程式碼中獲得更多滿足感。
這一切都與Observables有關。
Observable是RxJava的基礎。這可能是什麼?,你可能會問。這是你可以觀察到的東西。你能看到什麼?任何你想要的。您可以對Collection,Future,Range中的單個元素建立Observable可觀察者,如String“Hello”。您可以將它們合併,合併它們。這就像衝浪。
Observable.just(“one”, “two”) .subscribe(System.out::println); Observable.fromIterable(Arrays.asList(“one”, “two”, “three”)) .subscribe(System.out::println); |
擁有Observable後,您可以在其上使用運算子,就像在Java中的流一樣。你擁有它們更多,它們就更多地為你提供了極大的靈活性。
getDataFromNetwork() // this method returns an Observable .skip(10) .take(5) .map(s -> s + “ transformed”) .subscribe(System.out::println); |
這裡有一個訂閱。這是您對資料執行某些操作的地方。如果我不訂閱Observable,會發生什麼事嗎?這取決於您的Observable是熱還是冷。冷的會等待訂閱它,熱的會立即開始收到。
遺產中的RxJava
現在,RxJava如何幫助您使用遺留程式碼?首先,許多遺留專案都使用Java <8的版本.RxJava的優點是,它適用於Java 6。
使用Java 6/7可能會引起一些抑鬱,因為它缺乏新的,酷的Java功能。在介紹RxJava時,您可以帶來一些新功能,編寫更多功能和非同步程式碼。你怎麼能改進你的程式碼?
讓我解釋一下背景。我們有一箇舊的客戶端應用程式,用Java 6編寫,與巨大的遺留程式碼庫相結合。UI是用Swing編寫的。每一個工作都很慢,改變程式碼是非常危險的,我們非常積極地為此做些什麼。本文中的示例在Java 8中,不要用舊的語法和匿名類來處理你的眼睛。所有這些都可以在Java 6中實現。
彈性
RxJava具有為您提供處理錯誤的極好方法的機制。最基本的是在處理資料流期間發生錯誤時簡單地執行操作。更高階的機制可以幫助您使應用程式更具有錯誤恢復能力:
- onErrorReturn - 如果發生錯誤,Observable將發出預設值,
- onErrorResumeNext - 如果上游失敗,使用另一個Observable,
- 重試 - 再試一次,也許這次它有效。
遺留專案通常是異常反模式編碼的。透過上述機制,可以更容易地封裝負責錯誤處理的邏輯,並避免將其合併到正常的程式執行流程中。
訊息驅動
遺留程式碼中的一個流行問題是元件之間的緊密耦合,以及義大利麵條架構。顯然,ReactiveX本身並不能解決這個問題,但它帶來了一些新的可能性。其中之一是將應用程式中的獨立元件與基於RxJava Observables的事件匯流排相連線。
這種事件匯流排結合了兩個介面:publisher和observable。Publisher負責觸發eventbus上的事件。如果元件需要觸發某些事件,則該元件將依賴於此介面。
interface EventBusPublisher { void userLoggedIn(Long userId); void moneyPayedIn(BigDecimal moneyAmount); void itemAddedToCart(Long itemId); } |
可觀察的介面可以監聽事件。當元件需要偵聽更改時,它將依賴於它。
interface EventBusObservable { Observable <Long> userLoggedIn(); Observable <BigDecimal> moneyPayedIn(); Observable <Long> itemAddedToCart(); } |
現在讓我們在EventBus類中實現這些介面。為了使其簡潔,您需要一個主題,它是ReactiveX中提供的抽象。主體既是觀察者又是被觀察者。因此,您可以觸發主題上的事件並能夠觀察這些專案。它實現了一個Observable被觀察介面,因此您可以在其上執行所有標準的RxJava工作流。要在主題上發出事件,請呼叫其onNext方法。要將其用作Observable,只需使用其例項即可。
class EventBus implements EventBusObservable, EventBusPublisher{ private final Subject<BigDecimal> moneyPayedIn = BehaviorSubject.create(); private final Subject<Long> userLoggedIn = BehaviorSubject.create(); private final Subject<Long> itemAddedToCart = BehaviorSubject.create(); @Override public Observable<BigDecimal> moneyPayedIn() { return moneyPayedIn; } @Override public void moneyPayedIn(BigDecimal moneyAmount) { moneyPayedIn.onNext(moneyAmount); } |
您應該使用哪種主題實現?這取決於您的需求。
BehaviorSubject向連線到它的訂戶發出最新事件和所有後續事件;您也可能更喜歡使用PublishSubject,它只發出訂閱伺服器連線後發生的事件或其他一些實現。所有決定權都在你手裡。
相關文章
- Parasoft Jtest——如何征服遺留程式碼
- 遺留程式碼處理技巧與案例演示
- 開發人員使用遺留程式碼庫指南
- 老舊系統重構技巧,輕鬆搞定遺留程式碼
- [實用指南] 如何使您的舊程式碼庫(遺留程式碼)符合MISRA C 2012編碼規範?
- [實用指南]如何使您的舊程式碼庫(遺留程式碼)符合MISRA C 2012編碼規範?
- 從300萬行到50萬行程式碼,遺留系統的微服務改造行程微服務
- Shopify如何使用Strangler Fig模式重構遺留程式碼中上帝式大物件?- Adrianna Chang模式物件
- AngularJS 遺留專案的升級改造之路(一)AngularJS
- 是解藥,也是毒藥:EVE和博彩的孽緣史
- 七種老舊遺留系統的整合模式 -Bozho模式
- WannaCry兩年後捲土重來,NSA遺留問題尚未解決
- retrofit如何配合Rxjava封裝程式碼RxJava封裝
- 通義靈碼實戰系列:一個新專案如何快速啟動,如何維護遺留系統程式碼庫?
- 如何把遺留的Java應用託管在Service Fabric中Java
- RxJava小考題 -- Rxjava原始碼分析(一)RxJava原始碼
- 薪資留人還是情感留人?
- .net網站自動化部署-致兩年前的遺留的問題網站
- WinRAR曝遺留19年重大漏洞,可完全控制電腦(附解決方法)
- RxJava2原始碼解讀之 Map、FlatMapRxJava原始碼
- 一個 sprint 測完後有一些遺留問題,到底是發版還是不發版?
- Linux遺忘root密碼的其中兩種解決方法Linux密碼
- RxJava + Retrofit原始碼解析RxJava原始碼
- 16年後微軟的“古董”復活!開發者用C#重構經典VB6 IDE,網友:遺留的“屎山”程式碼有救了...微軟C#IDE
- RxJava是如何實現訂閱關係的?RxJava
- Android RxJava:這是一份RxJava使用入門學習指南AndroidRxJava
- RxJava2原始碼分析RxJava原始碼
- 10章 RxJava原始碼分析RxJava原始碼
- 基於Python的遺傳演算法特徵約簡(附程式碼)Python演算法特徵
- 跳槽季,你是該跳,還是該留?
- 堅持與確定性:毒藥還是良藥?
- 遺傳演算法庫DEAP的示例程式碼的學習和分析演算法
- 通過程式碼解釋什麼是API,什麼是SDK?API
- 什麼樣的程式碼稱得上是好程式碼?
- Python-遺傳演算法君主交叉程式碼實現Python演算法
- 7-15 報數(留個題目,還沒寫程式碼)
- RxJava2 原始碼解析(一)RxJava原始碼
- Android Rxjava:圖解不一樣的詮釋AndroidRxJava圖解