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——如何征服遺留程式碼
- 遺留程式碼處理技巧與案例演示
- 重構遺留程式碼(11):終結篇
- 重構遺留程式碼(1):金牌大師
- 重構遺留程式碼(9):分析 Concerns
- 重構遺留程式碼(10):剖析長方法
- 重構遺留程式碼(7):識別表示層
- 如何在遺留程式碼基礎上開發
- 開發人員使用遺留程式碼庫指南
- 重構遺留程式碼(5):遊戲的可測試方法遊戲
- 重構遺留程式碼(6):進攻複雜的方法
- 重構遺留程式碼(2):魔術字串和常量字串
- 重構遺留程式碼(3):複雜的條件語句
- Rails遺留程式中最常犯的錯誤(上)AI
- Rails遺留程式中最常犯的錯誤(下)AI
- 老舊系統重構技巧,輕鬆搞定遺留程式碼
- 重構遺留程式碼(4):第一個單元測試
- 跟遺留程式碼打交道:幹掉頑固漏洞的簡單方式
- 讀《軟體驅魔》除錯和優化遺留程式碼的藝術除錯優化
- 企業C++大型系統遺留程式碼變遷的佈道之旅C++
- 遺留系統表的維護
- 重構遺留程式碼(8):一個整潔架構的依賴反轉架構
- [實用指南] 如何使您的舊程式碼庫(遺留程式碼)符合MISRA C 2012編碼規範?
- [實用指南]如何使您的舊程式碼庫(遺留程式碼)符合MISRA C 2012編碼規範?
- SOA解決方案中涉及的遺留系統的設計策略(4)
- 遺留系統的技術棧遷移
- 遺留系統:IT攻城獅永遠的痛
- 資料清理的遺留問題處理(二)
- 安裝Linux後的遺留問題(轉)Linux
- 從300萬行到50萬行程式碼,遺留系統的微服務改造行程微服務
- 七種老舊遺留系統的整合模式 -Bozho模式
- AngularJS 遺留專案的升級改造之路(一)AngularJS
- SQLServer錯誤程式碼及解釋(留著備用)SQLServer
- WannaCry兩年後捲土重來,NSA遺留問題尚未解決
- 遺留系統如何升級,重構成CQRS的模式模式
- SQL Server錯誤程式碼及解釋(留著備用)SQLServer
- Shopify如何使用Strangler Fig模式重構遺留程式碼中上帝式大物件?- Adrianna Chang模式物件
- WinRAR曝遺留19年重大漏洞,可完全控制電腦(附解決方法)