การเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming หรือ OOP) เป็นแนวคิดที่ได้รับความนิยมอย่างมากในโลกของการเขียนโปรแกรม เนื่องจากช่วยให้การออกแบบโครงสร้างโปรแกรมเป็นระบบระเบียบและง่ายต่อการบำรุงรักษา ถึงแม้ว่า Go จะไม่ได้รองรับ OOP อย่างเต็มรูปแบบเหมือนภาษาอย่าง Java หรือ C++ แต่ก็มีคุณสมบัติที่สามารถใช้เพื่อการพัฒนาในแนวทาง OOP ได้ โดยเฉพาะการใช้ methods ที่เป็นส่วนสำคัญของการออกแบบโปรแกรมเชิงวัตถุใน Go
ในภาษา Go, methods เป็นฟังก์ชันที่มีการเชื่อมโยงกับโครงสร้างข้อมูลที่เรียกว่า struct การสร้าง methods ใน Go จึงมีความคล้ายคลึงกับการสร้างฟังก์ชัน แต่ต่างกันตรงที่ methods จะมีตัวรับ (receiver) ซึ่งเป็นค่าของชนิด struct ที่ methods นั้น ๆ สังกัดอยู่
ตัวอย่างเช่น หากเรามี struct ชื่อ `Circle` ที่ใช้เพื่อเก็บข้อมูลเกี่ยวกับวงกลม เราสามารถสร้าง methods ที่คำนวณพื้นที่ของวงกลมได้ดังนี้:
package main
import (
"fmt"
"math"
)
// define a Circle struct
type Circle struct {
Radius float64
}
// define a method for Circle struct
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
func main() {
// create a Circle instance
circle := Circle{Radius: 5}
// call the Area method
fmt.Printf("Area of the circle: %.2f\n", circle.Area())
}
ในโค้ดด้านบน เรามี `Circle` เป็น struct ที่มีฟิลด์ `Radius` จากนั้นสร้าง methods ชื่อ `Area` ซึ่งใช้คำนวณพื้นที่ของวงกลม โดยมี `c` เป็นตัวรับที่ใช้ในการอ้างอิงถึงค่าของ struct นั้น ๆ
ใน Go, receiver ของ methods สามารถเป็น pointer ได้ ซึ่งจะช่วยให้ methods สามารถเปลี่ยนแปลงค่าภายใน struct นั้นได้ ซึ่งแตกต่างจาก value receiver ที่เป็นการส่งค่าจึงไม่สามารถเปลี่ยนแปลงค่าใน struct ได้โดยตรง
ตัวอย่างการใช้งาน pointer receivers คือ:
package main
import "fmt"
type Rectangle struct {
Width, Height float64
}
// method with pointer receiver to modify the Rectangle
func (r *Rectangle) Scale(factor float64) {
r.Width *= factor
r.Height *= factor
}
func main() {
rect := Rectangle{Width: 10, Height: 5}
fmt.Printf("Original dimensions: %.2f x %.2f\n", rect.Width, rect.Height)
// scale the rectangle
rect.Scale(1.5)
fmt.Printf("Scaled dimensions: %.2f x %.2f\n", rect.Width, rect.Height)
}
ในตัวอย่างข้างต้น, method `Scale` ใช้ pointer receiver `*Rectangle` เพื่อเปลี่ยนค่าของ `Width` และ `Height` เราสามารถมองการใช้ pointer receiver ว่าเป็นการเปรียบเทียบกับการอ้างอิงถึงวัตถุในภาษา OOP อื่น ๆ ซึ่งทำให้สามารถเปลี่ยนแปลงสถานะของวัตถุได้
แม้ว่า Go จะไม่มี notion ของ class และ inheritance อย่างชัดเจนเหมือนภาษา OOP อื่น แต่การออกแบบผ่าน struct และการใช้ methods ก็ทำให้สามารถนำแนวคิด OOP มาใช้ในการออกแบบซอฟต์แวร์ได้
- Composition over Inheritance: ใน Go เราใช้ composition เป็นหลัก ซึ่งหมายความว่าเราสามารถสร้าง struct ที่ประกอบด้วย struct อื่น ๆ ได้มากกว่าการใช้ inheritance โครงสร้างนี้เพิ่มความยืดหยุ่นและลดการพึ่งพาในโครงสร้างที่ซับซ้อน - Interfaces: Go ยังรองรับ interfaces ที่ช่วยให้สามารถกำหนดความสามารถร่วมของชุดโครงสร้างได้ เช่น ฟังก์ชันที่ต้องการรับประเภทค่าหลากประเภทที่มี method ตัวเดียวกัน
package main
import (
"fmt"
"math"
)
// interface
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
type Rectangle struct {
Width, Height float64
}
// implement Area method for Circle
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
// implement Area method for Rectangle
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func printArea(s Shape) {
fmt.Printf("Area: %.2f\n", s.Area())
}
func main() {
circle := Circle{Radius: 5}
rectangle := Rectangle{Width: 10, Height: 5}
printArea(circle)
printArea(rectangle)
}
ในตัวอย่างนี้ ได้ใช้ interface `Shape` เพื่อให้ `Circle` และ `Rectangle` สามารถรับรู้และใช้งาน method `Area()` ได้ การทำเช่นนี้ทำให้เราสามารถเขียนฟังก์ชันที่ทำงานร่วมกับประเภทค่าต่าง ๆ ได้ง่ายดายมากขึ้น
การใช้งาน methods และ struct ใน Go แม้จะมีแนวคิดที่แตกต่างจากภาษาเชิงวัตถุเต็มรูปแบบ แต่ก็ยังสามารถออกแบบซอฟต์แวร์ที่มีประสิทธิภาพและอ่านเข้าใจได้ง่าย ซึ่งเป็นหนึ่งในจุดแข็งของภาษา Go ที่ทำให้นักพัฒนาสามารถสร้างโซลูชันที่คล่องตัวและสอดคล้องกับแนวทางการออกแบบสมัยใหม่
การพัฒนาโดยใช้ Go หากสนใจเพิ่มพูนทักษะในการเขียนโปรแกรม ภาษานี้ยังเหมาะสำหรับการเรียนรู้เพิ่มเติมในเรื่องการจัดการกับข้อมูลและการออกแบบโปรแกรมที่สะอาดเรียบร้อยได้เป็นอย่างดี หากคุณต้องการพัฒนาทักษะของคุณอย่างลึกซึ้ง การศึกษาโปรแกรมมิ่งที่ EPT ก็เป็นทางเลือกที่ดีสำหรับการเริ่มต้นเส้นทางการเป็นนักพัฒนาที่เชี่ยวชาญใน Go และภาษาอื่น ๆ ในปัจจุบัน
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
Tag ที่น่าสนใจ: java c# vb.net python c c++ machine_learning web database oop cloud aws ios android
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM