Interface Inheritance #1: The Less for More

    เรื่องนี้เราในยุคสมัยใหม่นี้เริ่มใช้กันมากขึ้น เป็นแนวคิดใหม่ครับมองต่างจากเดิมไปเลย ถ้าเทียบกับ Interface Inheritance แล้ว ดูเหมือนว่าจะด้อยกว่า Implementation Inheritance ดูเสมือนว่าลดความสามารถของมันลง แต่ไม่ใช่ครับ ทำงานให้เราน้อย กลับทำให้เรายืดหยุ่นมากขึ้น นั่นจึงเป็นที่มาของหัวข้อ The Less for More

    เรามาลองย้อนประวัติดูว่า Interface Inheritance นี้มันมีที่มาที่ไปอย่างไร เริ่มต้นที่ Implementation Inhertance ซึ่งมีนานมากแล้วตั้งแต่สมัยภาษา Simula แต่มันก็มีปัญหาในบท Implementation Inheritance : The Devil เลยมีนักคอมพิวเตอร์หัวก้าวหน้าศึกษาต้นเหตุของปัญหาที่พบ ปรากฏว่าต้นเหตุของปัญหาทั้งหมดมันอยู่ที่ Interface (ก็คือ Method/property นั่นแหละ) และ modifier ที่ชื่อว่า protected คือเวลาที่เรากำลังพัฒนาโปรแกรมอยู่นั้น เราสามารถสร้าง class ได้โดยอิสระ เราเป็นนายมัน แต่เมื่อเราเอาไปใช้ในที่สาธารณะแล้ว เราเป็นทาสมันครับ เราไม่สามารถแก้ interface ได้เพราะถ้าเราแก้มันจะทำให้ program ที่ inherit จาก class ของเราทำงานผิดพลาด

    ตรงนี้เขาเห็นว่า ถ้าเราแก้ไข code ข้างใน มันก็ไม่มีปัญหา เรามีิอิสระที่จะทำ แต่ถ้าเราแก้ไข interface แบบนี้ก็จะเกิดปัญหาอย่างเช่นข้างต้น และจริงๆ แล้ว หลักการของ OOP นั้นคือต้องการให้ code ต่างๆ อิสระต่อกัน มีส่วนสัมพันธ์กันหลวมที่สุด เราใช้สิ่งที่เราเรียกว่า message ในการคุยกันระหว่าง object แต่สังเกตไหมครับว่า base class และ derive class ในเรื่องของ Implementation Inheritance นั้น มันขัดกับกฏพื้นฐานของ OOP มันมีส่วนสัมพันธ์กันระหว่าง class ที่ค่อนข้างจะเหนียวแน่น เมื่อเป็นอย่างนั้น base class จะเสียความอิสระในการเปลี่ยนแปลง นั่นเป็นเหตุผลที่ programmer ควรใช้ protected ให้น้อยที่สุดเท่าที่เป็นได้ครับ

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

    การทำ Interface Inheritance นี้ จะ Inherit เฉพาะส่วนของ Interface เท่านั้นครับ Code ไม่เกี่ยว เมื่อดูเผินๆ ดูเหมือนว่า มันดีสู้ Implementation Inheritance ไม่ได้ แต่ถ้าคุณใช้มันเป็นคุณจะเห็นพลังของมันที่มีอยู่เหนือ Implementation Inheritance ในบางจุด ซึ่งเราจะค่อยๆ ศึกษากันไปครับ

    มีเรื่องน่าเศร้าอยู่หน่อยนึ่งครับ คือการทำความเข้าใจ Interface Inheritance จนถึงขั้นเอาไปประยุกต์ใช้งานได้นั้นยากหน่อยครับ ต้องลืมแนวคิดเดิมที่เคยเขียนโปรแกรมมาศึกษาของใหม่ Microsoft บอกว่ามันอาจใช้เวลาประมาณครึ่งปีลองผิดลองถูกถึงจะเก่ง ผมไม่รู้ว่าจะเห็นด้วยดีหรือไม่ แต่ตอนแรกที่ผมศึกษานั้น ยอมรับว่าหนักหนาสาหัสเมือนกันครับ ทำ class ล่มไปก็เยอะ แต่ผมว่าคุณน่าจะเรียนได้เร็วกว่าผมนะ

    เรามาพูดกันถึงเป้าหมายหน่อย Interface Inheritance นี่นะครับสร้างขึ้นมาโดยมุ่งเป้าหมาย ของการทำ Polymorphism เป็นหลัก ทำได้เนียนกว่า Implementation Inheritance เยอะครับ 

    เอาหละ เราย้อนกลับมาหน่อย เราได้เห็นแนวคิดของ Interface Inheritance ที่เป็นศาสตร์ไปแล้ว คราวนี้เรามาลองดูศิลป์ดูว่าใครได้เอาแนวคิดของ Interface Inheritance มา Implement บ้าง แน่นอนครับในสมัย C++ ยังไม่มี ภาษาคอมพิวเตอร์ภาษาแรกที่รองรับ Interface คือ Java ซึ่งกำเนิดเมื่อปี 1995 แต่ Java ก็ไม่ค่อยประสบความสำเร็จในการแนะนำให้ Programmer เข้าใจเรื่อง Interface Inheritance จนกระทั่งในปี 1996 Microsoft สร้าง infrastructure ระดับต่ำแบบ OOP เป็นผลสำเร็จ และตั้งชื่อมันว่า Component Object Model หรือ COM นั่นเอง ซึ่งใช้แนวคิดของเรื่อง Interface มาเป็นหัวใจ จนมาพัฒนามาเป็น technology ที่ชื่อว่า ActiveX ที่เรารู้จักกันดี ดังนั้นภาษาที่สองหลังจาก Java ที่รองรับเรื่อง Interface คือ ชุดโปรแกรม Visual Studio 97 ซึ่งหนึ่งในนั้นคือ Visual Basic 5.0 ผมเองก็หัดเรื่อง Interface ด้วย VB 5.0 เป็นภาษาแรก

    มาถึง C# ทาง Microsoft ก็เลียนแบบเรื่อง interface จาก Java แทบทั้งดุ้น ด้วยเหตุนี้ใครก็ตามที่เขียน Java เป็นก็จะเข้าใจ interface ของ C# ทันที