Redux ใช้รูปแบบวัตถุของพระเจ้าที่ถูกสุขอนามัยหรือไม่?


15

ในขณะที่เรียนรู้เกี่ยวกับ Redux รูปแบบพระเจ้า - วัตถุ (หรือรูปแบบต่อต้าน) มาถึงใจของฉัน - ทั้งคู่มีวัตถุขนาดใหญ่เพียงชิ้นเดียวที่เก็บข้อมูลแอปและวิธีการต่าง ๆ เพื่อจัดการกับมัน แต่ Redux ได้วางข้อ จำกัด บางอย่างเช่นการทำให้ Object ไม่เปลี่ยนรูปแบบและฟังก์ชั่นล้วนๆนั้นยังคงรักษาลายเซ็นที่เข้มงวด

ดังนั้นคำถามที่เกิดขึ้นคือ Redux ใช้วัตถุพระเจ้ารุ่นที่ถูกสุขลักษณะหรือไม่? หรือมีบางอย่างที่เกี่ยวข้องกับ Javascript ที่ไม่ได้เป็น OOP ที่คลาสสิกพิมพ์ดีดอย่างมาก?


2
คำตอบสั้น ๆ : ไม่ คำตอบยาว ๆ (จริง ๆ แล้วเป็นคำถามที่ควรนำไปสู่คำตอบ): ฐานข้อมูลเป็นคลาสหรือไม่? หรือวิธีการเกี่ยวกับระบบไฟล์ หรือแคชเป็นอย่างไร? เหล่านี้เป็นรูปแบบของพระเจ้าทั้งหมดด้วยหรือไม่
code4life

IMO ใช่แล้ว มันอยู่ในแถลงการณ์แรกเกี่ยวกับ Redux: "เนื่องจากข้อกำหนดสำหรับแอปพลิเคชันหน้าเดียว JavaScript มีความซับซ้อนมากขึ้นรหัสของเราต้องจัดการสถานะมากขึ้นกว่าเดิม" - นี่หมายความว่าคุณต้องจัดการสถานะแอปของคุณเป็นหนึ่งหยด ฉันคิดว่ามันเป็นปัญหาเฉพาะของเว็บแอปและสร้างโดยกรอบที่ไม่ดี / ไม่เคยได้รับการออกแบบมาสำหรับเฟรมเวิร์กนี้ที่ใช้ในการปรับใช้เว็บแอป
n13

@ n13: เพียงเพราะมันสามารถเข้าถึงได้จากสถานที่ส่วนกลางไม่ได้หมายความว่ามันจึงเป็นหยดขนาดใหญ่ก้อนหนึ่ง ตัวอย่างเช่นฐานข้อมูลของฉันเข้าถึงได้ในวิธีที่รวมศูนย์ ( DbContext) แต่ข้อมูลภายในของมันถูกแบ่งย่อยออกเป็นส่วนเล็ก ๆ (ตาราง schema)
Flater

@ Flater หยดใหญ่ที่มีเขตการปกครองจำนวนมากยังคงเป็นหยดใหญ่ โมเดล OO แบบเก่าจะจัดแบ่งข้อมูลทั้งหมดตามความต้องการรู้ซึ่งหมายความว่าแต่ละวัตถุเกี่ยวข้องกับสถานะ / ข้อมูลในปริมาณที่น้อยมากและทุกอย่างนั้นค่อนข้างง่าย คุณสามารถจัดเก็บทุกอย่างไว้ในโครงสร้างระดับโลกขนาดยักษ์เพียงแห่งเดียว แต่คุณไม่ทำอย่างนั้นเพราะมันเป็นการออกแบบซอฟต์แวร์ที่ไม่ดี ซอฟต์แวร์ 101.
n13

@ n13 คุณสามารถแยกลอจิกออกเป็นคลาสย่อย (ซ่อนหรือไม่) ให้สอดคล้องกับทั้งตัวอักษรและความตั้งใจในการฝึกฝนที่ดีในขณะที่ยังคงรวมศูนย์กับตรรกะของคุณ เป็นอาร์กิวเมนต์เดียวกับการใช้ microservices เทียบกับ api เดียว ในขณะที่ microservices เป็นตัวเลือก แต่นั่นไม่ได้หมายความว่า REST API "ปกติ" จึงเป็นวิธีปฏิบัติที่ไม่ดี
Flater

คำตอบ:


6

วัตถุของพระเจ้าคืออะไร? จากวิกิพีเดีย:

การทำงานโดยรวมของโปรแกรม [ส่วนหนึ่งของวัตถุพระเจ้า] นั้นได้รับการเข้ารหัสเป็นวัตถุ "รู้ทั้งหมด" ซึ่งเก็บข้อมูลส่วนใหญ่เกี่ยวกับโปรแกรมทั้งหมดและยังให้วิธีการส่วนใหญ่สำหรับการจัดการข้อมูลนี้ เนื่องจากวัตถุนี้เก็บข้อมูลจำนวนมากและต้องใช้วิธีการมากมายบทบาทของมันในโปรแกรมจึงกลายเป็นเหมือนพระเจ้า

ที่เก็บ Redux มีเพียงหนึ่งวัตถุข้อมูลและต้องการเพียง 2 หรือ 3 วิธี ในแง่นี้มันยากที่จะจินตนาการว่ามันเป็นวัตถุของพระเจ้า มันไม่ใช่ "ทุกคนรู้" อย่างแน่นอน

ทีนี้ถ้าตัวลดของคุณไม่เสียเลยถ้าตรรกะทั้งหมดอยู่ในฟังก์ชันเดียวนั่นอาจมีคุณสมบัติ แต่เป็นเรื่องง่ายที่จะแบ่งตัวลดออกเป็นชิ้นเล็ก ๆ เพื่อหลีกเลี่ยงสถานการณ์


ฉันคิดว่า OP กำลังสงสัยว่าตัวลดทั้งหมดเข้าด้วยกันรวมทั้ง Store นับเป็น "God Object"
949300

1
คลาสโมเดลของโปรแกรมทั้งหมดรวมกันเป็นเทพเจ้าวัตถุหรือไม่
Daniel T.

ฉันยืนยันว่าใน OOP แบบดั้งเดิมพวกเขาไม่ได้ใช้ข้อมูล "ทุกอย่าง" เหมือนกันดังนั้นจึงไม่มี
949300

ตัวลดยังไม่ทำงานทั้งหมดในข้อมูล "ทุกอย่าง" ที่เหมือนกัน ตัวลดเดียวจะเทียบเท่ากับคลาสโมเดลเดียว ข้อมูลของ reducer เทียบเท่ากับฟิลด์ของคลาสและการกระทำนั้นเทียบเท่ากับวิธีการของคลาส (เช่นแต่ละคำสั่ง case นั้นเทียบเท่ากับวิธีเฉพาะ)
Daniel T.

2

IMO คำถามข้างต้นไม่ควรเกิดขึ้น แนวคิดการเขียนโปรแกรมเชิงหน้าที่นั้นไม่สามารถเทียบเคียงได้กับแนวคิดใน OOPS แต่เป็นวิธีการที่แตกต่างกันในการแก้ปัญหาเดียวกัน ป้อนคำอธิบายรูปภาพที่นี่


5
คุณสร้างภาพตารางนี้สำหรับคำถามเท่านั้นหรือไม่ ฉันคิดว่ามันจะเหมาะกว่าเป็นข้อความเพื่อให้โหลดเร็วขึ้นและสามารถสังเกตได้ด้วยโปรแกรมอ่านหน้าจอ
Phoenix

OOP ไม่สนับสนุนการไหลของข้อมูลแบบทิศทางเดียวหรือไม่ เว้นแต่คุณจะถือว่า OOP เป็นเพียงแนวคิดของคลาสที่สามารถเก็บการอ้างอิงซึ่งกันและกัน แต่ไม่ใช่การออกแบบที่เหมาะสมที่การอ้างอิงแบบสองทิศทางโดยทั่วไปจะระบุข้อบกพร่องในการออกแบบ
Steven Jeuris

สิ่งที่คุณพูดถึงภายใต้ OOP และ FP ส่วนใหญ่ไม่มีอะไรเกี่ยวข้องกับคำแถลงปัญหาในคอลัมน์แรก ตัวอย่างองค์ประกอบของฟังก์ชั่นทำให้ยากที่จะเข้าใจโครงสร้างของรัฐและการเปลี่ยนแปลง
Ski

ดูเหมือนว่าคุณจะชอบ FP แต่ในใจของฉันคำตอบของคุณเพียงแค่ยืนยันความรู้สึกของฉันว่ามันเป็นวัตถุของพระเจ้า เช่น OMG สถานะของฉันซับซ้อนมากเพราะฉันรักษาสถานะทั้งหมดของโปรแกรมทั้งหมดเป็นเรื่องใหญ่ ใช่มันซับซ้อน ใน OOP คุณมีโมเดลวัตถุเชิงตรรกะที่ได้รับการอัปเดตซึ่งไม่ใช่เรื่องใหญ่อะไรเลย ถ้ามันเกิดขึ้นอย่างไม่หยุดยั้งนั่นก็ดีเหมือนกัน มุมมองสะท้อนให้เห็นถึงสถานะของวัตถุและมันง่ายมากในการปฏิบัติ
n13

0

หน้าแรกทำให้ชัดเจนอย่างมากว่า Redux แก้ปัญหาเฉพาะแอปพลิเคชันหน้าเว็บเดียว:

เนื่องจากข้อกำหนดสำหรับแอปพลิเคชันหน้าเดียวของ JavaScript มีความซับซ้อนมากขึ้นรหัสของเราต้องจัดการสถานะมากขึ้นกว่าเดิม (จาก Redux - แรงจูงใจ)

คำแปลของฉันเองคือ - เว็บแอพและกรอบการสร้างเว็บแอปยุ่งเหยิงและเมื่อพวกเขากำลังทำงานในเบราว์เซอร์พวกเขาต้องเผชิญกับปัญหาที่ไม่เหมือนใครซึ่งไม่ได้เกิดขึ้นนอกเว็บแอป

อย่าเข้าใจฉันผิด - ฉันไม่ได้กำลังบอกว่าเว็บแอปไม่ดีหรือเฟรมเวิร์กไม่ดี มันเป็นเพียงแค่หน้าเว็บและกระบวนทัศน์ทั้งหมดเกี่ยวกับเรื่องนี้อย่างปฏิเสธไม่ได้เลยที่เคยถูกออกแบบด้วยแอปพลิเคชันในใจ เว็บแอปบางตัวทำงานได้ดีอย่างน่าทึ่ง - ฉันรัก Google Docs ดีกว่าแอปทั่วไปที่เทียบเท่า

แต่ Redux เป็นเพียงเครื่องมือในการจัดการปัญหาที่เกิดขึ้นเมื่อคุณต้องจัดการกับข้อ จำกัด และปัญหาที่เกิดจากการสร้างเว็บแอปที่ทำงานในเบราว์เซอร์

สำหรับแอพ iOS หรือแอพพื้นฐานไม่ว่าจะเป็นเหตุผลใดก็ตาม รูปแบบวัตถุจัดการการเปลี่ยนแปลงแบบอะซิงก์และการโต้ตอบกับผู้ใช้อย่างง่ายดาย คุณมักจะรู้ว่าเกิดอะไรขึ้น การแสดงสถานะต่าง ๆ ไม่ใช่ปัญหาและเป็นไปโดยอัตโนมัติด้วย MVC และอัปเดตกิจกรรม

คุณจะไม่ต้องเผชิญกับสถานการณ์เช่นเว็บแอพ

** หากสถาปัตยกรรมของคุณไม่ดีก็ไม่มีอะไรจะช่วยคุณได้แม้แต่ Redux;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.