OOP และ Class

  Object Oriented Programming หรือ OOP หรือ การเขียนโปรแกรมเชิงวัตถุ หมายถึง การเขียนโปรแกรมโดยการมองว่าโปรแกรมใดๆเป็นวัตถุชนิดหนึ่ง ที่ประกอบไปด้วย คุณสมบัติ(property) และ วิธีการ(method) เช่น คลาสรถ ประกอบด้วย คุณสมบัติ สี จำนวนล้อ และ วิธีการ เช่น วิธีขับ วิธีจอด เป็นต้น นอกจากนี้ OOP ที่ดี ยังต้องมีคุณสมบัติการสืบทอด(inherited) เช่น คลาสรถยนต์ สืบทอดมาจากคลาสรถ และ คลาสรถมอเตอร์ไซต์ ก็สืบทอดมาจากคลาสรถเช่นเดียวกัน แต่ทั้ง 2 คลาส(ซึ่งเรียกว่าคลาสลูก หรือ sub class) ก็อาจมีคุณสมบัติบางอย่างที่แตกต่างจาก คลาสรถ(คลาสแม่ หรือ base class) เช่น คลาสรถยนต์ มี 4 ล้อ และ คลาสรถมอเตอร์ไซต์ มี 2 ล้อ เป็นต้น

  จากตัวอย่างข้างต้น จะเห็นได้ว่า การเขียนโปรแกรมเชิงวัตถุ ก็คือการเขียนโปรแกรมเป็น Class นั่นเอง และในบทความนี้ ผมจะเขียนถึงการเขียนโปรแกรม เชิงวัตถุ ในส่วนของ PHP ก่อนนะครับ

  ทำไมต้องเขียนโปรแกรมเชิงวัตถุ มีหลายปัจจัยทีทำให้เราต้องหันมาเขียนโปรแกรมเชิงวัตถุครับ ยกตัวอย่างเช่น

1. ปัญหาหารใช้ซ้ำ

<?php
  // แสดงผล query ครั้งที่ 1
  $sql = "SELECT * FROM table1 WHERE user=xxx";
  $query = mysql_query( $sql );
  $rows = mysql_num_rows( $query );
  // แสดงผล query ครั้งที่ 2
  $sql = "SELECT * FROM table1 WHERE user=yyy";
  $query = mysql_query( $sql );
  $rows = mysql_num_rows( $query );
  // แสดงผล query ครั้งที่ 3
  $sql = "SELECT * FROM table1 WHERE user=zzz";
  $query = mysql_query( $sql );
  $rows = mysql_num_rows( $query );

จากโค้ด จะเห็นว่า เราต้องทำการเขียนโค้ด ที่คล้ายๆกัน ถึง 3 ครั้ง เพื่อผลลัพท์ 3 ครั้ง แต่ถ้าเราหันมาเขียนโปรแกรมเชิงวัตถุ
<?php
// db.class.php
class sql {
  function getUser( $user )
  {
    $sql = "SELECT * FROM table1 WHERE user=$user";
    $query = mysql_query( $sql );
    $rows = mysql_num_rows( $query );
  }
}

class sql สามารถเขียนโดยการแยกออกเป็นไฟล์ต่างหากได้ แล้วเรียกใช้โดยการ include เข้ามา
<?php
  include( 'db.class.php' );
  $db = new sql();

  // แสดงผล query ครั้งที่1
  $query = $db->getUser( 'xxx' );
  // แสดงผล query ครั้งที่2
  $query = $db->getUser( 'yyy' );
  // แสดงผล query ครั้งที่3
  $query = $db->getUser( 'zzz' );

จะเห็นได้ว่า เราจะสามารถลดความซ้ำซ้อนของโค้ดลงได้มาก เนื่องจากเราไม่ต้องเขียนโค้ดที่ยุ่งยากและยาวซ้ำกันหลายๆครั้ง ทั้งยังทำให้โค้ดดูเป็นระเบียบง่ายต่อการแก้ไขและเข้าใจง่ายอีกด้วย

2. ปัญหาการออกแบบเว็บขนาดใหญ่โดยทีมงานหลายๆคน ปัญหานี้เกิดขึ้นเมื่อเราทำโปรเจ็คที่ประกอบด้วยทีมงานหลายๆคน ซึ่งแต่ละคนจะต้องแยกกนทำงานกันไปคนละส่วน ลองนึกถึงปัญหา การตั้งชื่อฟังก์ชั่น ซ้ำกัน แต่ทำงานกันคนละอย่าง สิครับ เช่น
ฟังก์ชั่น html2txt เขียนโดยนาย a
function html2txt( $str )
{
  return strip_tags( $str );
}

หรือ ฟังก์ชั่น html2txt เขียนโดยนาย b
function html2txt( $str )
{
  return htmlspecailchars( $str );
}

จะเห็นได้ว่า ทั้ง 2 ฟังก์ชั่นใช้ชื่อเดียวกัน เนื่องจากแต่ละคนก็ต้องการใช้ชื่อฟังก์ชั่นที่สื่อความหมายถึงงานที่ต้องการทำเหมือนๆกัน แต่ทั้ง 2 ฟังก์ชั่น 2 คนนี้ต้องการผลลัพท์ที่แตกต่างกัน ในกรณีนี้ การจะตัดฟังก์ชั่นของใครคนใดคนหนึ่งออกจากโปรเจ็คคงเป็นไปไม่ได้เนื่องจากผลลัพท์มันคงผิดจากความเป็นจริง และการ rename ฟังก์ชั่นไปใช้ชื่ออื่นก็คงไม่สะดวกนักหากมีการใช้โค้ดนี้ซ้ำหลายๆที่
ทางออกของปัญหานี้คือการเขียนโปรแกรมเป็น OOP ซะในตอนเริ่มต้น
<?php
// a.function.php
class a{
  function html2txt( $str )
  {
    return strip_tags( $str );
  }
}

Class ชองนาย a
<?php
// b.function.php
class b{
  function html2txt( $str )
  {
    return htmlspecialchars( $str );
  }
}

และ Class ของนาย b

ซึ่งนาย a ก็จะเขียนโค้ดเพื่อเรียกใช้ Class ของตัวเอง
<?php
include( 'a.function.php' );
echo a::html2txt( $ret );

และนาย b ก็จะเขียนโค้ดเพื่อเรียกใช้ Class ของตัวเองเช่นกัน
<?php
include( 'b.function.php' );
echo b::html2txt( $ret );

จะเห็นได้ว่าเราสามารถใช้งานร่วมกันได้อย่างไม่เป็นปัญหา แม้ชื่อฟังก์ชั่นจะซ้ำกัน ลดโอกาสความผืดพลาดในโปรเจ็คขนาดใหญ่

3. การอัปเกรดหรือแก้ไขความผิดพลาดของโค้ดในภายหลัง ลองนึกถึงการอัปเกรดทีมีการเขียนโค้ดกระจายกันไปหลายๆที่ ซึ่งในบางครั้งเราอาจพบว่าฟังก์ชั่นเดิมมีข้อผิดพลาดหรือมีการทำงานที่ไม่จำเป็นในภายหลัง เราก็คงต้องมานั่งแก้ไขในทุกๆจุดที่มีการใช้โค้ดเดียวกันนี้ เช่นในตัวอย่าง query ของ sql ที่ผมใช้ในหัวข้อที่ 1 จะเห็นได้ว่า ถ้าไม่ใช้ Class เราต้องทำการแก้ไขโค้ดให้ครบทั้ง 3 ส่วนที่เรียกใช้ เช่นในตัวอย่าง บรรทัด $rows ไม่มีประโยชน์อะไร เราก็ต้องมาค้นหาอละลบทีละบรรทัดจนครบ (แล้วถ้าโปรเจ็คขนาดใหญ่ล่ะ?)
การเขียนเป็นคลาส ทำให้การแก้ไขง่ายขึ้นเนื่องจากการอัปเกรดหรือแก้ไข ให้เราไปกระทำที่ Class เพียงแห่งเดียว ทุกจุดที่เรียกใช้ก็จะได้รับการแก้ไข หรืออัปเกรดตาม

สำหรับข้อเสียในการใช้งาน Class เท่าที่นึกๆดูก็ไม่เห็นจะมีถ้าคุณใช้ Class ที่เขียนขึ้นเองให้เหมาะกับโปรเจ็คของคุณ ที่ผมกล่าวเช่นนี้ก็เพราะว่าในปัจจุบันมี Class ให้เลือกใช้งานได้มากมาย โดยเฉพาะ Class ในกลุ่มของ Frame Work หรือ Library ซึ่งมักเป็น Class ที่นำมาใช้เพื่ออำนวยความสะดวกในการเขียนโค้ด เพื่อให้สั้นและเขียนง่าย แต่ Library พวกนี้มักมีข้อเสียตรงที่ ถ้าเป็น Library ที่มีคุณสมบัติครบถ้วนก็มักเป็น Library ขนาดใหญ่ และอาจมีฟังก์ชั่นบางอย่างที่ไม่ตรงตามความต้องการของเรา หรือมีคุณสมบัติมากเกินความจำเป้นของเรา (คุณสมบัติมาก=>ไฟล์ขนาดใหญ่=>โหลดช้า) ดังนั้นผมก็แนะนำให้คุณใช้งาน Class แต่พอดีครับ

ผู้เขียน goragod โพสต์เมื่อ 06 พ.ย. 2551 เปิดดู 22,413 ป้ายกำกับ PHPJavascriptClass
^