PlusMagi's Blog By Pitt Phunsanit Backend,Object-oriented Programming PHP: การประยุกต์ใช้หลักการ SOLID Principles ใน PHP

PHP: การประยุกต์ใช้หลักการ SOLID Principles ใน PHP

ในฐานะ System Specialist และ Senior Architect การพัฒนาซอฟต์แวร์ด้วยภาษา PHP ให้มีคุณภาพสูงนั้น ไม่ได้ขึ้นอยู่กับไวยากรณ์ (Syntax) เพียงอย่างเดียว แต่ต้องอาศัยการยึดมั่นในหลักการออกแบบเชิงวัตถุ (Object-Oriented Design Principles) ที่เป็นรากฐานสำคัญอย่าง SOLID

หลักการ SOLID คือชุดแนวทางปฏิบัติ 5 ข้อที่ถูกคิดค้นขึ้นเพื่อช่วยให้โค้ด PHP ของเรามีความยืดหยุ่น (Flexible), บำรุงรักษาได้ง่าย (Maintainable), และสามารถขยายขนาดได้ดี (Scalable) เมื่อระบบธุรกิจขยายตัว การละเลยหลักการเหล่านี้จะนำไปสู่ ‘Code Smells’ หรือโค้ดที่ซับซ้อนจนยากต่อการแก้ไขและเพิ่มฟีเจอร์ใหม่ ๆ

💡 เจาะลึก SOLID Principles ในการพัฒนา PHP

การประยุกต์ใช้ SOLID จะช่วยให้เราออกแบบระบบให้แยกส่วนความรับผิดชอบออกจากกันอย่างชัดเจน โดยเฉพาะอย่างยิ่งเมื่อต้องมีการโต้ตอบกับระบบฐานข้อมูลอย่าง PostgreSQL

S – Single Responsibility Principle (SRP)

คลาสหรือโมดูลควรมีหน้าที่รับผิดชอบเพียงเรื่องเดียวเท่านั้น (Should only have one reason to change) ตัวอย่างเช่น คลาสที่จัดการการแสดงผล (View) ไม่ควรมีหน้าที่ในการเชื่อมต่อฐานข้อมูล (Database Connection) ด้วย การแยกหน้าที่นี้ทำให้การทดสอบและการแก้ไขโค้ดทำได้ง่ายขึ้นมาก

O – Open/Closed Principle (OCP)

ส่วนประกอบซอฟต์แวร์ควรเปิดให้ขยายได้ (Open for extension) แต่ปิดไม่ให้แก้ไขเมื่อมีการเปลี่ยนแปลง (Closed for modification) หากเราต้องการเพิ่มประเภทสินค้าใหม่ (เช่น สินค้าดิจิทัล) เราควรเพิ่มโค้ดใหม่ (Extension) โดยไม่ต้องไปแก้ไขคลาสหลักที่ใช้ในการประมวลผลสินค้าเดิม

L – Liskov Substitution Principle (LSP)

อ็อบเจกต์ในโปรแกรมควรสามารถถูกแทนที่ด้วยอ็อบเจกต์ย่อยของมันได้โดยไม่ทำให้โปรแกรมผิดพลาด หากเรามีคลาสแม่สำหรับ ‘PaymentGateway’ และคลาสลูกสำหรับ ‘StripeGateway’ หรือ ‘PayPalGateway’ การทำงานของคลาสลูกจะต้องไม่ทำให้ฟังก์ชันหลักของคลาสแม่ล้มเหลว

I – Interface Segregation Principle (ISP)

แทนที่จะสร้าง Interface ขนาดใหญ่ที่มีหลายเมธอด เราควรแยกมันออกเป็น Interface ย่อย ๆ ที่เฉพาะเจาะจงตามบทบาท (Role-specific) เช่น แทนที่จะมี `IWorker` ที่มีทั้ง `work()` และ `manage()` เราควรแยกเป็น `IWorker` และ `IManager`

D – Dependency Inversion Principle (DIP)

หลักการนี้คือการหลีกเลี่ยงการพึ่งพาคลาสที่เป็นรูปธรรม (Concrete Class) โดยการพึ่งพาผ่าน Abstraction (Interface) แทน การทำเช่นนี้ทำให้โค้ดของเราไม่ผูกติดกับรายละเอียดการทำงานใด ๆ โดยเฉพาะอย่างยิ่งในการเชื่อมต่อกับฐานข้อมูล PostgreSQL เราควร Inject Dependency ของ Connection Object เข้ามา ไม่ใช่สร้างมันขึ้นมาในคลาสโดยตรง

ตัวอย่างการใช้ DIP ใน PHP กับ PostgreSQL

แทนที่จะให้คลาส `ProductService` สร้างการเชื่อมต่อเอง ควรรับ Connection Object เข้ามาผ่าน Constructor:

SQL

-- PostgreSQL: การกำหนดโครงสร้างข้อมูลที่ต้องส่งผ่าน Dependency
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    sku VARCHAR(50) UNIQUE,
    name VARCHAR(255),
    price NUMERIC(10, 2)
);

-- PHP Logic (Conceptual): ProductService ต้องรับ $pdoConnection เข้ามา
// $pdoConnection คือ Dependency ที่ถูก Inject เข้ามา
// $pdoConnection->prepare('SELECT * FROM products WHERE sku = ?');

🚀 บทสรุป: การสร้างสถาปัตยกรรมที่แข็งแกร่ง

การทำความเข้าใจและประยุกต์ใช้หลักการ SOLID ใน PHP ไม่ใช่แค่การทำตามทฤษฎี แต่คือการยกระดับความคิดในการออกแบบระบบ (Architectural Thinking) ให้เราสามารถสร้างโค้ดที่ทนทานต่อการเปลี่ยนแปลง (Resilient) และพร้อมสำหรับการเติบโตในอนาคตได้อย่างแท้จริง การทำเช่นนี้จะช่วยลด Technical Debt และทำให้ทีมพัฒนาสามารถทำงานได้อย่างมีประสิทธิภาพสูงสุด

Exit mobile version