DEV Community

Discussion on: เปรียบเทียบการจัดการข้อมูลของ ภาษาแบบ Functional อย่าง Elixir ด้วย Immutable Data กับ Go ที่เป็น Mutable Data

 
iporsut profile image
Weerasak Chongnguluam • Edited

อ่อ ถ้างั้นให้ถือว่าเป็นความเห็นส่วนตัวก็ได้ครับ ผมคิดว่ามันบังคับให้คิดและทำออกมาได้ง่ายกว่าจริงๆ การที่ runtime environment ของภาษามีบังคับ immutable data แล้วตัว runtime เองจัดการพวกนี้ด้วย persistent data structure ให้ทำให้คนเขียนไม่ต้องกังวลว่าข้อมูลนั้นจะจัดเก็บแบบไหน จะเกิดการ copy กันจน memory ไม่พอหรือไม่ เราก็กลับมา focus แค่ว่า function เรารับ input อะไรแล้วจะ return output อะไรกลับออกไป

ส่วนภาษาที่ไม่มี runtime environment จัดการพวกนี้ให้ แม้จะมี immutable ให้ใช้อย่าง Rust ที่มี generic ด้วยนั้น ต้องอาศัย type reference เข้ามาช่วยอีกในการควบคุมว่าจะให้ mutate ข้อมูลของตัวแปรได้แค่ไหน อันนี้ผมเลยคิดว่า Generic ไม่ช่วยอะไรให้ผมคิดถึงการทำงานแบบ Functional แบบรับ input -> process -> return output ได้ง่ายๆ น่ะครับ อย่างมากถือทำให้ผม abstract type ออกมาให้มัน generic แล้ว reuse ได้ง่ายขึ้นนั่นเอง

Thread Thread
 
visibletrap profile image
Nuttanart Pornprasitsakul

ตามแนวคิดทั่วไปผมเห็นด้วยเลยครับว่า immutable data จำเป็นต่อการเขียนโปรแกรมแบบ functional มากๆ

แต่ในตัวอย่างในโพสนี้ เราสามารถเขียนโปรแกรมด้วยแนวคิด functional ในภาษาที่ไม่ต้องมี immutable data จาก runtime ก็ได้ อย่างเช่นใช้ map ของ Ruby หรือ JavaScript อะครับ การที่เราต้องเขียนโค้ด Go ออกมาแบบนั้น มันไม่ใช่เพราะ Go ไม่มี immutable data จาก runtime อะครับ

Thread Thread
 
iporsut profile image
Weerasak Chongnguluam

เห็นด้วยว่าไม่ต้องมี immutable data หรือ persistent data structure มาให้เอง ก็เขียนได้ อันนี้ผมก็ไม่ได้ติดอะไรครับ แต่นั่นก็คือทำให้มีภาระต้องทำเองเช่นของ Go ต้อง copy slice ทั้งก้อนเองก่อนแก้ไขแล้วค่อย return ก้อนใหม่กลับออกไป คือไม่ต้องมีระดับ runtime ก็ได้ครับ ขอแค่มีตัวช่วยเรื่อง immutable ซึ่ง library ของ Ruby และ JavaScript นั้นมี เคส Ruby มีใน standard library พวก Enum ที่มี method ให้ทั้งแบบ return ค่าใหม่ และแบบ mutate จากตัวแปรเดิม ส่วนของ Javascript นั้นมีทั้งแบบสร้างภาษาใหม่แล้วแปลงเป็น Javascript หรือสร้าง Immutable library ขึ้นมาจัดการ persistent data structure ให้อีกรอบนึงโดยที่ไม่ต้องพึ่ง runtime

สรุปคือไม่ว่าจะมีการจัดการ immutable ให้ผ่าน runtime หรือ library ถ้ามีมาให้ก็ช่วยให้เขียนได้ง่ายกว่าไม่มีครับ กับ Go ก็ทำได้แต่แค่มันไม่ง่ายต้องนั่ง copy เองก่อนตอนนี้น่ะครับถ้าอยากได้แบบส่ง slice มา ไม่แก้ไขมันแล้ว return ของใหม่