コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

リアクティブ拡張 (プログラミング)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
リアクティブ拡張から転送)

リアクティブ拡張: Reactive Extensions、Rx)とは、リアクティブプログラミングの概念に基づき、非同期プログラムのシーケンス処理を容易にするためのライブラリ群である[1][2][3][4]。リアクティブプログラミングとは、データのストリームやイベントに基づいた動作を重視するプログラミングパラダイムであり、リアクティブ拡張はこれを実現するための主要なツールの一つである[1][2][3][4]観測可能シーケンス(Observable)、観測者(Observer)、および購読(Subscription)といった基本概念を中核とし、データの流れを管理しやすくする機能を提供する。

リアクティブ拡張の主要な機能には、Observableの作成、データの変換、複数のデータストリームの組み合わせ、そしてエラーハンドリングが含まれる[1][2][3][4]。これらの機能により、非同期データの処理が直感的かつ柔軟に行えるようになっている。

また、リアクティブ拡張は多くのプログラミング言語に対応しており、それぞれの言語用に専用の実装が存在する。例えば、Python用のRxPY[5][6]Java用のRxJava[1][7]JavaScript用のRxJS[2][8].NET用のRx.NET[9][10]など、多岐に渡る言語で利用可能である。これにより、様々な環境やプロジェクトにおいてリアクティブプログラミングを採用することが可能である。

リアクティブ拡張の使用例としては、Webアプリケーションモバイルアプリケーションデスクトップアプリケーションなどが挙げられる[1][2][3][9]。これらの分野において、リアクティブ拡張はリアルタイムデータの処理や複雑な非同期処理の管理に大きな効果を発揮している。

さらに、他の非同期プログラミング技術との比較も重要である[1][2][3][9]コールバックプロミス(Promise)、フューチャー(Future)、エイシンク/アウェイト(async/await)といった技術と比較することで、リアクティブ拡張の利点と適用範囲をより深く理解することができる。また、Redux ObservableAkka Streamsなどの関連するフレームワークやライブラリとの関係も重要なポイントである[1][2][3][9]

リアクティブ拡張には多くのメリットがあるが、同時に課題も存在する[1][2][3][9]。例えば、コード可読性保守性の向上やエラーハンドリングの一元化といったメリットがある一方で、学習曲線の高さやデバッグの難しさといった課題もある。これらの点を考慮しながら、リアクティブ拡張を効果的に活用することが求められる。

このページでは、概要、基本概念、主要機能、リアクティブ拡張の実装、使用例、比較と関連技術、コミュニティとサポート、リアクティブ拡張のメリットと課題について詳述する。

概要

[編集]

リアクティブ拡張(: Reactive Extensions、Rx)は、非同期データストリームを扱うためのライブラリ群である[1][2][3][9]リアクティブプログラミングの概念に基づき、観測可能シーケンス(Observable)、観測者(Observer)、および購読(Subscription)を通じてデータの流れを管理する。

定義

[編集]

リアクティブ拡張とは、データストリームの処理を簡素化するためのツールセットであり、リアクティブプログラミングの一部として非同期データを効率的に処理する手段を提供する[1][2][3][9]

歴史と背景

[編集]

リアクティブ拡張は、Microsoftによって初めて開発され[1][2][3][9]、その後、多くのプログラミング言語やプラットフォームに対応するように進化してきた[1][2][3][4]。リアクティブプログラミングの概念は、イベント駆動型プログラミングデータフロープログラミングの影響を受けており、これらの考え方を発展させてリアクティブ拡張が形成された[1][2][3][9]

基本概念

[編集]

リアクティブ拡張(: Reactive Extensions、Rx)を理解するためには、リアクティブプログラミングの基本概念を把握することが重要である。このセクションでは、リアクティブプログラミングの基本的な考え方と、主要なコンポーネントである観測可能シーケンス(Observable)、観測者(Observer)、購読(Subscription)について触れる。

リアクティブプログラミングとは

[編集]

リアクティブプログラミングとは、データストリームやイベントの流れに基づいてシステムの動作を記述するプログラミングパラダイムである[1][11][12][13]。リアクティブプログラミングでは、データの変更やイベントの発生に応じてシステムがリアクティブ(敏感)に反応し、動作を更新する。この手法は、非同期データの処理を簡素化し、直感的なコードの記述を可能にする。

観測可能シーケンス(Observable)

[編集]

観測可能シーケンス(Observable)は、リアクティブ拡張における中心的なコンポーネントであり、データの流れを表現するために使用される[1][2][3][9]。Observableは、データの発生源として機能し、観測者(Observer)にデータをプッシュする。Observableは、様々な方法で作成でき、データストリームの処理や変換を行うための多数のメソッドを提供する。

観測者(Observer)

[編集]

観測者(Observer)は、Observableからデータを受け取り、そのデータに対してリアクティブに反応する役割をもつデザインパターンである[1][2][3][9]。Observerは、データの受信時に実行されるコールバック関数を定義し、データの処理や更新を行う。Observerは、次のデータ、エラー、および完了の三つのタイプの通知を受け取ることができる。

購読(Subscription)

[編集]

購読(Subscription)は、ObserverがObservableにデータの通知を受け取るための契約を表すデザインパターンである[1][2][3][9]。Subscriptionを通じて、ObserverはObservableのデータストリームにサブスクライブし、データの流れにリアクティブ(敏感)に反応する。Subscriptionは、データストリームの処理をキャンセルするための手段も提供し、不要になったデータストリームの購読を解除することができる。

主要機能

[編集]

リアクティブ拡張(: Reactive Extensions、Rx)は、非同期データストリームの処理を簡素化するために、多くの強力な機能を提供する。このセクションでは、主要な機能であるObservableの作成方法、データの変換処理、データストリームの組み合わせ、エラーハンドリングについて詳述する。

作成(Creation)

[編集]

リアクティブ拡張では、Observableの作成方法が豊富に用意されている。これにより、様々なデータソースからObservableを生成することができる[1][3]

Observableの作成方法

[編集]
  • just:一つまたは複数のアイテムを含むObservableを作成する。
  • from:リストや配列などの既存のデータ構造からObservableを作成する。
  • create:カスタムObservableを作成するために使用する。詳細な制御が可能。
  • interval:一定の時間間隔でアイテムを発行するObservableを作成する。
  • timer:特定の遅延時間後にアイテムを発行するObservableを作成する。

変換(Transformation)

[編集]

データの変換処理は、リアクティブプログラミングにおいて重要な役割を果たす。Observableのデータストリームを必要に応じて変換することで、複雑な処理をシンプルに実装できる[1][2][3][9]

  • マッピング(Mapping):マッピングは、Observableの各アイテムに関数を適用して変換する処理である。mapオペレーターを使用することで、入力データを別の形式に変換することができる。
  • フィルタリング(Filtering):フィルタリングは、特定の条件に基づいてObservableのアイテムを選別する処理である。filterオペレーターを使用して、条件を満たすアイテムのみを通過させることができる。
  • 集約(Aggregation):集約は、Observableのデータストリームをまとめて一つの結果にする処理である。reduceオペレーターを使用することで、アイテムを累積して一つの結果を生成する。

組み合わせ(Combining)

[編集]

複数のObservableを組み合わせることで、より複雑なデータストリームを構築することができる[1][2][3][9]

  • マージ(Merge):マージは、複数のObservableを一つに結合し、各Observableのアイテムを発行順に組み合わせる処理である。mergeオペレーターを使用する。
  • ジップ(Zip):ジップは、複数のObservableのアイテムを対応する位置でペアにして結合する処理である。zipオペレーターを使用することで、各Observableのアイテムをペアにして発行することができる。
  • エラーハンドリング(Error Handling):エラーハンドリングは、Observableのデータストリーム内でエラーが発生した場合に、適切に処理するための機能である。catchretryオペレーターを使用することで、エラー発生時の処理を定義し、エラーの影響を最小限に抑えることができる。

これらの主要機能を活用することで、リアクティブ拡張を用いた非同期データストリームの処理が効果的に行える。

リアクティブ拡張の実装

[編集]

リアクティブ拡張(: Reactive Extensions、Rx)は、多くのプログラミング言語で実装されており、各言語の特性に合わせたライブラリが提供されている。このセクションでは、主要な言語毎のリアクティブ拡張の実装について詳述する。

.NET用Rx(Reactive Extensions for .NET)

[編集]

リアクティブ拡張は、元々Microsoftによって.NET Framework用に開発された[1][2][3][9]。この実装はRx.NETと呼ばれ、.NETアプリケーションにおける非同期データストリームの処理を強力にサポートする。

Rx.NET(2009年、Microsoftによってリリース)

[編集]

Rx.NETは、.NET Frameworkと統合され、C#VB.NETなどの言語で利用可能である[9][10]。LINQ(Language Integrated Query)と深く統合されており、クエリ構文を使用して直感的にObservableの処理を記述することができる。豊富なオペレーターと拡張機能をもち、エラーハンドリングやスケジューリングのための強力な機能も提供する。

Python用Rx(Reactive Extensions for Python)

[編集]

Pythonにおけるリアクティブ拡張の実装はRxPYと呼ばれ、データサイエンスやWeb開発など多様な分野で利用されている。

RxPY(2012年リリース)

[編集]

RxPYは、Python環境で非同期データストリームを処理するためのライブラリである[5][6]。Pythonの標準ライブラリや他の人気ライブラリと統合しやすく、データ処理やイベント駆動プログラミングをシンプルに実装できる。豊富なオペレーターと直感的なAPIを提供し、Python開発者にとって強力なツールとなる。

Ruby用Rx(Reactive Extensions for Ruby)

[編集]

Rubyにおけるリアクティブ拡張の実装はRx.rbと呼ばれ、Rubyのシンプルで直感的なシンタックスを活かして非同期処理を行うことができる。

Rx.rb(2012年、Microsoftによってリリース)

[編集]

Rx.rbは、Ruby環境で非同期データストリームを処理するためのライブラリである[14][15]。イベント駆動型アプリケーションやリアルタイムデータ処理に適しており、Rubyの動的な特性とリアクティブプログラミングの利便性を組み合わせている。

Objective-C用Rx(Reactive Extensions for Objective-C)

[編集]

Objective-Cにおけるリアクティブ拡張の実装はRxObjCと呼ばれ、iOSおよびmacOSアプリケーション開発において利用される。

RxObjC(2013年、Microsoftによってリリース)

[編集]

RxObjCは、Objective-C環境で非同期データストリームを処理するためのライブラリである[16][17]Cocoaフレームワークと統合しやすく、ユーザーインターフェースのイベントやネットワークリクエストの処理をリアクティブ(敏感)に行うことができる。強力なオペレーターと直感的なAPIを提供し、Objective-C開発者にとって有用なツールである。

Java用Rx(Reactive Extensions for Java)

[編集]

Javaにおけるリアクティブ拡張の実装はRxJavaと呼ばれ、Androidアプリケーションやサーバーサイドの開発に広く利用されている。

RxJava(2013年、Netflixによってリリース)

[編集]

RxJavaは、Java環境で非同期データストリームを処理するためのライブラリである[1][7]スレッド管理やスケジューリングのための強力な機能を提供し、マルチスレッドアプリケーションの開発を容易にする。豊富なオペレーターを備え、リアクティブプログラミングの利点を活用することで、複雑な非同期処理をシンプルに実装できる。

Clojure用Rx(Reactive Extensions for Clojure)

[編集]

Clojureにおけるリアクティブ拡張の実装はRxClojureと呼ばれ、Clojureの関数型プログラミングの特性を活かして非同期データストリームを処理する。

RxClojure(2013年、Microsoftによってリリース)

[編集]

RxClojureは、Clojure環境で非同期データストリームを処理するためのライブラリである[18][19]。Clojureのイミュータブル(変更不可)データ構造とリアクティブプログラミングを組み合わせ、高い安全性と効率的な非同期処理を実現する。直感的なシンタックスと強力なオペレーターを提供する。

PHP用Rx(Reactive Extensions for PHP)

[編集]

PHPにおけるリアクティブ拡張の実装はRxPHPと呼ばれ、Web開発において非同期処理を効率的に実現するために利用される。

RxPHP(2014年リリース)

[編集]

RxPHPは、PHP環境で非同期データストリームを処理するためのライブラリである[20][21]。非同期I/O処理、リアルタイムデータ処理、複雑なデータフローの管理などに利用される。PHPの柔軟性とリアクティブプログラミングの利点を組み合わせ、シンプルかつ効率的な非同期処理を実現する。

Groovy用Rx(Reactive Extensions for Groovy)

[編集]

Groovyにおけるリアクティブ拡張の実装はRxGroovyと呼ばれ、Groovyの動的な特性を活かして非同期データストリームを処理する。

RxGroovy(2014年、RxJavaの拡張としてリリース)

[編集]

RxGroovyは、Groovy環境で非同期データストリームを処理するためのライブラリである[22][23]。Javaとの互換性があり、スクリプト言語としての柔軟性とリアクティブプログラミングの利便性を組み合わせている。豊富なオペレーターと直感的なAPIを提供する。

Scala用Rx(Reactive Extensions for Scala)

[編集]

Scalaにおけるリアクティブ拡張の実装はRxScalaと呼ばれ、Scalaの関数型プログラミングの特性を活かして非同期データストリームを処理する。

RxScala(2014年リリース)

[編集]

RxScalaは、Scala環境で非同期データストリームを処理するためのライブラリである[11][24]。Scalaの強力な型システムと高階関数を利用し、直感的かつ効率的な非同期プログラミングを実現する。RxJavaとの統合も容易であり、Javaエコシステムの利点を活かすことができる。

Swift用Rx(Reactive Extensions for Swift)

[編集]

Swiftにおけるリアクティブ拡張の実装はRxSwiftと呼ばれ、iOSアプリケーション開発において広く利用されている。

RxSwift(2014年リリース)

[編集]

RxSwiftは、Swift環境で非同期データストリームを処理するためのライブラリである[25][26]。iOSアプリケーションのユーザーインターフェースイベント、ネットワーキング、データバインディングなど、様々な非同期タスクをシンプルに実装できる。UIKitFoundationフレームワークと統合しやすく、直感的なAPIを提供する。

C++用Rx(Reactive Extensions for C++)

[編集]

C++におけるリアクティブ拡張の実装はRxCppと呼ばれ、パフォーマンス重視のアプリケーションにおいて利用されることが多い。

RxCpp(2015年、Microsoftによってリリース)

[編集]

RxCppは、C++環境で非同期データストリームを処理するためのライブラリである[27][28]。C++の高いパフォーマンスとリアクティブプログラミングの利便性を組み合わせ、効率的な非同期処理を実現する。強力な型システムを活用し、安全で高性能なコードを記述することができる。

JavaScript用Rx(Reactive Extensions for JavaScript)

[編集]

JavaScriptにおけるリアクティブ拡張の実装はRxJSと呼ばれ、Webアプリケーションの開発に広く利用されている。

RxJS(2015年リリース)

[編集]

RxJSは、JavaScript環境で非同期データストリームを処理するための強力なライブラリである[2][8]。イベントのハンドリング、AJAXリクエストの管理、リアクティブフォームの構築など、Web開発における多くの非同期タスクを簡素化する。RxJSは、多くのオペレーターとユーティリティ関数を提供し、直感的かつ効率的な非同期プログラミングを実現する。

Go用Rx(Reactive Extensions for Go)

[編集]

Goにおけるリアクティブ拡張の実装はRxGoと呼ばれ、Goの高い並行処理能力を活かして非同期データストリームを処理する。

RxGo(2015年リリース)

[編集]

RxGoは、Go環境で非同期データストリームを処理するためのライブラリである[29][30]。Goのゴルーチンとチャネルを利用して効率的な非同期処理を実現し、高パフォーマンスなリアクティブプログラミングを可能にする。簡潔なシンタックスと強力なオペレーターを提供する。

Dart用Rx(Reactive Extensions for Dart)

[編集]

Dartにおけるリアクティブ拡張の実装はRxDartと呼ばれ、特にFlutterフレームワークを使用したモバイルアプリケーション開発において利用されている。

RxDart(2015年、Googleによって社内プロジェクトとして開始)

[編集]

RxDartは、Dart環境で非同期データストリームを処理するためのライブラリである[31][32]。Flutterと統合することで、ユーザーインターフェースのリアクティブ(敏感)な更新やデータストリームの管理を容易にする。豊富なオペレーターと直感的なAPIを提供し、非同期タスクを簡単に実装できる。

TypeScript用Rx(Reactive Extensions for TypeScript)

[編集]

TypeScriptにおけるリアクティブ拡張の実装はRxTSと呼ばれ、型安全な非同期プログラミングをサポートする。

RxTS(2015年、Microsoftによってリリース)

[編集]

RxTSは、TypeScript環境で非同期データストリームを処理するためのライブラリである[33][34]。JavaScript用のRxJSと似たAPIをもちつつ、TypeScriptの型システムを活用してより安全なコードを記述できる。型情報に基づく自動補完やエラー検出が可能であり、開発効率を向上させる。RxTSは、Webアプリケーション開発における非同期処理の管理を大幅に簡素化する。

Kotlin用Rx(Reactive Extensions for Kotlin)

[編集]

Kotlinにおけるリアクティブ拡張の実装はRxKotlinと呼ばれ、特にAndroidアプリケーションの開発において利用されている。

RxKotlin(2017年、RxJava上に構築)

[編集]

RxKotlinは、Kotlin環境で非同期データストリームを処理するためのライブラリである[35][36]。RxJavaのラッパーとして機能し、Kotlin特有の機能とシンタックスを活用する。コルーチンとの相性がよく、よりシンプルで効率的な非同期プログラミングが可能である。

Rust用Rx(Reactive Extensions for Rust)

[編集]

Rustにおけるリアクティブ拡張の実装はRxRustと呼ばれ、安全性とパフォーマンスを重視した非同期処理を行うことができる。

RxRust(2020年リリース)

[編集]

RxRustは、Rust環境で非同期データストリームを処理するためのライブラリである[37][38]。Rustの所有権システムとリアクティブプログラミングを組み合わせ、高い安全性と効率的な非同期処理を実現する。豊富なオペレーターと型安全なAPIを提供する。

以上が主要なプログラミング言語におけるリアクティブ拡張の実装である。それぞれの言語に合わせた特徴的な機能とAPIをもち、非同期データストリームの処理を効率的に行うことができる。

使用例

[編集]

リアクティブ拡張(: Reactive Extensions、Rx)は、多種多様なアプリケーションでその威力を発揮する。以下に、Webアプリケーション、モバイルアプリケーション、およびデスクトップアプリケーションにおけるリアクティブ拡張の使用例を詳述する。

Webアプリケーションでの利用

[編集]

リアクティブ拡張は、Webアプリケーションの開発において、非同期データ処理をシンプルかつ効率的に行うための強力なツールである。特に以下のようなシナリオで活用される[2][39]

  • リアルタイムデータの更新WebSocketServer-Sent Eventsを使用したリアルタイムデータストリームの管理。
  • フォームのバリデーション:ユーザーの入力に基づくリアルタイムなフォームバリデーションとエラーメッセージの表示。
  • 非同期API呼び出し:AJAXリクエストの管理とレスポンス処理の一元化。
  • イベントストリームの処理:クリック、キーボード入力、スクロールなどのユーザーインタラクションをObservableとして扱い、非同期に処理。

RxJSは、JavaScriptでこれらのタスクを実装するために広く使用されており、AngularReactといったフレームワークやライブラリとも統合されている。

モバイルアプリケーションでの利用

[編集]

モバイルアプリケーション開発においても、リアクティブ拡張は非同期データ処理の簡素化とコードの保守性向上に役立つ。以下のシナリオでその効果が発揮される[40][41]

  • ユーザーインターフェースの更新:リアルタイムデータの変更に応じたユーザーインターフェースの動的な更新。
  • ネットワークリクエストの管理:API呼び出しやデータのフェッチ、キャッシュ処理。
  • センサーのデータストリーム処理GPS加速度センサージャイロセンサーなどのセンサーデータのリアクティブな処理。
  • フォーム入力の監視:リアルタイムの入力バリデーションやサジェスト機能の実装。

RxSwiftやRxJavaは、それぞれSwiftとJavaを使用したiOSおよびAndroidアプリケーションの開発において広く利用されている。

デスクトップアプリケーションでの利用

[編集]

デスクトップアプリケーションにおいても、リアクティブ拡張は非同期データストリームの処理をシンプルにするために利用される。特に以下のシナリオで効果を発揮する[4][6]

  • リアルタイムデータフィード株価やニュースフィードなどのリアルタイムデータの表示。
  • ファイルI/O操作:非同期のファイル読み書きやデータ処理。
  • ユーザーインターフェースの動的更新:ユーザーのアクションに応じたユーザーインターフェースの動的な変更。
  • バックグラウンド処理:非同期タスクのバックグラウンド実行と結果の通知。

Rx.NETやRxCppは、.NETおよびC++を使用したデスクトップアプリケーションの開発において、それぞれ広く利用されている。

比較と関連技術

[編集]

リアクティブ拡張(: Reactive Extensions、Rx)は、非同期データストリームの処理を効率的に行うための強力なツールであるが、他にも多くの非同期プログラミング技術が存在する。このセクションでは、リアクティブ拡張と他の非同期プログラミング技術との比較、および関連するフレームワークやライブラリについて詳述する。

他の非同期プログラミング技術との比較

[編集]

リアクティブ拡張は、多くの非同期プログラミング技術と比較されることがある。以下に、主要な技術との比較を示す。

コールバック(Callback)

[編集]

コールバックは、非同期処理が完了した際に呼び出される関数である。コールバックはシンプルで直感的だが、多数の非同期処理がネストする場合に「コールバック地獄」と呼ばれる複雑なコード構造になることがある。リアクティブ拡張は、Observableを使用することでコールバック地獄を回避し、コードの可読性と保守性を向上させる[42][43]

プロミス(Promise)

[編集]

プロミスは正確にはJavaScriptの概念を表すものであり、非同期処理の結果を表現するオブジェクトである[43][44][45][46]。デザインパターンではないという点が、他のリアクティブプログラミングの要素と異なる[5][44][47][48]

以下は書籍『You Don't Know JS: ES6 & Beyond』で述べられている、デザインパターンではないという説明の引用である。

"Promises and Futures are not design patterns, but rather fundamental constructs that aid in managing asynchronous code in JavaScript." — Chapter 4: Async Flow Control

プロミスは、成功時と失敗時の処理を簡潔に記述することができ、コールバックよりも構造化されたエラーハンドリングを提供するが、複数のプロミスを組み合わせる際にコードが複雑になることがある。リアクティブ拡張は、豊富なオペレーターを提供し、プロミスの制約を超えて柔軟な非同期処理を実現する[43][49]

フューチャー(Future)

[編集]

フューチャーは、将来の時点で完了する可能性のある値を表すオブジェクトである。プロミスと同様に、フューチャーは非同期処理の結果を簡潔に扱えるが、リアクティブ拡張は、フューチャーよりも複雑な非同期処理を扱うための機能が豊富である[11][50]

エイシンク/アウェイト(async/await)

[編集]

エイシンク/アウェイトは、非同期処理を同期的なコードスタイルで記述するための構文である。これにより、非同期処理が直感的に記述できるが、複数の非同期データストリームを組み合わせる場合に柔軟性が不足することがある。リアクティブ拡張は、Observableを使用することで、複雑な非同期データストリームの処理を簡潔かつ柔軟に実現する[5][51]

関連するフレームワークやライブラリ

[編集]

リアクティブ拡張は、多くの関連するフレームワークやライブラリと組み合わせて使用されることが多い。以下に、主要な関連技術を示す。

Redux Observable

[編集]

Redux Observableは、RxJSを使用してReduxミドルウェアとして動作するライブラリである[52][53]。これにより、Reduxストアのアクションをリアクティブ(敏感)に処理し、非同期データストリームを管理する。Redux Observableは、複雑な非同期処理をシンプルに記述でき、Reactアプリケーションにおいて広く利用されている。

Akka Streams

[編集]

Akka Streamsは、ScalaおよびJava向けのリアクティブストリーム処理フレームワークである[11][54]。Akka Streamsは、Akka Actorシステムと統合され、分散システムにおける高スループットのデータストリーム処理を実現する。リアクティブ拡張と同様に、Akka Streamsは豊富なオペレーターを提供し、複雑なデータフローの処理を簡素化する。

以上の比較と関連技術を通じて、リアクティブ拡張の特長と他の非同期プログラミング技術との違いを理解し、適切な技術選択を行うことが重要である。リアクティブ拡張は、非同期データストリームの処理を直感的かつ柔軟に行うための強力なツールである。

コミュニティとサポート

[編集]

リアクティブ拡張(: Reactive Extensions、Rx)は、広範なコミュニティと強力なサポート体制をもつ。以下に、リアクティブ拡張に関するオープンソースプロジェクト、ドキュメントチュートリアル、サポートフォーラムとコミュニティについて詳述する。

オープンソースプロジェクト

[編集]

リアクティブ拡張は、オープンソースとして開発され、多くのプラットフォームで利用可能である[1][2][3][4]GitHubなどのリポジトリで公開されており、誰でもプロジェクトに貢献することができる。主要なオープンソースプロジェクトとして、Rx.NET、RxJS、RxJava、RxSwiftなどがあり、各言語やプラットフォームに適した実装が提供されている。これにより、開発者はリアクティブ拡張の最新機能を利用し、コミュニティによる継続的な改善にアクセスできる。

ドキュメントとチュートリアル

[編集]

リアクティブ拡張には、公式ドキュメントや多くのチュートリアルが提供されており、初心者から上級者まで幅広いレベルの開発者が学習できる[1][33]。公式サイトでは、基本的な使い方から高度な使用例まで、詳細なガイドが掲載されている。また、リアクティブプログラミングに関する書籍やオンラインコースも多数存在し、リアクティブ拡張の理解を深めるためのリソースが豊富に揃っている。

サポートフォーラムとコミュニティ

[編集]

リアクティブ拡張には、活発なコミュニティとサポートフォーラムが存在する[1][3]Stack OverflowやGitHubのIssuesページ、Redditのサブレディットなど、多くのオンラインプラットフォームでリアクティブ拡張に関する質問や議論が行われている。これらのフォーラムでは、リアクティブ拡張の使用に関する問題解決やベストプラクティスの共有が行われており、開発者同士の交流が促進されている。また、リアクティブ拡張に特化したカンファレンスミートアップも定期的に開催されており、最新情報の共有やネットワーキングの機会が提供されている。

以上のように、リアクティブ拡張は、強力なコミュニティと豊富なサポート体制に支えられており、開発者が安心して利用できる環境が整っている。

リアクティブ拡張のメリットと課題

[編集]

メリット

[編集]

リアクティブ拡張は、多くのメリットを提供する。以下に主要なメリットを詳述する[1][3][9][33]

  • コードの可読性と保守性の向上:リアクティブ拡張を使用することで、非同期処理のコードが直感的かつ明確になる。Observableやオペレーターを利用することで、複雑な非同期処理のフローを簡潔に表現でき、コードの可読性が向上する。また、リアクティブプログラミングのパラダイムに基づくコードは、構造化されているため、保守性が高くなる。これにより、開発チームは効率的にコードを管理し、将来的な変更にも容易に対応できる。
  • エラーハンドリングの一元化:リアクティブ拡張は、エラーハンドリングを一元化するための強力なメカニズムを提供する。各Observableのストリームに対してエラーハンドリングオペレーターを適用することで、エラー処理を集中管理できる。これにより、エラーの発生源を特定しやすくなり、非同期処理の信頼性が向上する。例えば、catchretryオペレーターを使用してエラー処理や再試行ロジックを統一的に実装することが可能である。

課題

[編集]

リアクティブ拡張には、多くのメリットがある一方で、いくつかの課題も存在する。以下に主要な課題を詳述する[1][2][3][55]

  • 学習曲線の高さ:リアクティブプログラミングは、その概念やパラダイムが従来の命令型プログラミングとは異なるため、学習曲線が高い。特に、Observableの仕組みやオペレーターの使い方を理解するには時間がかかることがある。また、リアクティブ拡張の豊富な機能を使いこなすためには、一定の経験と理解が必要である。これにより、新規導入時には学習コストが発生する。
  • デバッグの難しさ:リアクティブ拡張を用いた非同期処理のデバッグは、従来の同期処理に比べて難易度が高い。非同期データストリームの流れを追跡し、問題箇所を特定するのは容易ではない。特に、複数のObservableが組み合わさった場合、デバッグはさらに複雑になる。このため、開発者はデバッグツールやログ情報を活用し、慎重にデバッグ作業を行う必要がある。

以上のように、リアクティブ拡張には多くのメリットがあるが、いくつかの課題も存在する。これらのメリットと課題を理解し、適切に対処することで、リアクティブ拡張を効果的に活用することができる。

出典

[編集]
  1. ^ a b c d e f g h i j k l m n o p q r s t u v w x y z aa Nurkiewicz, Tomasz; Christensen, Ben (2016-10-06) (英語). Reactive Programming with RxJava: Creating Asynchronous, Event-Based Applications. "O'Reilly Media, Inc.". ISBN 978-1-4919-3160-8. https://www.google.co.jp/books/edition/Reactive_Programming_with_RxJava/gYY1DQAAQBAJ?hl=ja&gbpv=1&dq=Reactive+Programming+with+RxJava&printsec=frontcover 
  2. ^ a b c d e f g h i j k l m n o p q r s t u v w Mansilla, Sergi (2018-02-05) (英語). Reactive Programming with RxJS 5: Untangle Your Asynchronous JavaScript Code. Pragmatic Bookshelf. ISBN 978-1-68050-553-5. https://www.google.co.jp/books/edition/Reactive_Programming_with_RxJS_5/pA9QDwAAQBAJ?hl=ja&gbpv=1&dq=Reactive+Programming+with+RxJS&printsec=frontcover 
  3. ^ a b c d e f g h i j k l m n o p q r s t u v w Forbes, Elliot (2017-08-16) (英語). Learning Concurrency in Python. Packt Publishing Ltd. ISBN 978-1-78728-316-9. https://www.google.co.jp/books/edition/Learning_Concurrency_in_Python/hJZGDwAAQBAJ?hl=ja&gbpv=1&dq=Learning+Concurrency+in+Python&printsec=frontcover 
  4. ^ a b c d e f Feiler, Jesse (2018-09-10) (英語). Beginning Reactive Programming with Swift: Using RxSwift, Amazon Web Services, and JSON with iOS and macOS. Apress. ISBN 978-1-4842-3621-5. https://www.google.co.jp/books/edition/Beginning_Reactive_Programming_with_Swif/FwFuDwAAQBAJ?hl=ja&gbpv=1&dq=Reactive+Programming+with+Swift&printsec=frontcover 
  5. ^ a b c d Fowler, Matthew (2022-03-15) (英語). Python Concurrency with asyncio. Simon and Schuster. ISBN 978-1-63835-708-7. https://www.google.co.jp/books/edition/Python_Concurrency_with_asyncio/M9xdEAAAQBAJ?hl=ja&gbpv=0 
  6. ^ a b c Nguyen, Quan (2018-11-27) (英語). Mastering Concurrency in Python: Create faster programs using concurrency, asynchronous, multithreading, and parallel programming. Packt Publishing Ltd. ISBN 978-1-78934-136-2. https://www.google.co.jp/books/edition/Mastering_Concurrency_in_Python/Tn18DwAAQBAJ?hl=ja&gbpv=1&dq=Mastering+Concurrency+in+Python&printsec=frontcover 
  7. ^ a b Morgillo, Ivan (2015) (英語). RxJava Essentials: Learn Reactive Programming to Create Awesome Android and Java Apps. Packt Publishing. ISBN 978-1-78439-910-8. https://www.google.co.jp/books/edition/RxJava_Essentials/IQzrsgEACAAJ?hl=ja 
  8. ^ a b Daniels, Paul; Atencio, Luis (2017-07-20) (英語). RxJS in Action. Simon and Schuster. ISBN 978-1-63835-170-2. https://www.google.co.jp/books/edition/RxJS_in_Action/mjszEAAAQBAJ?hl=ja&gbpv=1&dq=RxJS+in+Action&printsec=frontcover 
  9. ^ a b c d e f g h i j k l m n o p q Liberty, Jesse; Betts, Paul (2012-02-01) (英語). Programming Reactive Extensions and LINQ. Apress. ISBN 978-1-4302-3748-8. https://www.google.co.jp/books/edition/Programming_Reactive_Extensions_and_LINQ/EQVkDCMB0rMC?hl=ja&gbpv=1&dq=Programming+Reactive+Extensions+and+LINQ&printsec=frontcover 
  10. ^ a b Dresher, Tamir (2017-04-20) (英語). Rx.NET in Action. Simon and Schuster. ISBN 978-1-63835-703-2. https://www.google.co.jp/books/edition/Rx_NET_in_Action/4zczEAAAQBAJ?hl=ja&gbpv=1&dq=Rx.NET+in+Action&printsec=frontcover 
  11. ^ a b c d Sathyanarayanan, Prasanna Kumar; Atreya, Suraj (2016) (英語). Reactive Programming with Scala and Akka: Harness Reactive Programming to Build Scalable and Fault-tolerant Distributed Systems Using Scala and Akka. Packt Publishing. ISBN 978-1-78398-434-3. https://www.google.co.jp/books/edition/Reactive_Programming_with_Scala_and_Akka/W3msjwEACAAJ?hl=ja 
  12. ^ Allen, Jamie (2017-02-21) (英語). Reactive Design Patterns. Simon and Schuster. ISBN 978-1-63835-405-5. https://www.google.co.jp/books/edition/Reactive_Design_Patterns/xzozEAAAQBAJ?hl=ja&gbpv=1&dq=Reactive+Design+Patterns&printsec=frontcover 
  13. ^ Costa, Cecil (2016) (英語). Reactive Programming with Swift. Packt Publishing. ISBN 978-1-78588-426-9. https://www.google.co.jp/books/edition/Reactive_Programming_with_Swift/L6DkDAEACAAJ?hl=ja 
  14. ^ Perrotta, Paolo (2014) (英語). Metaprogramming Ruby 2. Pragmatic Bookshelf. ISBN 978-1-941222-75-1. https://www.google.co.jp/books/edition/Metaprogramming_Ruby_2/nGbHnQAACAAJ?hl=ja 
  15. ^ Metz, Sandi (2013) (英語). Practical Object-oriented Design in Ruby: An Agile Primer. Pearson Education. ISBN 978-0-321-72133-4. https://www.google.com/books/edition/_/rk9sAQAAQBAJ?sa=X&ved=2ahUKEwj5vvTk09CHAxVI0DQHHdEJGjoQ7_IDegQIDhAD 
  16. ^ Neuburg, Matt (2017-12-07) (英語). Programming iOS 11: Dive Deep into Views, View Controllers, and Frameworks. "O'Reilly Media, Inc.". ISBN 978-1-4919-9917-2. https://www.google.co.jp/books/edition/Programming_iOS_11/LThCDwAAQBAJ?hl=ja&gbpv=1&dq=Programming+iOS+11&printsec=frontcover 
  17. ^ Keur, Christian; Hillegass, Aaron (2017-07-16) (英語). IOS Programming: The Big Nerd Ranch Guide (6th Edition) (Big Nerd Ranch Guides). CreateSpace Independent Publishing Platform. ISBN 978-1-5489-4631-9. https://www.google.co.jp/books/edition/IOS_Programming/GzmlswEACAAJ?hl=ja 
  18. ^ Higginbotham, Daniel (2015) (英語). Clojure for the Brave and True. No Starch Press. ISBN 978-1-4571-9001-8. https://www.google.co.jp/books/edition/Clojure_for_the_Brave_and_True/yFBWAQAACAAJ?hl=ja 
  19. ^ Meier, Carin (2015-04-14) (英語). Living Clojure: An Introduction and Training Plan for Developers. "O'Reilly Media, Inc.". ISBN 978-1-4919-0929-4. https://www.google.com/books/edition/Living_Clojure/b4odCAAAQBAJ?hl=ja&gbpv=1&dq=Living+Clojure&printsec=frontcover 
  20. ^ Sikora, Martin (2017-03-24) (英語). PHP Reactive Programming. Packt Publishing Ltd. ISBN 978-1-78646-157-5. https://www.google.co.jp/books/edition/PHP_Reactive_Programming/cLkrDwAAQBAJ?hl=ja&gbpv=1&dq=inauthor:%22Martin+Sikora%22&printsec=frontcover 
  21. ^ Rahman, Mizanur (2017-05-26) (英語). PHP 7 Data Structures and Algorithms. Packt Publishing Ltd. ISBN 978-1-78646-357-9. https://www.google.co.jp/books/edition/PHP_7_Data_Structures_and_Algorithms/xHc5DwAAQBAJ?hl=ja&gbpv=1&dq=PHP+7+Data+Structures+and+Algorithms&printsec=frontcover 
  22. ^ Davis, Adam L. (2016-08-05) (英語). Learning Groovy. Apress. ISBN 978-1-4842-2117-4. https://www.google.co.jp/books/edition/Learning_Groovy/bc_MDAAAQBAJ?hl=ja&gbpv=1&dq=Learning+Groovy&printsec=frontcover 
  23. ^ Blackheath, Stephen (2016-07-26) (英語). Functional Reactive Programming. Simon and Schuster. ISBN 978-1-63835-341-6. https://www.google.co.jp/books/edition/Functional_Reactive_Programming/mTkzEAAAQBAJ?hl=ja&gbpv=1&dq=Functional+Reactive+Programming&printsec=frontcover 
  24. ^ Li, Haoyi (2020) (英語). Hands-on Scala Programming: Learn Scala in a Practical, Project-Based Way. Li Haoyi. ISBN 978-981-14-5693-0. https://www.google.co.jp/books/edition/Hands_on_Scala_Programming/XfjdzQEACAAJ?hl=ja 
  25. ^ Pillet, Florent; Junior, Bontognali; Todorov, Marin; Gardner, Scott (2017) (英語). RxSwift: Reactive Programming with Swift. Razeware LLC.. ISBN 978-1-942878-46-9. https://www.google.co.jp/books/edition/RxSwift/eXRJswEACAAJ?hl=ja 
  26. ^ Hoffman, Jon (2019-04-30) (英語). Mastering Swift 5: Deep dive into the latest edition of the Swift programming language, 5th Edition. Packt Publishing Ltd. ISBN 978-1-78913-273-1. https://www.google.co.jp/books/edition/Mastering_Swift_5/YCyWDwAAQBAJ?hl=ja&gbpv=1&dq=Mastering+Swift+5&printsec=frontcover 
  27. ^ Pai, Praseed; Abraham, Peter (2018-06-29) (英語). C++ Reactive Programming: Design concurrent and asynchronous applications using the RxCpp library and Modern C++17. Packt Publishing Ltd. ISBN 978-1-78862-424-4. https://www.google.co.jp/books/edition/C++_Reactive_Programming/MMNiDwAAQBAJ?hl=ja&gbpv=1&dq=C+++Reactive+Programming&printsec=frontcover 
  28. ^ Meyers, Scott (2016-03-09) (英語). Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14. CreateSpace Independent Publishing Platform. ISBN 978-1-5304-4538-7. https://www.google.co.jp/books/edition/_/SYm8DAEACAAJ?hl=ja&sa=X&ved=2ahUKEwi7wai409CHAxUyqFYBHeDsDIoQ7_IDegQIDBAF 
  29. ^ Cox-Buday, Katherine (2017) (英語). Concurrency in Go: Tools & Techniques for Developers. O'Reilly Media, Incorporated. ISBN 978-1-4919-4129-4. https://www.google.co.jp/books/edition/Concurrency_in_Go/qmzqswEACAAJ?hl=ja 
  30. ^ Ryer, Mat (2016-10-27) (英語). Go Programming Blueprints. Packt Publishing Ltd. ISBN 978-1-78646-247-3. https://www.google.co.jp/books/edition/Go_Programming_Blueprints/15XcDgAAQBAJ?hl=ja&gbpv=1&dq=Go+Programming+Blueprints&printsec=frontcover 
  31. ^ Rose, Richard (2022-12-15) (英語). Flutter and Dart Cookbook. "O'Reilly Media, Inc.". ISBN 978-1-0981-1948-5. https://www.google.co.jp/books/edition/Flutter_and_Dart_Cookbook/UzaiEAAAQBAJ?hl=ja&gbpv=1&dq=Flutter+and+Dart+Cookbook&printsec=frontcover 
  32. ^ Windmill, Eric (2020-01-07) (英語). Flutter in Action. Simon and Schuster. ISBN 978-1-63835-643-1. https://www.google.co.jp/books/edition/Flutter_in_Action/EzgzEAAAQBAJ?hl=ja&gbpv=1&dq=Flutter+in+Action&printsec=frontcover 
  33. ^ a b c Oliveira, Erich de Souza (2017-05-26) (英語). Mastering Reactive JavaScript. Packt Publishing Ltd. ISBN 978-1-78646-346-3. https://www.google.co.jp/books/edition/Mastering_Reactive_JavaScript/nnc5DwAAQBAJ?hl=ja&gbpv=1&dq=Mastering+Reactive+JavaScript&printsec=frontcover 
  34. ^ Cherny, Boris (2019-04-25) (英語). Programming TypeScript: Making Your JavaScript Applications Scale. "O'Reilly Media, Inc.". ISBN 978-1-4920-3762-0. https://www.google.co.jp/books/edition/Programming_TypeScript/Y-mUDwAAQBAJ?hl=ja&gbpv=1&dq=Programming+TypeScript&printsec=frontcover 
  35. ^ Greenhalgh, David; Skeen, Josh; Bailey, Andrew (2021-10-05) (英語). Kotlin Programming: The Big Nerd Ranch Guide. Pearson Technology Group. ISBN 978-0-13-687048-7. https://www.google.co.jp/books/edition/Kotlin_Programming/FNrPEAAAQBAJ?hl=ja&gbpv=1&dq=Kotlin+Programming:+The+Big+Nerd+Ranch+Guide&printsec=frontcover 
  36. ^ Vermeulen, Marco; Bjarnason, Rúnar; Chiusano, Paul (2021-10-05) (英語). Functional Programming in Kotlin. Simon and Schuster. ISBN 978-1-63835-097-2. https://www.google.co.jp/books/edition/Functional_Programming_in_Kotlin/fvk_EAAAQBAJ?hl=ja&gbpv=1&dq=Functional+Programming+in+Kotlin&printsec=frontcover 
  37. ^ McNamara, Tim (2021-09-07) (英語). Rust in Action. Simon and Schuster. ISBN 978-1-63835-622-6. https://www.google.co.jp/books/edition/Rust_in_Action/AfQ1EAAAQBAJ?hl=ja&gbpv=1&dq=Rust+in+Action&printsec=frontcover 
  38. ^ Blandy, Jim; Orendorff, Jason; Tindall, Leonora (2021) (英語). Programming Rust, 2nd Edition. O'Reilly Media, Incorporated. https://www.google.co.jp/books/edition/Programming_Rust_2nd_Edition/BU1YzQEACAAJ?hl=ja 
  39. ^ Bernhardt, Manuel (2016-06-27) (英語). Reactive Web Applications: Covers Play, Akka, and Reactive Streams. Simon and Schuster. ISBN 978-1-63835-339-3. https://www.google.co.jp/books/edition/Reactive_Web_Applications/hTkzEAAAQBAJ?hl=ja&gbpv=1&dq=Reactive+Web+Applications&printsec=frontcover 
  40. ^ Masiello, Eric; Friedmann, Jacob (2017-01-11) (英語). Mastering React Native. Packt Publishing Ltd. ISBN 978-1-78588-979-0. https://www.google.co.jp/books/edition/Mastering_React_Native/A1QoDwAAQBAJ?hl=ja&gbpv=1&dq=Mastering+React+Native&printsec=frontcover 
  41. ^ Windmill, Eric (2020-01-07) (英語). Flutter in Action. Simon and Schuster. ISBN 978-1-63835-643-1. https://www.google.co.jp/books/edition/Flutter_in_Action/EzgzEAAAQBAJ?hl=ja&gbpv=1&dq=Flutter+in+Action&printsec=frontcover 
  42. ^ Crockford, Douglas (2017-07-17) (英語). JavaScript: The Good Parts. CreateSpace Independent Publishing Platform. ISBN 978-1-5489-5545-8. https://www.google.com/books/edition/_/NEVvswEACAAJ?sa=X&ved=2ahUKEwiY1unA2dCHAxWbmq8BHe2oJ3UQ7_IDegQIKRA0 
  43. ^ a b c Haverbeke, Marijn (2018-12-04) (英語). Eloquent JavaScript, 3rd Edition: A Modern Introduction to Programming. No Starch Press. ISBN 978-1-59327-951-6. https://www.google.co.jp/books/edition/Eloquent_JavaScript_3rd_Edition/FSVTDwAAQBAJ?hl=ja&gbpv=1&dq=Eloquent+JavaScript&printsec=frontcover 
  44. ^ a b Simpson, Kyle (2015-12-17) (英語). You Don't Know JS: ES6 & Beyond. "O'Reilly Media, Inc.". ISBN 978-1-4919-0525-8. https://www.google.co.jp/books/edition/You_Don_t_Know_JS_ES6_Beyond/iOc6CwAAQBAJ?hl=ja&gbpv=1&dq=You+Don't+Know+JS:+ES6+&+Beyond&printsec=frontcover 
  45. ^ Brown, Ethan (2016-02-17) (英語). Learning JavaScript: JavaScript Essentials for Modern Application Development. "O'Reilly Media, Inc.". ISBN 978-1-4919-1493-9. https://www.google.co.jp/books/edition/Learning_JavaScript/JUOWCwAAQBAJ?hl=ja&gbpv=1&dq=Learning+JavaScript:+JavaScript+Essentials+for+Modern+Application+Development&printsec=frontcover 
  46. ^ Zakas, Nicholas C. (2016-08-16) (英語). Understanding ECMAScript 6: The Definitive Guide for JavaScript Developers. No Starch Press. ISBN 978-1-59327-757-4. https://www.google.co.jp/books/edition/Understanding_ECMAScript_6/6Ze7DQAAQBAJ?hl=ja&gbpv=1&dq=Understanding+ECMAScript+6:+The+Definitive+Guide+for+JavaScript+Developers&printsec=frontcover 
  47. ^ Goetz, Brian (2006) (英語). Java Concurrency in Practice. Addison-Wesley. ISBN 978-0-321-34960-6. https://www.google.co.jp/books/edition/Java_Concurrency_in_Practice/6LpQAAAAMAAJ?hl=ja&gbpv=1&bsq=Java+Concurrency+in+Practice&dq=Java+Concurrency+in+Practice&printsec=frontcover 
  48. ^ Albahari, Joseph; Albahari, Ben (2015) (英語). C# 6.0 in a Nutshell. O'Reilly. https://www.google.co.jp/books/edition/C_6_0_in_a_Nutshell/IqS8zwEACAAJ?hl=ja 
  49. ^ Flanagan, David (2020-05-14) (英語). JavaScript: The Definitive Guide: Master the World's Most-Used Programming Language. "O'Reilly Media, Inc.". ISBN 978-1-4919-5198-9. https://www.google.co.jp/books/edition/JavaScript_The_Definitive_Guide/NPbkDwAAQBAJ?hl=ja&gbpv=1&printsec=frontcover 
  50. ^ González, Javier Fernández (2016-02-29) (英語). Mastering Concurrency Programming with Java 8. Packt Publishing Ltd. ISBN 978-1-78588-546-4. https://www.google.co.jp/books/edition/Mastering_Concurrency_Programming_with_J/x21LDAAAQBAJ?hl=ja&gbpv=1&dq=Mastering+Concurrency+Programming+with+Java+8&printsec=frontcover 
  51. ^ Slatkin, Brett (2019-10-25) (英語). Effective Python: 90 Specific Ways to Write Better Python. Addison-Wesley Professional. ISBN 978-0-13-485459-5. https://www.google.co.jp/books/edition/Effective_Python/9kG4DwAAQBAJ?hl=ja&gbpv=1&dq=Effective+Python:+90+Specific+Ways+to+Write+Better+Python&printsec=frontcover 
  52. ^ Banks, Alex; Porcello, Eve (2020-06-12) (英語). Learning React: Modern Patterns for Developing React Apps. "O'Reilly Media, Inc.". ISBN 978-1-4920-5169-5. https://www.google.co.jp/books/edition/Learning_React/tDjrDwAAQBAJ?hl=ja&gbpv=1&dq=Learning+React&printsec=frontcover 
  53. ^ Accomazzo, Anthony; Murray, Nate; Lerner, Ari (2017-03) (英語). Fullstack React: The Complete Guide to ReactJS and Friends. Fullstack.io. ISBN 978-0-9913446-2-8. https://www.google.co.jp/books/edition/Fullstack_React/ppjUtAEACAAJ?hl=ja 
  54. ^ Roestenburg, Raymond; Williams, Rob; Bakker, Robertus (2016-09-20) (英語). Akka in Action. Simon and Schuster. ISBN 978-1-63835-293-8. https://www.google.co.jp/books/edition/Akka_in_Action/QTozEAAAQBAJ?hl=ja&gbpv=1&dq=Akka+in+Action&printsec=frontcover 
  55. ^ Tsvetinov, Nickolay (2015-06-24) (英語). Learning Reactive Programming with Java 8. Packt Publishing Ltd. ISBN 978-1-78528-250-8. https://www.google.co.jp/books/edition/Learning_Reactive_Programming_with_Java/5GT9CQAAQBAJ?hl=ja&gbpv=1&dq=Learning+Reactive+Programming+with+Java+8&printsec=frontcover 

関連項目

[編集]