มุมมองที่แตกของความไม่สามารถใช้งานได้
TL / DR: การเปลี่ยนไม่ได้เป็นเทรนด์แฟชั่นมากกว่าความจำเป็นใน JavaScript หากคุณกำลังใช้ React มันจะช่วยให้คุณมีทางเลือกในการออกแบบที่สับสนในการจัดการของรัฐ อย่างไรก็ตามในสถานการณ์อื่น ๆ ส่วนใหญ่จะไม่เพิ่มมูลค่ามากเกินความซับซ้อนที่แนะนำให้บริการมากขึ้นในการทำประวัติย่อกว่าที่จะตอบสนองความต้องการของลูกค้าที่แท้จริง
คำตอบยาว: อ่านด้านล่าง
ทำไมการไม่เปลี่ยนรูปจึงสำคัญมาก (หรือจำเป็น) ในจาวาสคริปต์?
ฉันดีใจที่คุณถาม!
ก่อนหน้านี้มีชายผู้มีความสามารถมากคนหนึ่งชื่อDan Abramovเขียนไลบรารีการจัดการสถานะ javascript ชื่อว่าReduxซึ่งใช้ฟังก์ชั่นที่บริสุทธิ์และไม่สามารถเปลี่ยนแปลงได้ นอกจากนี้เขายังสร้างวิดีโอเจ๋ง ๆที่ทำให้ความคิดนั้นเข้าใจง่าย (และขาย)
ช่วงเวลานั้นสมบูรณ์แบบ ความแปลกใหม่ของเชิงมุมถูกซีดจางและโลก JavaScript ก็พร้อมที่จะ fixate ในสิ่งใหม่ล่าสุดที่มีการศึกษาระดับปริญญาขวาของเย็นและห้องสมุดนี้ไม่ได้เป็นนวัตกรรมใหม่เพียง แต่เสียบในอย่างสมบูรณ์แบบด้วยReactซึ่งถูกเร่ขายอีกโรงไฟฟ้า Silicon Valley
น่าเศร้าที่มันเป็นเช่นนั้นแฟชั่นต่างก็ปกครองโลกแห่ง JavaScript ตอนนี้อับรามอฟกำลังถูกยกย่องว่าเป็นเดมิโกดและพวกเราทุกคนก็ต้องอยู่ภายใต้Dao of Immutability ... ไม่ว่าจะเหมาะสมหรือไม่
เกิดอะไรขึ้นในการกลายพันธุ์วัตถุ?
ไม่มีอะไร!
ในความเป็นจริงโปรแกรมเมอร์ได้กลายพันธุ์วัตถุสำหรับเอ้อ ... ตราบเท่าที่มีวัตถุที่จะกลายพันธุ์ การพัฒนาแอพพลิเคชั่นมากกว่า50 ปี
แล้วทำไมมันซับซ้อนล่ะ? เมื่อคุณมีวัตถุcat
และมันตายคุณต้องการวินาทีcat
ในการติดตามการเปลี่ยนแปลงหรือไม่? คนส่วนใหญ่จะพูดcat.isDead = true
และทำกับมัน
ไม่กลายพันธุ์ (วัตถุกลายพันธุ์) ทำให้สิ่งต่าง ๆ ง่ายขึ้นหรือไม่
ใช่! .. แน่นอน!
พิเศษใน JavaScript ซึ่งในทางปฏิบัติมีประโยชน์มากที่สุดที่ใช้สำหรับการแสดงผลมุมมองของบางสถานะที่ถูกเก็บรักษาไว้ที่อื่น (เช่นในฐานข้อมูล)
จะเกิดอะไรขึ้นถ้าฉันมีวัตถุ News ใหม่ที่ต้องได้รับการปรับปรุง ... ฉันจะบรรลุในกรณีนี้ได้อย่างไร? ลบร้านค้าและสร้างใหม่ไหม การเพิ่มวัตถุลงในอาร์เรย์เป็นการดำเนินการที่ไม่แพงหรือไม่
คุณสามารถใช้วิธีดั้งเดิมและอัปเดตNews
วัตถุเพื่อให้การแสดงในหน่วยความจำของวัตถุนั้นเปลี่ยนไป (และมุมมองที่แสดงให้กับผู้ใช้หรือหวังว่าจะได้)
หรือมิฉะนั้น ...
คุณสามารถลองเซ็กซี่ FP / วิธี Immutability และเพิ่มการเปลี่ยนแปลงของคุณไปยังNews
วัตถุไปยังอาร์เรย์ติดตามการเปลี่ยนแปลงทุกครั้งประวัติศาสตร์เพื่อให้คุณสามารถแล้วย้ำผ่านอาร์เรย์และคิดออกว่าการเป็นตัวแทนของรัฐที่ถูกต้องควรจะเป็น (วุ้ย!)
ฉันพยายามที่จะเรียนรู้สิ่งที่นี่ โปรดให้ความกระจ่างแก่ฉัน :)
แฟชั่นมาและไปเป็นเพื่อน มีหลายวิธีในการดูแลแมว
ฉันขอโทษที่คุณต้องแบกรับความสับสนของกระบวนทัศน์การเขียนโปรแกรมที่เปลี่ยนแปลงตลอดเวลา แต่เดี๋ยวก่อนยินดีต้อนรับสู่คลับ !!
ตอนนี้สองจุดสำคัญที่ต้องจำเกี่ยวกับ Immutability และคุณจะได้รับการโยนเหล่านี้ที่คุณด้วยความรุนแรงไข้ที่ไร้เดียงสาเท่านั้นที่สามารถรวบรวม
1) Immutability เป็นที่น่ากลัวสำหรับการหลีกเลี่ยงสภาพการแข่งขันในแบบมัลติเธรดสภาพแวดล้อม
สภาพแวดล้อมแบบมัลติเธรด (เช่น C ++, Java และ C #) เป็นความผิดของการฝึกการล็อกวัตถุเมื่อมีมากกว่าหนึ่งเธรดที่ต้องการเปลี่ยน สิ่งนี้ไม่ดีต่อประสิทธิภาพ แต่ดีกว่าทางเลือกของข้อมูลเสียหาย และยังไม่ดีเท่าที่ทำให้ทุกอย่างเปลี่ยนรูป (ลอร์ดสรรเสริญ Haskell!)
แต่อนิจจา! ในจาวาสคริปต์คุณทำงานในหัวข้อเดียวเสมอ แม้แต่คนทำงานเว็บ (แต่ละคนทำงานในบริบทที่แยกต่างหาก ) ดังนั้นตั้งแต่คุณไม่สามารถมีที่เกี่ยวข้องกับด้ายสภาพการแข่งขันภายในบริบทของการดำเนินการของคุณ (ทุกคนตัวแปรทั่วโลกที่น่ารักและปิด) จุดหลักในความโปรดปรานของ Immutability ออกไปข้างนอกหน้าต่าง
(ต้องบอกว่ามีเป็นข้อได้เปรียบจากการใช้ฟังก์ชั่นที่บริสุทธิ์ในคนงานเว็บซึ่งเป็นว่าคุณจะมีความคาดหวังเกี่ยวกับการเล่นซอกับวัตถุบนหัวข้อหลัก no.)
2) ความไม่สามารถเปลี่ยนแปลงได้ (อย่างใด) หลีกเลี่ยงสภาพการแข่งขันในสถานะแอปของคุณ
และนี่คือปมที่แท้จริงของเรื่องนี้นักพัฒนาส่วนใหญ่ (React) จะบอกคุณว่า Immutability และ FP นั้นสามารถใช้เวทย์มนตร์นี้ที่ช่วยให้สถานะแอปพลิเคชันของคุณสามารถคาดเดาได้
แน่นอนว่านี่ไม่ได้หมายความว่าคุณสามารถหลีกเลี่ยงสภาพการแข่งขันในฐานข้อมูลเพื่อดึงสิ่งนั้นออกคุณต้องประสานงานผู้ใช้ทั้งหมดในเบราว์เซอร์ทั้งหมดและเพื่อที่คุณจะต้องใช้เทคโนโลยีการกดแบ็คเอนด์เช่นWebSockets ( เพิ่มเติมเกี่ยวกับด้านล่าง) ที่จะออกอากาศการเปลี่ยนแปลงสำหรับทุกคนที่เรียกใช้แอป
ไม่ได้หมายความว่ามีปัญหาบางอย่างใน JavaScript ที่สถานะแอปพลิเคชันของคุณต้องการไม่สามารถเปลี่ยนแปลงได้เพื่อที่จะคาดเดาได้นักพัฒนาใด ๆ ที่ได้รับการเข้ารหัสแอปพลิเคชันส่วนหน้าก่อนที่ React จะบอกคุณ
การเรียกร้องที่ค่อนข้างสับสนนี้หมายถึงว่าด้วยการตอบโต้สถานะแอปพลิเคชันของคุณจะมีแนวโน้มที่จะมีสภาพการแข่งขันสูงขึ้น ทำไม? เพราะตอบสนองเป็นพิเศษ .. มันได้รับการออกแบบมาเป็นห้องสมุดการแสดงผลที่ดีที่สุดอย่างกับการจัดการของรัฐที่สอดคล้องกันที่เกิดขึ้นที่สองและทำให้รัฐเป็นส่วนประกอบจะมีการจัดการผ่านทางห่วงโซ่ของเหตุการณ์ที่ไม่ตรงกัน (aka "ข้อมูลทางเดียวที่มีผลผูกพัน") ที่คุณไม่มีการควบคุม มากกว่าและพึ่งพาคุณจำไม่ได้ที่จะกลายพันธุ์รัฐโดยตรง ...
ด้วยบริบทนี้มันง่ายที่จะเห็นว่าความจำเป็นในการเปลี่ยนแปลงไม่ได้มีส่วนเกี่ยวข้องกับ JavaScript และสิ่งที่เกี่ยวข้องกับเชื้อชาติใน React: ถ้ามีการเปลี่ยนแปลงหลายอย่างในแอพพลิเคชั่นของคุณ รัฐของคุณในขณะที่, คุณจะได้รับการสับสนและทำให้มันทำให้รู้สึกดีกับการใช้การไม่เปลี่ยนรูปเพื่อติดตามการเปลี่ยนแปลงทุกครั้งประวัติศาสตร์
3) สภาพการแข่งขันแย่มาก
พวกมันอาจจะเป็นถ้าคุณใช้ React แต่มันก็หายากถ้าคุณเลือกกรอบที่แตกต่าง
นอกจากนี้โดยปกติคุณมีปัญหาที่ใหญ่กว่ามากในการจัดการกับ ... ปัญหาเช่นนรกที่ต้องพึ่งพา เหมือนรหัสฐานป่อง เช่นเดียวกับ CSS ของคุณที่ไม่โหลด เช่นกระบวนการสร้างที่ช้าหรือติดอยู่กับส่วนหลังเสาหินซึ่งทำให้ไม่สามารถวนซ้ำได้ เช่นเดียวกับ devs ที่ไม่มีประสบการณ์ไม่เข้าใจว่าเกิดอะไรขึ้นและทำสิ่งที่ยุ่งเหยิง
คุณรู้. ความจริง แต่เฮ้ใครสนใจเรื่องนั้น
4) ความไม่สามารถเปลี่ยนแปลงได้ใช้ประเภทการอ้างอิงเพื่อลดผลกระทบด้านประสิทธิภาพของการติดตามการเปลี่ยนแปลงสถานะทุกครั้ง
เพราะอย่างจริงจังหากคุณกำลังจะคัดลอกข้อมูลทุกครั้งที่มีการเปลี่ยนแปลงสถานะของคุณคุณควรตรวจสอบให้แน่ใจว่าคุณฉลาดเกี่ยวกับเรื่องนี้
5) การเปลี่ยนไม่ได้ช่วยให้คุณสามารถเลิกทำสิ่งต่างๆได้
เพราะเอ่อ .. นี่คือฟีเจอร์อันดับหนึ่งที่ผู้จัดการโครงการของคุณกำลังจะถามใช่ไหม?
6) รัฐที่ไม่เปลี่ยนรูปนั้นมีศักยภาพที่น่าสนใจมากมายเมื่อรวมกับ WebSockets
สุดท้าย แต่ไม่ท้ายสุดการสะสมของ delta สถานะทำให้เป็นกรณีที่น่าสนใจร่วมกับ WebSockets ซึ่งช่วยให้การใช้งานง่ายของรัฐเป็นกระแสของเหตุการณ์ที่ไม่เปลี่ยนรูป ...
เมื่อเงินลดลงในแนวคิดนี้ (สถานะเป็นกระแสของเหตุการณ์ - แทนที่จะเป็นชุดของบันทึกที่แสดงถึงมุมมองล่าสุด) โลกที่ไม่เปลี่ยนรูปกลายเป็นสถานที่มหัศจรรย์ที่อาศัยอยู่ ที่ดินของเหตุการณ์ที่มาสงสัยและความเป็นไปได้ที่ฟันฝ่าเวลาตัวเอง และเมื่อทำถูกต้องนี้แน่นอนสามารถทำให้เวลาจริงปพลิเคชัน EASI เอ้อจะประสบความสำเร็จคุณก็ออกอากาศการไหลของเหตุการณ์ที่เกิดขึ้นกับทุกคนที่สนใจเพื่อให้พวกเขาสามารถสร้างตัวแทนของตัวเองในปัจจุบันและเขียนกลับการเปลี่ยนแปลงตัวเองของพวกเขาในการไหลของชุมชน
แต่ในบางจุดคุณตื่นขึ้นและตระหนักว่าสิ่งมหัศจรรย์และเวทมนตร์ไม่ได้มาฟรี แตกต่างจากเพื่อนร่วมงานที่กระตือรือร้นของคุณผู้มีส่วนได้เสียของคุณ (แท้จริงแล้วคนที่จ่ายเงินให้คุณ) สนใจเรื่องปรัชญาหรือแฟชั่นและเงินที่จ่ายเพื่อสร้างผลิตภัณฑ์ที่พวกเขาสามารถขายได้ และบรรทัดล่างคือมันยากที่จะเขียนโค้ดที่ไม่เปลี่ยนรูปแบบและทำลายมันได้ง่ายขึ้นรวมถึงมีจุดเล็ก ๆ ที่มี front-end ที่ไม่เปลี่ยนรูปถ้าคุณไม่มี back-end ที่จะสนับสนุนมัน เมื่อ (และถ้า!) คุณจนโน้มน้าวให้ผู้มีส่วนได้เสียของคุณที่คุณควรเผยแพร่และใช้เหตุการณ์ที่ผ่านTechology ผลักดันเช่น WebSockets คุณหาสิ่งที่เจ็บปวดก็คือการขนาดในการผลิต
ตอนนี้สำหรับคำแนะนำคุณควรเลือกที่จะยอมรับมัน
ทางเลือกในการเขียน JavaScript โดยใช้ FP / Immutability ยังเป็นตัวเลือกในการทำให้รหัสแอปพลิเคชันของคุณมีขนาดใหญ่ขึ้นซับซ้อนและจัดการได้ยากขึ้น ฉันจะขอเถียงสำหรับการ จำกัด วิธีการนี้จะ reducers Redux ของคุณจนกว่าคุณจะรู้ว่าคุณกำลังทำ ... และถ้าคุณกำลังจะไปข้างหน้าและการใช้งานโดยไม่คำนึงถึงการเปลี่ยนไม่ได้แล้วใช้รัฐไม่เปลี่ยนรูปไปยังกองใบสมัครของคุณทั้งหมดและไม่ได้เป็นเพียง ฝั่งไคลเอ็นต์เนื่องจากคุณขาดคุณค่าที่แท้จริงของมันเป็นอย่างอื่น
ตอนนี้ถ้าคุณโชคดีพอที่จะสามารถสร้างทางเลือกในการทำงานของคุณแล้วลองและใช้ภูมิปัญญาของคุณ (หรือไม่) และทำสิ่งที่ถูกต้องโดยผู้ที่จะจ่ายเงินให้คุณ คุณสามารถยึดสิ่งนี้จากประสบการณ์ของคุณในทางเดินอาหารหรือสิ่งที่เกิดขึ้นรอบตัวคุณ (ยอมรับได้ว่าทุกคนใช้ React / Redux ดังนั้นจึงมีข้อโต้แย้งที่ถูกต้องว่าจะหาทรัพยากรเพื่อทำงานของคุณได้ง่ายขึ้น) .. คุณสามารถลองทั้งResume ขับเคลื่อนการพัฒนาหรือHype ขับเคลื่อนการพัฒนาแนวทาง พวกเขาอาจเป็นประเภทของคุณมากขึ้น
ในระยะสั้นสิ่งที่จะกล่าวถึงการเปลี่ยนไม่ได้คือมันจะทำให้คุณทันสมัยกับเพื่อนของคุณอย่างน้อยก็จนกว่าความนิยมต่อไปมาถึงจุดที่คุณจะดีใจที่จะไป
ตอนนี้หลังจากการบำบัดด้วยตนเองในครั้งนี้ฉันต้องการจะชี้ให้เห็นว่าฉันได้เพิ่มสิ่งนี้เป็นบทความในบล็อกของฉัน => ความไม่สามารถใช้งานได้ใน JavaScript: มุมมองที่แตก รู้สึกอิสระที่จะตอบกลับไปที่นั่นหากคุณมีความรู้สึกที่แข็งแกร่งที่คุณต้องการออกจากอกด้วย;)