ReactiveCocoa vs RxSwift - pro dan kontra?

256

Jadi sekarang dengan cepat, orang-orang ReactiveCocoa telah menulis ulang dalam versi 3.0 untuk cepat

Juga, ada proyek lain yang disebut RxSwift .

Saya bertanya-tanya apakah orang dapat menambahkan informasi tentang apa perbedaan dalam desain / api / filosofi dari dua kerangka kerja (tolong, dalam semangat SO, tetap berpegang pada hal-hal yang benar, daripada pendapat tentang yang "terbaik")

[Catatan untuk mod StackOverflow: Pertanyaan ini TIDAK memiliki jawaban pasti, jawabannya adalah perbedaan antara dua kerangka kerja. Saya pikir itu juga sangat pada topik untuk SO]

Untuk memulai, kesan awal saya dari membaca ReadMe mereka adalah:

  • Sebagai seseorang yang akrab dengan C # Rx "nyata" dari microsoft, RxSwift terlihat jauh lebih dikenal.
  • ReactiveCococa tampaknya telah pergi ke ruang sendiri sekarang, memperkenalkan abstraksi baru seperti Sinyal vs SignalProducers dan Lifting. Di satu sisi ini sepertinya memperjelas beberapa situasi (apa itu sinyal Panas vs Dingin) tetapi di sisi lain ini tampaknya menambah kompleksitas kerangka kerja BANYAK
Orion Edwards
sumber
Pertanyaan Anda secara khusus menanyakan "pendapat". Bisakah Anda menulis ulang? Saya akan dengan senang hati menarik kembali suara dekat saya.
Sulthan
2
Anda dapat menyingkirkan "tambahkan pendapat mereka", karena perbedaannya adalah fakta, bukan opini. Kemudian Anda dapat menyukai atau tidak menyukai beberapa fitur RAC / RxSwift, tetapi perbedaannya sangat jelas.
bontoJR
1
hahaha, langkah bagus mengenai "note to mods"!
ming yeow
1
Ganti nama pertanyaan: Perbedaan antara ReactiveCocoa dan RxSwift. Saya pikir semuanya akan menjadi "fakta", dan pertanyaan ini adalah warisan.
hqt
1
Bahkan solusinya dimulai dengan "Ini pertanyaan yang sangat bagus." : |
Iulian Onofrei

Jawaban:

419

Ini pertanyaan yang sangat bagus. Membandingkan dua dunia itu sangat sulit. Rx adalah port dari apa ekstensi reaktif dalam bahasa lain seperti C #, Java atau JS.

Kakao Reaktif diilhami oleh Pemrograman Reaktif Fungsional , tetapi dalam beberapa bulan terakhir, juga telah ditunjuk sebagai terinspirasi oleh Ekstensi Reaktif . Hasilnya adalah kerangka kerja yang berbagi beberapa hal dengan Rx, tetapi memiliki nama dengan asal di FRP.

Hal pertama yang saya katakan adalah bahwa baik RAC maupun RxSwift bukanlah implementasi Pemrograman Reaktif Fungsional , menurut definisi konsep Conal . Dari titik ini semuanya dapat direduksi menjadi bagaimana setiap kerangka kerja menangani efek samping dan beberapa komponen lainnya.

Mari kita bicara tentang komunitas dan hal - hal meta-tech :

  • RAC adalah proyek berusia 3 tahun, lahir di Objective-C yang kemudian diangkut ke Swift (dengan jembatan) untuk rilis 3.0, setelah sepenuhnya menghentikan pekerjaan yang sedang berlangsung di Objective-C.
  • RxSwift adalah proyek lama beberapa bulan dan tampaknya memiliki momentum di komunitas saat ini. Satu hal yang penting untuk RxSwift adalah bahwa berada di bawah organisasi ReactiveX dan bahwa semua implementasi lainnya bekerja dengan cara yang sama, belajar bagaimana menangani RxSwift akan membuat bekerja dengan Rx.Net, RxJava atau RxJS tugas sederhana dan hanya masalah sintaks bahasa. Bisa dibilang filosofi belajar sekali, berlaku di mana-mana .

Sekarang saatnya untuk hal-hal teknologi.

Memproduksi / Mengamati Entitas

RAC 3.0 memiliki 2 entitas utama, Signaldan SignalProducer, yang pertama menerbitkan acara terlepas dari pelanggan terpasang atau tidak, yang kedua mengharuskan startuntuk benar-benar memiliki sinyal / acara yang dihasilkan. Desain ini telah dibuat untuk memisahkan konsep membosankan dari panas dan dingin yang dapat diamati, yang telah menjadi sumber kebingungan bagi banyak pengembang. Inilah sebabnya mengapa perbedaan dapat dikurangi menjadi bagaimana mereka mengelola efek samping .

Dalam RxSwift, Signaldan SignalProducerditerjemahkan ke Observable, itu bisa terdengar membingungkan, tetapi 2 entitas ini sebenarnya hal yang sama di dunia Rx. Sebuah desain dengan Observables dalam RxSwift harus dibuat mempertimbangkan apakah mereka panas atau dingin, itu bisa terdengar sebagai kompleksitas yang tidak perlu, tetapi begitu Anda mengerti bagaimana mereka bekerja (dan lagi panas / dingin / hangat hanya tentang efek samping saat berlangganan / mengamati ) mereka dapat dijinakkan.

Di kedua dunia, konsep berlangganan pada dasarnya sama, ada satu perbedaan kecil yang diperkenalkan RAC dan adalah interruptionperistiwa ketika a Signaldibuang sebelum acara penyelesaian telah dikirim. Untuk rekap keduanya memiliki jenis acara berikut:

  • Next, untuk menghitung nilai yang diterima baru
  • Error, untuk menghitung kesalahan dan menyelesaikan streaming, berhenti berlangganan semua pengamat
  • Complete, untuk menandai aliran sebagai selesai, berhenti berlangganan semua pengamat

RAC juga telah interrupteddikirim ketika Signaldibuang sebelum menyelesaikan dengan benar atau dengan kesalahan.

Menulis Secara Manual

Dalam RAC, Signal/ SignalProduceradalah entitas read-only, mereka tidak dapat dikelola dari luar, hal yang sama untuk Observabledi RxSwift. Untuk mengubah Signal/ SignalProducermenjadi entitas yang dapat ditulis, Anda harus menggunakan pipe()fungsi untuk mengembalikan item yang dikontrol secara manual. Di ruang Rx, ini adalah jenis yang berbeda yang disebut Subject.

Jika konsep baca / tulis terdengar asing, analogi yang bagus dengan Future/ Promisedapat dibuat. A Futureadalah placeholder hanya-baca, seperti Signal/ SignalProducerdan Observable, di sisi lain, a Promisedapat dipenuhi secara manual, seperti untuk pipe()dan Subject.

Penjadwal

Entitas ini cukup mirip di kedua dunia, konsep yang sama, tetapi RAC bersifat serial saja, sebaliknya fitur RxSwift juga penjadwal bersamaan.

Komposisi

Komposisi adalah fitur utama dari Pemrograman Reaktif. Menyusun stream adalah esensi dari kedua framework, dalam RxSwift, mereka juga disebut urutan .

Semua entitas yang dapat diamati dalam RxSwift adalah tipe ObservableType, jadi kami membuat instance dari Subjectdan Observabledengan operator yang sama, tanpa perhatian ekstra.

Di ruang RAC, Signaldan SignalProducerada 2 entitas yang berbeda dan kita haruslift di SignalProducerdapat menulis apa yang diproduksi dengan contoh Signal. Kedua entitas memiliki operator sendiri, jadi ketika Anda perlu mencampur hal-hal, Anda harus memastikan operator tertentu tersedia, di sisi lain Anda lupa tentang panas / dingin yang bisa diamati.

Tentang bagian ini, Colin Eberhardt menyimpulkannya dengan baik:

Melihat API saat ini, operasi sinyal terutama difokuskan pada acara 'berikutnya', yang memungkinkan Anda untuk mengubah nilai, melewati, menunda, menggabungkan, dan mengamati pada utas yang berbeda. Sedangkan API penghasil sinyal sebagian besar berkaitan dengan peristiwa siklus hidup sinyal (selesai, kesalahan), dengan operasi termasuk kemudian, flatMap, takeUntil dan catch.

Tambahan

RAC juga memiliki konsep Actiondan Property, yang pertama adalah tipe untuk menghitung efek samping, terutama yang berkaitan dengan interaksi pengguna, yang terakhir menarik ketika mengamati nilai untuk melakukan tugas ketika nilai telah berubah. Di RxSwift yang Actionditerjemahkan lagi menjadi Observable, ini ditunjukkan dengan baik RxCocoa, integrasi primitif Rx untuk iOS dan Mac. RAC Propertydapat diterjemahkan ke dalam Variable(atauBehaviourSubject ) di RxSwift.

Penting untuk memahami bahwa Property/Variable adalah cara kita harus menjembatani dunia imperatif dengan sifat deklaratif Pemrograman Reaktif, jadi kadang-kadang merupakan komponen mendasar ketika berhadapan dengan perpustakaan pihak ketiga atau fungsi inti ruang iOS / Mac.

Kesimpulan

RAC dan RxSwift adalah 2 binatang buas yang berbeda, yang pertama memiliki sejarah panjang di ruang Kakao dan banyak kontributor, yang terakhir ini cukup muda, tetapi bergantung pada konsep yang telah terbukti efektif dalam bahasa lain seperti Jawa, JS atau .BERSIH. Keputusan yang lebih baik adalah pada preferensi. RAC menyatakan bahwa pemisahan panas / dingin dapat diobservasi diperlukan dan itu adalah fitur inti dari kerangka kerja, RxSwift mengatakan bahwa penyatuan mereka lebih baik daripada pemisahan, sekali lagi ini hanya tentang bagaimana efek samping dikelola / dilakukan.

RAC 3.0 tampaknya telah memperkenalkan beberapa kerumitan tak terduga di atas tujuan utama memisahkan panas / dingin yang dapat diamati, seperti konsep interupsi, membelah operator antara 2 entitas dan memperkenalkan beberapa perilaku penting seperti startmulai memproduksi sinyal. Bagi sebagian orang hal-hal ini bisa menjadi hal yang baik untuk dimiliki atau bahkan fitur pembunuh, bagi sebagian orang lainnya hal-hal itu bisa saja tidak perlu atau bahkan berbahaya. Hal lain yang perlu diingat adalah bahwa RAC berusaha mengikuti konvensi Kakao sebanyak mungkin, jadi jika Anda seorang Kakao yang berpengalaman, Anda harus merasa lebih nyaman untuk bekerja dengannya daripada RxSwift.

RxSwift di sisi lain hidup dengan semua kerugian seperti panas / dingin yang dapat diamati, tetapi juga hal-hal baik, dari Reactive Extensions. Pindah dari RxJS, RxJava atau Rx.Net ke RxSwift adalah hal yang sederhana, semua konsepnya sama, jadi ini membuat bahan temuan cukup menarik, mungkin masalah yang sama yang Anda hadapi sekarang, telah diselesaikan oleh seseorang di RxJava dan solusinya dapat diterapkan kembali dengan mempertimbangkan platform.

Yang mana yang harus dipilih pasti masalah preferensi, dari perspektif objektif tidak mungkin untuk mengatakan mana yang lebih baik. Satu-satunya cara adalah menjalankan Xcode dan mencoba keduanya dan memilih salah satu yang terasa lebih nyaman untuk dikerjakan. Mereka adalah 2 implementasi dari konsep yang sama, mencoba untuk mencapai tujuan yang sama: menyederhanakan pengembangan perangkat lunak.

bontoJR
sumber
24
Ini penjelasan yang bagus, @ junior-b! Perlu juga disebutkan, bahwa RAC mengkodekan informasi tipe (termasuk kurangnya kesalahan terima kasih NoError) pada tipe stream itu sendiri: Signal<T, E: ErrorType>versus Observable<T>. Ini, serta pemisahan panas / dingin, memberikan peningkatan jumlah informasi pada waktu kompilasi yang tidak Anda miliki RxSwift.
NachoSoto
3
Hai @nachosoto, terima kasih atas kata baiknya. Saya pikir penambahan yang diusulkan tidak cocok dengan baik dalam perbandingan pada Pemrograman Reaktif. Ini jelas merupakan tambahan yang bagus di sisi RAC, tetapi bagi saya RP adalah tentang menyederhanakan pemrograman aliran data dan faktor-faktor penting adalah: penanganan kesalahan, perhitungan asinkron, manajemen efek samping dan komposisi. Dari perspektif pengembang tampaknya fitur yang bagus, ini untuk mengklarifikasi jenis kesalahan pada kode, itu tidak benar-benar meningkatkan aspek penanganan kesalahan dari kerangka kerja, ini, tentu saja pendapat saya yang sederhana.
bontoJR
3
Perlu disebutkan bahwa sampai sekarang ada kekurangan tutorial yang layak tentang RAC, namun ada beberapa proyek sampel yang bagus untuk RxSwift yang menentukan bagi saya.
Vadim Bulavin
1
ReactiveCocoa bagus, sampai mereka memperkenalkan fungsi gratis, SignalProducer, generik dengan Kesalahan. Saya belajar RxSwift dan saya mendapatkan pengalaman yang sama ketika bekerja dengan RxKotlin, RxJS
onmyway133