หากคุณเป็นนักพัฒนาซอฟต์แวร์ในยุคสมัยใหม่ คำว่า "Polymorphism" ในมุมมองของ Object-Oriented Programming (OOP) อาจไม่ใช่เรื่องแปลกใหม่สำหรับคุณ แต่การเข้าใจและนำไปใช้ให้เกิดประโยชน์สูงสุดคือสิ่งที่ผู้พัฒนาทุกคนควรทำได้ ในบทความนี้ เราจะพูดถึงหลักการของ Polymorphism และการนำไปใช้ในภาษา Go (Golang) อย่างง่ายๆ พร้อมตัวอย่างโค้ดและการอธิบายการทำงาน ไปพร้อมๆ กับตัวอย่างการใช้งานในโลกจริง
Polymorphism เป็นหนึ่งในสี่หลักการหลักของ OOP นอกจาก Encapsulation, Abstraction, และ Inheritance คำว่า "Polymorphism" มาจากคำกรีกที่แปลว่า "หลายรูปแบบ" ในโลกของ OOP นั้นหมายถึงความสามารถในการเรียกใช้เมธอด (methods) ในหลายรูปแบบที่แตกต่างโดยการทำงานที่เฉพาะเจาะจงต่อแต่ละประเภทของอ็อบเจคที่เรียกใช้
Golang ไม่ใช่ภาษาที่ออกแบบมาสำหรับ OOP อย่างเต็มรูปแบบอย่าง Java หรือ C++ เนื่องจากไม่มี class แต่ Go มีสิ่งที่เรียกว่า "Struct type" สำหรับสร้างโครงสร้างข้อมูล และ "Interface" สำหรับการกำหนดพฤติกรรมในรูปแบบที่เป็นสากล ซึ่งหมายถึงวิธีการใช้ polymorphism ใน Golang จะต้องอาศัย interface ในการทำงาน
ตัวอย่างที่ 1: การเรียกใช้งาน Function แบบ Polymorphic
สมมติว่าเรามี interface ชื่อ `Shape` อินเทอร์เฟสนี้กำหนดเมธอด `Area()` สำหรับการคำนวณพื้นที่ของรูปทรง
type Shape interface {
Area() float64
}
type Circle struct {
radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.radius * c.radius
}
type Square struct {
sideLength float64
}
func (s Square) Area() float64 {
return s.sideLength * s.sideLength
}
เราสามารถเขียนฟังก์ชั่น `printArea` ที่มีพารามิเตอร์ประเภท `Shape` เพื่อพิมพ์พื้นที่ของรูปทรงต่างๆ
func printArea(shape Shape) {
fmt.Println(shape.Area())
}
การใช้ `printArea` กับ `Circle` และ `Square`:
func main() {
circle := Circle{radius: 5}
square := Square{sideLength: 4}
printArea(circle) // พิมพ์พื้นที่ของวงกลม
printArea(square) // พิมพ์พื้นที่ของสี่เหลี่ยม
}
ตัวอย่างที่ 2: Polymorphism และ Dependency Injection
ในโลกของการพัฒนาซอฟต์แวร์, dependency injection เป็นการเพิ่ม flexibility และการ reuse code ระหว่าง components ของโปรแกรมโดยใช้ Polymorphism
type Logger interface {
Log(message string)
}
type FileLogger struct {
// ...สมมติว่ามีรายละเอียดการทำงานกับไฟล์
}
func (l FileLogger) Log(message string) {
// ...สมมติว่าทำการ Log ลงไฟล์
}
type DatabaseLogger struct {
// ...สมมติว่ามีรายละเอียดการทำงานกับฐานข้อมูล
}
func (l DatabaseLogger) Log(message string) {
// ...สมมติว่าทำการ Log ลงฐานข้อมูล
}
เราสามารถเขียนฟังก์ชันที่รับ Logger interface และใช้ตามความจำเป็นได้:
func processBusinessLogic(logger Logger) {
// ...คำนวณหรือประมวลผลข้อมูลทางธุรกิจ
logger.Log("เสร็จสิ้นการประมวลผลธุรกิจ")
}
หากในอนาคตเราต้องการขยายหรือเปลี่ยนแปลงวิธีการ log เราสามารถเพิ่ม structs ใหม่ที่ตอบสนอง interface ของ Logger ได้ง่ายๆ โดยไม่ต้องปรับเปลี่ยนในส่วนของ `processBusinessLogic`
ผ่านทั้งสองตัวอย่าง เราเห็นถึงพลังของ Polymorphism ในการสร้างโค้ดที่กำหนดโครงสร้างและพฤติกรรมที่ดี ทำให้โค้ดชุดนั้นสามารถนำไปใช้ซ้ำได้ง่าย และยืดหยุ่น เพื่อตอบสนองต่อการเปลี่ยนแปลงที่อาจเกิดขึ้นในอนาคต
การเรียนรู้ Polymorphism และ OOP มีความสำคัญมากในการเขียนโปรแกรม เพราะช่วยให้โค้ดของเรามีความยืดหยุ่นและสามารถนำไปใช้อีกในอนาคตได้อย่างง่ายดาย ที่ EPT เรามีคอร์สที่จะช่วยคุณเข้าใจพื้นฐานและเทคนิคของ OOP และวิธีการใช้งาน Polymorphism ในภาษาต่างๆ เช่น Golang, Java, และอื่นๆ มาร่วมเรียนรู้กับเราเพื่อให้คุณพัฒนาซอฟต์แวร์ด้วยหลักการที่เข้มแข็งและมั่นคง!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
Tag ที่น่าสนใจ: polymorphism oop object-oriented_programming golang interface struct dependency_injection software_development method code_example encapsulation abstraction inheritance flexibility reuse
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com