RxJava是遺留程式碼的解藥 - PawełMatyjasik

banq發表於2019-01-15

遺留程式碼。我們都討厭它。因為它只能停留在舊技術上,有時候對程式碼進行即使輕微地更改也會導致您無法想象的錯誤。專業工程師不應該害怕遺產。

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,它只發出訂閱伺服器連線後發生的事件或其他一些實現。所有決定權都在你手裡。

相關文章