พักยก

    เรื่อง OOP นี้อย่างที่ผมบอกนะครับว่ามีการพัฒนาการมากว่า 30 ปี มีคนอ้างว่ารู้จัก OOP ก็เยอะ ผมว่าบางทีอาจเป็นความเข้าใจผิด มา page นี้ผมขอคุยกันหน่อยเพื่อความกระจ่าง

ถ้าน้องหนุ่มใช้ Java เขียน OOP นั้นเป็นเรื่องธรรมดา แต่ถ้าเขียนแล้วไม่เป็น OOP สิแปลก

    น้องหนุ่มเขียน Java แบบนี้ครับ

import java.awt.Graphics;
import java.applet.Applet;

public class HelloApplet extends Applet
{
   .....
}

 

    คุณว่าน้องหนุ่มเขียนแบบ OOP อยู่หรือไม่ น้องหนุ่มเขียน Applet มีการ Inheritance มาจาก Applet ซะด้วยแบบนี้เป็น OOP หรือเปล่า คำตอบคือไม่แน่ครับ  ในทำนองเดียวกัน คนส่วนมากมักคิดว่า บางคนก็พูดทำนองว่า เขียนโปรแกรมด้วยภาษา OOP เช่น Java หรือ C++ ก็เหมาเอาว่าโปรแกรมของตัวเองเป็น OOP แล้ว ผมเปรียบเทียบอย่างนี้ก็แล้วกัน สมมติว่าคุณทำอาหาร คุณเลือกใช้ของดีมีคุณภาพทุกอย่างราคาแพง ก็ไม่ได้แปลว่าอาหารจานนั้นอร่อย พูดแบบนี้พอเข้าใจไหมครับ OOP ไม่ใช่อยู่ที่คุณเลือกใช้ของที่เป็น OOP แล้วสรุปได้ว่าโปรแกรมที่คุณเขียนเป็น OOP โดยอัตโนมัติ แต่หากอยู่ที่แนวคิดในการเขียนโปรแกรม code ของคุณเองเป็น OOP รึเปล่า ถ้าไม่เป็นมันก็ไม่ใช่ OOP

    ผมมองดูภาษา Java ผมว่านะครับ Java นั้นล้มเหลวเป็นอย่างมากในหลายๆ เรื่อง โดยเฉพาะอย่างยิ่งเรื่อง OOP ผมขอเทียบกับหนังเรื่อง Titanic ที่ประสบความสำเร็จอย่างถล่มทลาย แต่ผมกลับมองอีกมุมหนึ่ง ผมว่า Titanic ล้มเหลวนะครับ คือผู้สร้างตั้งใจอย่างมาก ลงทุนค้นคว้าพยายามจำลองเหตุการณ์ให้เหมือนจริงมากที่สุด แต่ผลปรากฏว่าแทบจะไม่มีใครพูดถึงความอลังการของเรือ ความหรูหราของห้องพัก หรือความสนุกสนานต่างๆ ที่เกิดขึ้นในเรือ สิ่งที่เหลือในความทรงจำของผู้ที่ดูหนังเรื่องนั้นคือ Jack และ Rose ซึ่งเป็นตัวสมมุติขึ้นมา ไม่รู้ใครมองมุมเดียวกับผมรึเปล่า Java ก็เช่นกัน มีความตั้งใจที่จะทำเรื่อง OOP ให้ดีที่สุด แต่มีคนกลุ่มน้อยมาที่ดึงมันมาใช้ประโยชน์ได้จริงๆ ผู้คนกลับยึดติดแค่กระพี้ของมันคือใช้ JavaScript ผมว่าน่าเสียดาย

น้องหนุ่มเขียนใหม่ คราวนี้ใช้ คำสั่ง class สร้าง class ของตัวเอง ขึ้นมา โดยไม่ได้ Inherit มาจาก Applet หรือที่ใดๆ เลย

    แบบนี้น้องหนุ่มเขียน code แบบ OOP หรือยัง คำตอบก็เช่นเดิมครับ คือไม่แน่ ถ้าผมบอกว่าผมเข้าใจ Syntax ของ C++ หรือ Java ทุกคำสั่งแล้วในโปรแกรมที่ผมเขียนนั้นผมก็เรียกมันมาใช้งานเช่นนำเอาคำสั่ง class มาใช้ แบบนี้ก็ยังไม่อาจเรียกว่า OOP ครับ ผมยกตัวอย่างเปรียบเทียบแบบนี้ก็แล้วกัน ถ้ามีใครสอนคุณว่าดาบนี้ประกอบด้วยส่วนไหนบ้าง ส่วนไหนเป็นด้ามจับส่วนไหนเป็นจุดที่ทำอันตรายคู่ต่อสู้ได้ เรียนละเอียดทุกซอกทุกมุม ผมถามว่าคุณว่าเมื่อคุณรู้จักดาบทุกซอกทุกมุม แบบนี้คุณสามารถเรียกตัวเองว่าเป็นนักดาบได้หรือไม่?  แบบนี้คุณคงเข้าใจนะครับ ผมขอเล่าประสบการณ์ส่วนตัวให้ฟัง เมื่อประมาณปี 1992 ผมรับงานตัวหนึ่งมาทำเป็นระบบบัญชีเล็กๆ ห้าเล่ม ตอนนั้นผมหัดเขียน C++ มาได้ระยะหนึ่ง ผมว่าผมรู้จักมันพอสมควร ผมเลยตัดสินใจใช้งานมัน เริ่มต้นผมวางแผนดิบดีเลยครับแบ่งงานเป็น class ตอนแรกมันก็ดูดี แต่ต่อๆ มามันยิ่งทำยิ่งเละ อะไรที่เคยเป็น private อยู่ ข้างนอกก็เรียกไม่ได้ สุดท้ายก็ต้อง public หมด บัญชีเล่มต่อมาตั้งใจว่าจะเล่น inheritance ซะหน่อย ยิ่งทำก็ยิ่งปั่นป่วน สรุปก็คือใช้วิธี copy class นั้น ออกมาเป็นอีก file หนึ่ง แล้วเขียน code ตัวคุมที่เหมือนกัน double เข้าไปเลย ในเวลานั้นผมเริ่มคิดแล้ว ไอ้คนที่ออกแบบ OOP มันคงเป็น Dr. สติเฟื่องที่วันๆ มีโลกของตัวเอง ไม่เคยออกมาดูโลกภายนอกเขาเลยว่าเขาเขียนโปรแกรมกันจริงๆ อย่างไร เชื่อว่าคนออกแบบ OOP คงจะไม่เคยเขียนโปรแกรมจริง ผมคิดอย่างนั้นจริงๆ นะครับในตอนนั้น

   เรามาดูกันในบทต่อๆ นะครับว่า OOP หน้าตาเป็นยังไง