Casting vs Coercing
Published on
Authored by Pete. 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 กลับเข้าไปเองเท่านั้น