Quantcast
Channel: jQueryTips by Tee++; » Uncategorized | jQueryTips by Tee++;
Viewing all articles
Browse latest Browse all 10

PHP กับ OOP มาปูพื้นฐานกันเสียใหม่ก่อน

$
0
0

สวัสดี สวีดัด ไม่ได้พบเจอกันนาน เป็นไงกันบ้าง หวังว่าคงสบายดีกันทุกคน ว่างๆ ก็ไปทักทายกันที่ Fan Page ได้นะครับ

วันนี้จะมาคุยถึงเรื่อง Object-oriented programming (OOP) ในภาษา PHP กันซะพอหอมปากหอมคอ

ก่อนอื่นนั้น เท่าที่สังเกตุส่วนมาก Developers สมัยนี้แทบจะเรียกว่า เขียนโปรแกรมแบบ OOP “เป็น” กันหมดแล้ว เพราะว่าสมัยนี้ Framework หรือว่า Components ต่างๆ นั้นถูกผลิตมาแบบ OOP เป็นเสียส่วนใหญ่ จริงๆ ก็เรียกได้ว่า แทบจะ 100% เลยทีเดียว ทั้ง Yii, CI, Zend, etc. ซึ่งแน่นอนเราก็หลักเลี่ยงที่จะใช้มันไม่ได้เสียด้วย ทีนี้พอ Developers ใช้ของพวกนี้บ่อยๆ เข้าจนชำนาญ ก็พาลคิดไปว่า กรูนี่เขียน OOP “เป็น” แต่ไอ้คำว่า เป็น นี่ต้องมาดูกันอีกทีว่าเป็น แค่นั้น เพราะว่าของพวกนี้ มันต้องมี Basic ครับ ไม่สามารถกระโดดข้ามขั้นไปได้

เพราะว่าถ้า Basic ไม่แน่น ขาดความเข้าใจพื้นฐาน มันก็จะพาล ไปเขียนโคดแบบ Procedural ใน OOP Framework เสียฉิบ ไล่มาตั้งแต่ Keywords ของ OOP เลย ต้องทำความเข้าใจให้ครบถ้วน อาทิเช่น

interface + implements ใช้ทำอะไร

abstract class คืออะไร

public, private, final, protected  ต่างกันยังไง

static ใช้ทำอะไร ต้องใช้แบบไหนจึงจะเหมาะสม

พอไล่เรื่อง keywords จบก็ควรจะศึกษาเรื่อง Design Patterns ต่อ เพราะว่า การเขียน oop ไม่ใช่มีแบบเดียว ต้องเลือกเขียนให้เหมาะสมกับงานที่จะใช้งาน

โดยส่วนนี้ผมขออ้างอิงจากบทความของ คุณ Robert Gonzalez (ชื่อแม่งเหมือนนักมวยเลย) ซึ่งเขียนได้น่าสนใจมากๆลองอ่านดูนะครับ

OOP Design Patterns for PHP

 

หลังจากทำความข้าใจกับ Patterns ต่างๆ ได้ ทีนี้เวลาเราเจอกับ โจทย์ เราก็จะเลือก คำตอบที่ถูกต้องกับงานได้ครับ อาทิเช่น

ผมมีโจทย์ที่ต้องเขียน ติดต่อกับ Database ซึ่งโจทย์ผม บอกว่า ผมต้องติดต่อกับฐานข้อมูลได้ทั้งหมด ผมก็จะออกแบบ Class ได้ถูกต้องว่า Design Pattern มันต้องเป็นแบบ Factory Design

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

ถ้าเปรียบกับโจทย์ก็คือ ไม่ว่าผมจะใช้ Database อะไร Output ผมต้องออกมาเหมือนเดิม โดยไม่เปลี่ยน วิธีการเขียนติดต่อ เปลี่ยนแค่ adapter บางตัว ซึ่งอยู่ภายใน Factory ผมอีกที

ซึ่ง Class แบบนี้เป็น รูปแบบ OOP ที่เขียนลำบากแต่ว่าคุ้มค่ามากที่จะเขียน ตัวอย่างงานที่ต้องใช้ Class แบบนี้ก็คือ

1. Database Drivers

2. Hub Payment Gateways

3. Encryption

4. Caching

5. Hub SMS Gateway

แล้วก็อีกเยอะครับ, ทำไมต้องใช้แบบนี้ ??

อืมม์ ลองนึกตามดูครับ เอาเป็นเรื่อง Gateway ละกัน โจทย์ของผมมีว่า ผมต้องการทำระบบ คิดเงินออนไลน์ แต่ว่า Gateway ผมจะใช้แม่งทุกตัวเลย ตั้งแต่ Paypal, Google Checkout, 2Checkout ทีนี้ ถ้าผมต้องมาเขียน if else ในโปรแกรมผมแบบว่า

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

switch ($gateway)
{
  case 'paypay' :

    break;
  case 'gg_checkout' :

    break;
  case '2checkout' :
    break;
}

?>

 

ซึ่ง โคดผมก็คงจะดูวุ่นวายแบบนี้หลายจุด มาก เพราะว่า Gateway ต้องมีทั้ง ขาส่ง แล้วก็ขารับที่ เป็น Feed Data ส่งกลับมา if…else แบบนี้เวลาเพิ่ม Gateway ทีก็ต้องมาไล่แก้กันบานเยอะ

แต่ถ้าผมเขียน Class แบบ Factory มาใช้งาน ผมก็จะเขียนแค่

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$pay = Payment::factory('paypal', $config);
$pay->redirect();

if ($pay->isSuccess()) {
}

if ($pay->isCanceled()) {
}

if ($pay->isPostedBack()) {
}

?>

 

แบบนี้เวลาผมเพิ่ม adapter ตัว งานที่เขียนก็แทบไม่ต้องแก้อะไรเลย

ด้านล่างนี้เป็นตัวอย่าง Class Gateway ที่ผมเขียนใช้เอง ลองโหลดไปดูเล่นๆ ได้ครับ แต่ว่ามันยังไม่ สมบูรณ์ดีในบาง Adapter นะครับ

https://github.com/teepluss/jPayment-Gateway

เอาล่ะๆ เริ่มขี้เกียจอีกแล้ว

ทีนี้เราลองมาดูตัวอย่างบทความดีๆ ของคนอื่นที่พูดถึงเรื่อง OOP Design Patterns กันบ้างนะครับ

http://www.ibm.com/developerworks/library/os-php-designptrns/

 

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


Viewing all articles
Browse latest Browse all 10

Trending Articles