Screen Shot 2558-05-03 at 12.59.56 PM
เรื่องที่ 38 ที่นักพัฒนาควรรู้ และ เข้าใจก็คือ Missing Opportunities for Polymorphism
สำหรับโลกของ OOP (Object-Oriented Programming) นั้
เรื่องของ Polymorphism นั้นคงขาดไปเสียมิได้เลย

Developer ลองถามตัวเองสิว่า
คุณมีความรู้ความเข้าใจเกี่ยวกับ Polymorphism มากน้อยเพียงใด ?

คำว่า Polymorphism นั้นมาจากคำว่า

  • Poly => many
  • Morph => forms

แปลเป็นไทย คือ มีรูปแบบที่หลากหลาย

ถ้าอยู่ในโลกของ programming คำว่า Polymorphism
คือการกล่าวถึงหลากหลายรูปแบบของ object และ method นั่นเอง
และแน่นอนว่า มันไม่ง่ายเลย สำหรับการนำมาใช้งาน !!
ดังนั้น ควรระมัดระวัง และ มีสติอยู่เสมอนะ

ในการใช้งาน Polymorphism มันทำให้การทำงานผูกมัดกันระดับหนึ่ง
ซึ่งเคยอธิบายไว้ใน blog เรื่อง Composition over Inheritance
แต่มันก็มีข้อดีเยอะเช่นกัน

ตัวอย่างเช่น
เราสามารถลดการใช้งาน if-else block ใน code ลงไปได้
ทำให้เราสามารถทำงานเพียงอย่างใดอย่างหนึ่งไปเลย
ไม่ต้องไปสนใจส่วนอื่นๆ !!

ลองกลับไปดู code ที่คุณเขียนสิ ว่า
code ของคุณมี if-else block เยอะที่สุดเท่าไรกันบ้าง ?

ลองมา retrospective กันหน่อยสิ
ว่าทำไมถึงเขียน code ในรูปแบบนี้ ?
เมื่อทำการแก้ไข code ชุดนี้ จะกระทบส่วนไหนบ้าง ?
คุณกล้าแก้ไข code ชุดนี้ไหม ?
คิดว่า code มันดีแล้วใช่ไหม ?

การจะแก้ไข code ชุดนี้ก็ไม่ใช่เรื่องง่าย
ดังนั้น คุณจะต้องทำการ refactor code ให้อยู่ในรูปแบบที่ง่ายขึ้น
มีเป้าหมายเพื่อง่ายต่อการเพิ่ม และ แก้ไข code
รวมทั้ง เขียน code ให้น้อยลงอีกด้วย

ตัวอย่างเช่น
เรื่องของ Shopping cart ในระบบ e-commerce
มีความสามารถต่างๆ ดัง code

ถ้ามีความต้องการให้แต่ละ item นั้น

  • สามารถทำการ download ได้
  • สามารถทำการจัดส่งตามที่อยู่ของผู้ใช้งาน

นั่นคือรูปแบบการจัดส่ง item ออกไปนั่นเอง
ดังนั้นสามารถสร้าง class สำหรับการจัดส่ง item ได้ 2 แบบ ดังนี้

ถ้าเขียน code ในรูปแบบนี้ คำถามที่น่าสนใจคือ
ในขั้นตอนการ checkout พวก item ต่างๆ ใน shopping cart จะทำอย่างไร ?

โดย code น่าจะเป็นประมาณนี้

คำถามต่อมาคือ
ในส่วนของ ??? คุณจะเรียกใช้ method อะไรจาก Shipping ล่ะ ?
คำตอบ
คุณก็ต้องใช้ if-else ไงล่ะ
เพื่อตรวจสอบว่า แต่ละ item มันสามารถจัดส่งได้แบบไหนบ้าง ?
มี code ประมาณนี้

คำถาม
คิดว่ามันดีแล้วใช่ไหม ?
มันมีอะไรดีกว่านี้ หรือ มีแนวทางอื่นๆ บ้างไหม ?
ลองถามตัวเราเอง ที่เป็นนักพัฒนา software หน่อยสิ ?
คำตอบ
ลองคิดดูสิว่า ถ้าเราแบ่ง item ออกเป็น 2 แบบคือ

  1. Item ที่สามารถ download ได้
  2. Item ที่สามารถจัดส่งแบบปกติ หรือ ตามที่อยู่ได้

ดังนั้น เราจำเป็นต้องกำหนดว่า Item นั้นสามารถส่งได้
โดยในการส่งนั้น เราจะส่งการ Shipping เข้าไปได้
แล้วให้ item ทั้งสองแบบทำการ extend หรือ implement จาก Item นี้
แสดงดังรูป

20150503_123321

ดังนั้นสามารถเขียน code ได้ดังนี้

คำอธิบาย
วิธีการนี้ เราพยายามโยนหน้าที่การจัดส่งหรือ Shipping
ไปให้แต่ละ item ทำงานซะ
ดังนั้น แต่ละแบบของ item มันจะรู้ดีที่สุดว่า ต้องทำการจัดส่งอย่างไร
ส่งผลให้ เราไม่ต้องมาใช้ if-else อีกต่อไป

แต่การใช้งานแบบนี้ก็ต้องระมัดระวังเช่นกัน
ดังนั้น ควรจะต้องทำการเขียน unit test เพื่อคุมการทำงานไว้ด้วย
ไม่เช่นนั้น code ส่วนนี้จะทำความเข้าใจได้ยาก
หรือนำไปใช้งานแบบผิดได้ง่ายอีกด้วย
เพราะว่า มีน้อยคนมากที่จะเข้าใจ และ นำมันไปใช้งานจริงๆ

แต่สิ่งที่คุณต้องตอบให้ได้คือ
การลด if-else block ลงไปนั้น มันส่งผลดี หรือ ผลเสียอะไรกับคุณ และ ทีมงานบ้าง ?
คำตอบ คือ สิ่งที่บอกได้ชัดเจนว่า วิธีการนี้มันมีประโยชน์หรือไม่ !!

จำไว้ว่า

ในบางกรณี if-else block มันก็ดีกว่า polymorphism นะ
เพราะว่า เรามักจะชินกับการใช้งาน if-else block มากกว่า
แต่มักพบว่า polymorphism นั้นมันช่วยให้

  • เราเขียน code น้อยลง
  • code ของเราอ่านง่ายขึ้น
  • code ที่เราเขียนมันไม่พัง หรือ ทำงานผิดพลาดได้ง่าย

ดังนั้นมาลดจำนวน if-else block ใน code กันเถอะครับ !!