TL; DL
การขาดคุณสมบัติด้านภาษาของ Java เมื่อเทียบกับ C # รวมถึงข้อควรระวังในการค้นพบทำให้เราใส่โอเปอเรเตอร์และสื่อกลางเข้าในคลาสขนาดใหญ่
ออกแบบ
Rx.NET ดั้งเดิมได้รับการพัฒนาใน C # 3.0 ซึ่งมีคุณสมบัติที่สำคัญสองประการ: วิธีการขยายและคลาสบางส่วน อดีตให้คุณกำหนดวิธีการอินสแตนซ์ในประเภทอื่นซึ่งดูเหมือนจะเป็นส่วนหนึ่งของประเภทเป้าหมายนั้นในขณะที่บางส่วนชั้นเรียนช่วยให้คุณสามารถแยกชั้นเรียนขนาดใหญ่เป็นหลายไฟล์
คุณสมบัติเหล่านี้ไม่ได้มีอยู่ใน Java ดังนั้นเราต้องหาวิธีที่จะให้ RxJava ใช้งานได้สะดวกพอ
มีตัวดำเนินการสองชนิดใน RxJava: คล้ายแหล่งที่มาที่แสดงโดยวิธีการโรงงานแบบคงที่และแบบกลางที่แสดงโดยวิธีการอินสแตนซ์ อดีตสามารถอาศัยอยู่ในชั้นเรียนใด ๆ และทำให้พวกเขาสามารถได้รับการกระจายไปตามชั้นยูทิลิตี้หลาย หลังจำเป็นต้องใช้อินสแตนซ์สำหรับการทำงาน ในแนวคิดเหล่านี้ทั้งหมดสามารถแสดงผ่านวิธีคงที่กับ upstream เป็นพารามิเตอร์แรก
อย่างไรก็ตามในทางปฏิบัติการมีคลาสเริ่มต้นหลายรายการทำให้การค้นหาคุณลักษณะโดยผู้ใช้ใหม่ไม่สะดวก (จำไว้ว่า RxJava ต้องนำแนวคิดใหม่และกระบวนทัศน์การเขียนโปรแกรมมาสู่ Java) เช่นเดียวกับการใช้ตัวดำเนินการระดับกลางเหล่านั้นค่อนข้างฝันร้าย ดังนั้นทีมดั้งเดิมจึงมาพร้อมกับการออกแบบที่เรียกว่า API ได้อย่างคล่องแคล่ว: ชั้นหนึ่งที่มีวิธีการคงที่และอินสแตนซ์ทั้งหมดและเป็นตัวแทนแหล่งที่มาหรือขั้นตอนการประมวลผลทั้งหมดด้วยตัวเอง
เนื่องจากข้อผิดพลาดระดับเฟิร์สคลาส, การสนับสนุนการทำงานพร้อมกันและลักษณะการทำงานหนึ่งสามารถเกิดขึ้นกับแหล่งที่มาและการเปลี่ยนแปลงทุกประเภทเกี่ยวกับการไหลของปฏิกิริยา เมื่อห้องสมุด (และแนวคิด) วิวัฒนาการมาตั้งแต่สมัยของ Rx.NET ผู้ประกอบการมาตรฐานมากขึ้นและมากขึ้นซึ่งโดยธรรมชาติจะเพิ่มจำนวนวิธีการ สิ่งนี้นำไปสู่การร้องเรียนปกติสองข้อ:
- ทำไมมีวิธีการมากมาย?
- ทำไมไม่มีวิธี X ที่แก้ปัญหาเฉพาะของฉันได้?
การเขียนโอเปอเรเตอร์แบบปฏิกิริยาเป็นงานที่ยากไม่กี่คนที่เชี่ยวชาญในช่วงหลายปี; ผู้ใช้ห้องสมุดทั่วไปส่วนใหญ่ไม่สามารถสร้างโอเปอเรเตอร์ได้ด้วยตนเอง ซึ่งหมายความว่าเราเพิ่มผู้ประกอบการเพิ่มเติมในชุดมาตรฐานเป็นครั้งคราว ในทางตรงกันข้ามเราได้ปฏิเสธผู้ให้บริการหลายรายเนื่องจากมีความเฉพาะเจาะจงมากเกินไปหรือเพียงแค่ความสะดวกสบายที่ไม่สามารถดึงน้ำหนักของตัวเองได้
ฉันจะบอกว่าการออกแบบของ RxJava เติบโตขึ้นอย่างเป็นธรรมชาติและไม่ได้เป็นไปตามหลักการออกแบบบางอย่างเช่น SOLID ส่วนใหญ่ขับเคลื่อนด้วยการใช้งานและความรู้สึกของ API ที่คล่องแคล่ว
ความสัมพันธ์อื่น ๆ กับ Rx.NET
ฉันเข้าร่วมการพัฒนา RxJava ในปลายปี 2556 เท่าที่ฉันสามารถบอกได้รุ่นเริ่มต้น 0.x ส่วนใหญ่เป็นการปรับใช้กล่องดำโดยที่ชื่อและลายเซ็นต์ของObservable
ผู้ประกอบการRx.NET รวมถึงการตัดสินใจทางสถาปัตยกรรมบางประการ สิ่งนี้เกี่ยวข้องกับผู้ให้บริการ Rx.NET ประมาณ 20% ปัญหาหลักที่ตามมาคือความละเอียดของภาษาและความแตกต่างของแพลตฟอร์มระหว่าง C # และ Java ด้วยความพยายามอย่างยิ่งยวดเราพยายามที่จะติดตั้งตัวดำเนินการจำนวนมากโดยไม่ต้องดูซอร์สโค้ดของ Rx.NET และเราจะทำการย้ายสิ่งที่ซับซ้อนมากขึ้น
ในแง่นี้จนถึง RxJava 0.19 เราObservable
มีวิธีเทียบเท่ากับ Rx.NET IObservable
และObservable
วิธีการขยายร่วม อย่างไรก็ตามปัญหา backpressure ที่เรียกว่าปรากฏขึ้นและ RxJava 0.20 เริ่มที่จะแตกต่างจาก Rx.NET ในโปรโตคอลและระดับสถาปัตยกรรม ผู้ให้บริการที่มีอยู่ได้ขยายออกไปหลายคนเริ่มตระหนักถึงความกดดันและเราได้แนะนำรูปแบบใหม่: Single
และCompletable
ในยุค 1.x ซึ่งยังไม่มีคู่หูใน Rx.NET ณ ขณะนี้
Backpressure-awareness ทำให้สิ่งต่าง ๆ มีความซับซ้อนและ 1.x Observable
ได้รับมันในภายหลัง เราสาบานว่าจะจงรักภักดีต่อความเข้ากันได้ของไบนารีดังนั้นการเปลี่ยนโปรโตคอลและ API ส่วนใหญ่จึงเป็นไปไม่ได้
มีปัญหาอีกอย่างหนึ่งเกี่ยวกับสถาปัตยกรรมของ Rx.NET: การยกเลิกแบบซิงโครนัสไม่สามารถทำได้เนื่องจากการทำเช่นนั้นจำเป็นDisposable
ต้องส่งคืนก่อนที่โอเปอเรเตอร์จะเริ่มดำเนินการ อย่างไรก็ตามแหล่งข้อมูลเช่นRange
เคยกระตือรือร้นและจะไม่กลับจนกว่าจะเสร็จสิ้น ปัญหานี้สามารถแก้ไขได้โดยการฉีดDisposable
เข้าไปในแทนที่จะกลับจากObserver
subscribe()
RxJava 2.x ได้รับการออกแบบใหม่และนำไปใช้ใหม่ตั้งแต่เริ่มต้นตามเส้นเหล่านี้ เรามีแยกประเภท backpressure ทราบซึ่งมีชุดเดียวกันของผู้ประกอบการเป็นFlowable
ไม่สนับสนุน backpressure และค่อนข้างเทียบเท่ากับ Rx.NET ภายในทุกประเภทปฏิกิริยาตอบสนองต่อการจัดการการยกเลิกให้กับผู้บริโภคของพวกเขาช่วยให้การยกเลิกการซิงโครนัสทำงานได้อย่างมีประสิทธิภาพObservable
Observable
Observable