Casting vs Coercing

Computer Science Jul 12, 2020

แทบทุกโปรแกรมที่เราเขียนกันขึ้นมา เราคงหนีไม่พ้นการเปลี่ยนประเภทของตัวแปร/ค่านั้น ๆ (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! 📚


Tags

Pittawat Taveekitworachai

A CS student who passionate about web and mobile technology with the belief that technology can enhance people's life.

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.