คำถามแรกๆ ที่อยู่ในใจของโปรแกรมเมอร์ที่กำลังพิจารณาเปลี่ยนจากภาษาการเขียนโปรแกรมเชิงวัตถุ เช่น Java และ C# ไปเป็น Golang ก็คือพวกเขาสามารถนำหลักการเชิงวัตถุแบบเดียวกันไปใช้กับ Go ได้หรือไม่ สำหรับคำตอบสำหรับคำถามนี้ เราสามารถดูที่คำถามที่พบบ่อยของ go.dev;
Go เป็นภาษาเชิงวัตถุหรือไม่?
ใช่และไม่. แม้ว่า Go จะมีประเภทและวิธีการและอนุญาตให้ใช้รูปแบบการเขียนโปรแกรมเชิงวัตถุ แต่ก็ไม่มีลำดับชั้นของประเภท แนวคิดของ "อินเทอร์เฟซ" ใน Go ให้แนวทางที่แตกต่างออกไปซึ่งเราเชื่อว่าใช้งานง่ายและในบางวิธีก็เป็นแบบทั่วไปมากกว่า นอกจากนี้ยังมีวิธีในการฝังประเภทในประเภทอื่นเพื่อให้คลาสย่อยคล้ายคลึงกัน แต่ไม่เหมือนกัน ยิ่งไปกว่านั้น วิธีการใน Go นั้นมีความทั่วไปมากกว่าใน C++ หรือ Java โดยสามารถกำหนดให้กับข้อมูลประเภทใดก็ได้ แม้แต่ประเภทที่ฝังไว้ เช่น จำนวนเต็มธรรมดาที่ “ไม่มีกล่อง” พวกเขาไม่ได้จำกัดอยู่เพียงโครงสร้าง (คลาส)
นอกจากนี้ การไม่มีลำดับชั้นของประเภททำให้ "วัตถุ" ใน Go ให้ความรู้สึกเบากว่าในภาษาเช่น C++ หรือ Java มาก
ในบทความนี้ เราจะพูดถึงวิธีการนำแนวคิดการเขียนโปรแกรมเชิงวัตถุไปใช้ Go
การห่อหุ้ม
การห่อหุ้มช่วยให้ข้อมูลปลอดภัยจากการรบกวนจากภายนอก ในภาษา oop สิ่งนี้ทำได้ในระดับอ็อบเจ็กต์โดยใช้ตัวแก้ไขการเข้าถึง แต่ใน Golang จะทำในระดับแพ็คเกจ
Go ไม่มีตัวแก้ไขการเข้าถึง เช่น สาธารณะ ส่วนตัว หรือที่ได้รับการป้องกัน แต่มีฟิลด์ที่ส่งออกและไม่ได้ส่งออกแทน ความแตกต่างนี้มาจากตัวอักษรตัวแรกของตัวแปร ตัวพิมพ์เล็กหมายถึงยังไม่ได้ส่งออก ทุนหมายถึงการส่งออก คุณสามารถนึกถึงความแตกต่างนี้เป็นส่วนตัวหรือสาธารณะ
ข้อแตกต่างที่เราเห็นก็คือไม่มีคลาสแต่เรามีโครงสร้างแทน เหตุผลก็คือ Go ออกมาเป็นทางเลือกสำหรับ C และ C++ และโครงสร้างส่วนใหญ่จะใช้ในภาษาเหล่านั้น
สิ่งเหล่านี้คือการมองเห็นระดับแพ็คเกจ ดังนั้นตัวแปรที่ขึ้นต้นด้วยตัวอักษรพิมพ์เล็กจึงไม่สามารถมองเห็นได้จากภายนอกแพ็คเกจที่ตัวแปรนั้นอยู่
มรดก
ใน OOP โปรแกรมคอมพิวเตอร์ได้รับการออกแบบในลักษณะที่ทุกสิ่งเป็นวัตถุที่มีปฏิสัมพันธ์ระหว่างกัน การสืบทอดเป็นส่วนสำคัญของภาษา OOP ซึ่งช่วยให้คุณสมบัติของคลาสหนึ่งได้รับการสืบทอดจากอีกคลาสหนึ่ง โดยพื้นฐานแล้วจะช่วยในการนำโค้ดกลับมาใช้ใหม่และสร้างความสัมพันธ์ระหว่างคลาสต่างๆ
ใน Go เราสามารถใช้การจัดองค์ประกอบเพื่อให้ได้ผลลัพธ์ที่คล้ายคลึงกัน
ในตัวอย่างข้างต้น โครงสร้างรถยนต์ถูกฝังโดยโครงสร้างอื่นโดยไม่ระบุชื่อ
ซึ่งหมายความว่าเราสามารถเข้าถึงเขตข้อมูลได้โดยตรง วิธีนี้คล้ายกับสิ่งที่เราคุ้นเคยในด้าน OOP
ในตัวอย่างรถจักรยานยนต์ เรากำหนดโครงสร้างหนึ่งให้กับอีกสนามหนึ่ง ที่นี่สามารถเข้าถึงได้ผ่านคุณลักษณะของมัน
ความแตกต่างนี้กำหนดวิธีที่เราเข้าถึงข้อมูล แต่ทั้งสองทำงานเป็นวิธีการสืบทอดที่ถูกต้อง
ผู้รับเหมา
ตัวสร้างเป็นฟังก์ชันพิเศษสำหรับการสร้างอ็อบเจ็กต์ที่คล้ายกันหลายอินสแตนซ์ในภาษา oop ตามคลาสอย่างน่าเชื่อถือ
ไม่มีคำจำกัดความเฉพาะสำหรับการเริ่มต้นใน GO แต่เราสามารถทำได้เช่นเดียวกันโดยการเขียนฟังก์ชัน
ฟังก์ชัน NewCustomer ด้านบนทำงานเหมือนกับตัวสร้างในภาษา oop
โปรดทราบว่ามีแนวคิดเกี่ยวกับค่าเริ่มต้นหรือค่าว่างใน Go ทุกอย่างเริ่มต้นกับบางสิ่งบางอย่าง
type Customer struct { Name string // " " Age int // 0 }
ข้อผิดพลาดนี้เรียกว่า “NullReferenceException” ใน C#, “NullPointerException” ใน Java และที่ไม่มีการกำหนดค่าใด ๆ ขณะเตรียมใช้งาน จะไม่ปรากฏใน GO
โพลีมอร์ฟิซึม
Golang รองรับความหลากหลายผ่านอินเทอร์เฟซเท่านั้น ประเภทจะใช้อินเทอร์เฟซหากมีการกำหนดคำจำกัดความสำหรับวิธีการทั้งหมดที่ประกาศไว้ในอินเทอร์เฟซ
ในตัวอย่างข้างต้น Guitar ใช้อินเทอร์เฟซของ Instrument โดยให้คำจำกัดความสำหรับวิธีการ Play ซึ่งเป็นวิธีการเดียวที่ประกาศไว้ในอินเทอร์เฟซ
อีนัมส์
Enum เป็นประเภทข้อมูลที่มีประสิทธิภาพสำหรับ Enumerated Data ในภาษา oop ในด้านไป เราสามารถใช้เฉพาะค่าคงที่และกำหนดค่าที่เพิ่มขึ้นโดยการใช้ส่วนน้อยเท่านั้น แม้ว่าประโยชน์ของการใช้ Enum ก็คือเราไม่จำเป็นต้องออกคำสั่งอย่างชัดเจน
ข้อมูลทั่วไป
Generics in Go เป็นแนวคิดใหม่ที่มาพร้อมกับเวอร์ชัน 1.18 มันถูกเรียกว่าพารามิเตอร์ประเภท และเราสามารถรับประเภทของพารามิเตอร์ของฟังก์ชันจากอินเทอร์เฟซที่เราต้องกำหนดซึ่งสามารถมีได้หลายประเภทที่ยอมรับได้ ด้วยวิธีนี้ เราสามารถกำจัดการพึ่งพาประเภทพารามิเตอร์และสร้างฟังก์ชันที่นำมาใช้ซ้ำได้ นอกจากนี้เรายังสามารถใช้สิ่งนี้เพื่อสร้างพารามิเตอร์ประเภทขั้นสูงเพิ่มเติมได้เช่นกัน
ในตัวอย่างข้างต้น ฟังก์ชัน PlayInstrument ยอมรับค่าใดๆ ที่เป็นไปตามสัญญาของอินเทอร์เฟซ "Instrument"
บทสรุป
Golang ส่งเสริมสิ่งที่น่าสนใจในการเขียนโปรแกรมเชิงวัตถุด้วยการใช้อินเทอร์เฟซ แม้ว่าจะไม่ได้หมายความว่าเป็นภาษา OOP ก็ตาม การใช้งานการเขียนโปรแกรมเชิงวัตถุใน Go นั้นมีความยืดหยุ่น ตรง และเบาอย่างไม่น่าเชื่อ
การใช้งาน OOP ใน Go อาจรู้สึกแปลก แต่การได้รับข้อดีทั้งหมดของ Go โดยไม่ต้องใช้เฟรมเวิร์กที่กินทรัพยากรนั้นถือเป็นข้อดีอย่างมากสำหรับนักพัฒนาหลายคน