วันอาทิตย์ที่ 7 พฤศจิกายน พ.ศ. 2553

OOP Basics

OOP (Object-Oriented Programing)
การโปรแกรมเชิงวัตถุ มีคำอธิบายว่าคือการเขียนโปรแกรมให้มีคุณสมบัติเหมือนวัตถุ

ซึ่งเราสามารถจำแนกรูปแบบของการเขียนโปรแกรมเชิงวัตถุพื้นได้แก่
1) Encapsulation คุณสมบัติการห่อหุ้ม
ถ้าการเขียน class ใดๆ ที่มีการใช้ตัวแปร global หรือการเข้าแก้ไขตัวแปร member ของ object อื่นๆ ตัวแปรอื่นๆ นอกจากตัวแปร member ของมันเอง
ถือว่าเป็นการเขียนรูปแบบ OOP ที่ไม่ดี อาจจะเรียกได้ว่าไม่ใช่ OOP เลยก็ได้
คุณสมบัตินี้ถือเป็นคุณสมบัติที่สำคัญมาก เพราะถ้า object หนึ่งมีการ share ตัวแปร global กับ object อื่นๆ แล้วย่อมทำให้คุณสมบัติการจัดกลุ่มตัวแปร scope ของตัวแปร
สูญเสียไปอย่างสิ้นเชิง ถือว่าไม่ต่างจากการเขียนโปรแกรมแบบ Procedural ทั่วๆ ไป นอกจากนี้ยังอ่านและแก้ไขโปรแกรมได้ยากกว่าอีกด้วย

2) Inheritance คุณสมบัติการสืบทอด
โดยปกติแล้วเราไม่จำเป็นต้องสร้าง class และสร้าง class ที่สืบทอดจากอีก class นี้เพื่อให้ class มีคุณสมบัติเป็น OOP
แต่การสืบทอดหรือใน php ที่เราใช้ keyword extends นั้นมีประโยชน์ที่ทำให้เราสามารถใช้งานโค้ดได้อย่างมีระเบียบมากขึ้น
ตัวอย่างเช่น class A มีคุณสมบัติ Encapsulation ดีมาก สามารถนำไปใช้ได้หลายงาน
แต่ในการใช้งานจริงเราอาจจำเป็นต้องมี class ซึ่งใช้งานเฉพาะด้าน ถ้าหากเราเข้าไปแก้ไข class A จะทำให้ class A สูญเสียคุณสมบัติในการนำกลับมาใช้ใหม่ในทันที
เพื่อที่จะสามารถนำ class มาใช้งานเฉพาะด้านเราจึงสร้าง class B extends A เพื่อให้ class B ของเรามีคุณสมบัติเหมือน class A
และ class B จะถูกนำไปแก้ไขเพื่อใช้กับงานประยุกต์เฉพาะด้านโดยไม่ส่งผลกระทบกับ class ต้นฉบับ

3) Polymorphism การเรียกใช้แบบเดียวแต่ทำงานตอบสนองได้หลายแบบ
ตัวอย่างนี้ของคุณสมบัตินี้มักจะถูกยกตัวอย่างในรูปของ class Shape
โดยมี class Circle, Rectangle, Triangle เป็นคลาสลูก หรือ class ที่สืบทอดมาจาก class Shape
ซึ่งชี้ให้เห็นว่าการเรียกใช้งาน function cal นั้น ซึ่งมีการเรียก method cal ของคลาสลูกของ Shape สามารถทำงานปรับเปลี่ยนไปตามคุณสมบัติของคลาสลูก ได้

ประโยชน์ของการมี class ที่เป็น polymorphism ได้แก่ class หรือ function อื่นๆ ที่เรียก method cal นั้น
นั่นก็คือไม่เพียงแต่ class หรือ function จะยึดติดให้การทำงานใช้ได้เฉพาะกับ class Shape เท่านั้น แต่
class หรือ function เดิมนั้นยังสามารถนำกลับมาใช้ใหม่กับคลาสลูกของ Shape ได้ โดยมีการทำงานตามคุณสมบัติของ class ลูกโดยเฉพาะอีกด้วย
กล่าวคือเราสร้าง function เดียวแต่สามารถเปลี่ยนแปลงการทำงานโดยไม่ต้องแก้ที่ function หลัก แต่เพียงแต่แก้ที่ method ของคลาสลูกเท่านั้น
การเขียนในรูปแบบ OOP นี้จึงทำให้โค้ดหลักมีความเป็นระเบียบ โค้ดรูปแบบเดียวสามารถ
เปลี่ยนแปลงการทำงานโดยเพียงแค่เปลี่ยนชื่อคลาสลูกหรือเปลี่ยนตัวแปรเป็น object ของคลาสลูก


<?php
class Shape{
var $name='S';
function cal(){
return 0;
}
}
class Circle extends Shape{
var $ray;
var $name='C';
function Circle($ray){
$this->ray = $ray;
}
function cal(){
return (22/7)*pow($this->ray,2);
}
}
class Rectangle extends Shape{
var $edge;
var $name='R';
function Rectangle($edge){
$this->edge = $edge;
}
function cal(){
return pow($this->edge,2);
}
}
class Triangle extends Shape{
var $base;
var $height;
var $name='T';
function Triangle($base,$height){
$this->base = $base;
$this->height = $height;
}
function cal(){
return 0.5*$this->base*$this->height;
}
}
function cal(Shape $obj){
return $obj->cal();
}
$c = new Circle(10);
$r = new Rectangle(10);
$t = new Triangle(10,10);
foreach(array($c,$r,$t) as $shape){
echo '<br',' />',$shape->name,' = ',cal($shape);
}
?>

ไม่มีความคิดเห็น:

แสดงความคิดเห็น