PETEPITTAWAT.DEV

Casting vs Coercing

Cover Image for Casting vs Coercing
Pittawat Taveekitworachai
Pittawat Taveekitworachai

แทบทุกโปรแกรมที่เราเขียนกันขึ้นมา เราคงหนีไม่พ้นการเปลี่ยนประเภทของตัวแปร/ค่านั้น ๆ (Type conversion) ไม่ว่าจะเปลี่ยนเพื่อให้ทำงานได้ง่ายขึ้น หรือเพราะต้องการนำไปใช้กับ Third-party library จริง ๆ แล้ว การเปลี่ยนประเภทตัวแปรนั้น แบ่งออกได้เป็นสองแบบหลัก ๆ นั่น ก็คือ Casting และ Coercing ในบทความนี้จะพาไปดูว่าสองแบบนี้ต่างกันอย่างไรบ้าง


Casting

Casting คือการเปลี่ยนประเภทตัวแปร/ค่าแบบบังคับ (Explicit type conversion) นั่นหมายความว่าตัว Compiler เองนั่นไม่แน่ใจว่ามันจะเปลี่ยนได้ แต่เราที่เป็นนักพัฒนาโปรแกรม เรามั่นใจว่ามันเปลี่ยนได้แน่นอน จึงทำการบังคับเปลี่ยน โดยการ Casting ในภาษาส่วนใหญ่จะใช้ Syntax แบบ (Type) นำหน้าตัวแปร หรือ อาจจะใช้ as เป็น Keyword ตามหลัง นั่นเอง

โดย Scenario ที่เรามักพบบ่อย ๆ ก็คงจะเป็นการที่เราสร้าง Method/Function ที่รับ Superclass ไว้ แล้วต้องการนำมา Map type ใน Method/Function เพื่อทำอะไรเพิ่มเติม หรืออาจจะเป็นในกรณีที่เราได้ข้อมูลจาก API มา ซึ่งมักมาในรูปของ JSON String จึงทำให้เราต้องบังคับเปลี่ยนประเภทตัวแปร เพื่อให้เราทำงานกับข้อมูลในโปรแกรมของเราได้ง่ายยิ่งขึ้น หรืออาจจะเป็นกรณีที่เห็นได้ง่ายอย่างเช่น การเปลี่ยนจาก double มาเป็น int

เนื่องจากการเปลี่ยนประเภทของตัวแปร/ค่าแบบนี้นั้นเป็นการบังคับ ทำให้แม้ว่าจะไม่มี Error ตอน Compile แต่อาจจะเกิด Error ตอน Runtime ได้ เนื่องจากตัวแปร/ค่านั้น ๆ ไม่สามารถแปลงไปเป็นอีกแบบหนึ่งได้ เช่น ต้องการแปลง String "Hello World" เป็น int ในบางภาษา

รวมไปถึงการที่เราอาจสูญเสียข้อมูลบางส่วนไป เช่น การแปลงจาก double เป็น int เราจะสูญเสียข้อมูลในส่วนของทศนิยมไป โดยทั่วไปการเปลี่ยนประเภทแบบนี้นั้นมันจากเปลี่ยนจาก ประเภที่เป็นขนาดใหญ่/ไม่จำเพาะ (General) มาเป็นประเภทที่มีความจำเพาะมากยิ่งขึ้น/เล็กลง (Specific) เช่น จาก Superclass มาเป็น Subclass หรือจาก double (64-bit) มาเป็น int (32-bit)


Coercing

Coercing เป็นการเปลี่ยนประเภทตัวแปร/ค่าแบบโดยนัย (Implicit type conversion) ซึ่งตัวภาษาเองสามารถรับรู้ได้ว่าประเภทตัวแปรที่จะนำไปใช้ในบริบท (Context) นั้น ๆ ไม่เหมาะสม แต่สามารถเปลี่ยนได้ โดยไม่เสียหายอะไร และสามารถนำไปใช้ได้ง่ายยิ่งขึ้น เช่น ในภาษา JavaScript หากเรานำตัวเลขใด ๆ มาบวกกับ String จะได้ผลลัพธ์เป็น String ที่ Concatenate กัน เช่น "123" + 3 จะได้ "1233" นั่นเอง

อีกกรณีหนึ่งที่ Coercing เข้ามามีบทบาทก็คือ ตอนที่เราสร้าง Method/Function ที่มี Parameter เป็น Superclass แล้ว เราส่ง Argument ที่เป็น Subclass เข้ามานั่นเอง


Summary

Casting - Explicit type conversion

Coercing - Implicit type conversion

อย่างไรก็ตามในภาษาส่วนใหญ่ การเปลี่ยนประเภทแบบนี้กับตัวแปรนั้น จะเปลี่ยนที่__ค่า__เท่านั้น​​โดยข้อมูลที่เก็บไว้ในตัวแปรจะยัง__คงเดิม__ เป็นประเภทเดิม ยกเว้นว่า เราจะ Reassign กลับเข้าไปเองเท่านั้น


📚 Hope you enjoy reading! 📚