Clean Architecture

ในฐานะ Senior Architect การเลือกใช้สถาปัตยกรรมที่เหมาะสมคือหัวใจสำคัญของการพัฒนาระบบที่ยั่งยืน Clean Architecture (CA) ไม่ใช่แค่รูปแบบการจัดโครงสร้างโค้ด แต่เป็นชุดของหลักการออกแบบที่มุ่งเน้นการแยกส่วนประกอบของระบบ (Separation of Concerns) ออกจากกันอย่างเด็ดขาด เพื่อให้ระบบมีความยืดหยุ่นสูง สามารถปรับเปลี่ยนเทคโนโลยีได้โดยไม่กระทบต่อแกนหลักทางธุรกิจ (Business Core) ของแอปพลิเคชัน

หลักการของ Clean Architecture: การป้องกันการพึ่งพา (Dependency Rule)

หัวใจสำคัญของ CA คือการกำหนดทิศทางการพึ่งพาที่เข้มงวด: ส่วนประกอบภายใน (Business Rules) จะต้องไม่รับรู้ถึงรายละเอียดของส่วนประกอบภายนอก (เช่น ฐานข้อมูล, UI, หรือเฟรมเวิร์ก) การพึ่งพาจะต้องไหลจากภายนอกเข้าสู่ภายในเสมอ ทำให้แกนหลักทางธุรกิจของเราเป็นอิสระจากรายละเอียดทางเทคนิคภายนอก

โครงสร้างชั้นหลัก (Layers) และบทบาทของ PostgreSQL

Clean Architecture แบ่งออกเป็นหลายชั้น โดยมีบทบาทดังนี้:

  • 1. Entities (Business Rules): ชั้นในสุด ประกอบด้วยกฎทางธุรกิจที่บริสุทธิ์และเป็นสากล ไม่ขึ้นอยู่กับเทคโนโลยีใด ๆ
  • 2. Use Cases (Application Logic): ส่วนที่ประสานงานการทำงานของระบบตาม Use Case ที่กำหนดไว้ เป็นตัวกลางที่เรียกใช้ Entities และติดต่อกับ Repository (ซึ่งเป็นส่วนที่ต้องพึ่งพาภายนอก)
  • 3. Interface Adapters (Gateways/Persistence): ชั้นนี้ทำหน้าที่แปลงข้อมูลจากรูปแบบที่ Use Case ต้องการ ให้เป็นรูปแบบที่เทคโนโลยีภายนอกเข้าใจได้ เช่น การแปลง Object ไปเป็น Row ของฐานข้อมูล PostgreSQL นี่คือจุดที่ PostgreSQL เข้ามามีบทบาทในการจัดเก็บข้อมูล

การประยุกต์ใช้ PostgreSQL ใน Repository Layer

เมื่อเราใช้ PostgreSQL ในระบบที่ออกแบบตาม CA ส่วนที่ต้องเขียนโค้ดติดต่อฐานข้อมูลโดยตรงคือ Repository Pattern ซึ่งอยู่ใน Interface Adapters Repository มีหน้าที่รับผิดชอบในการบันทึกและดึงข้อมูล โดยใช้ PostgreSQL เป็นตัวขับเคลื่อนหลัก

สมมติว่าเราต้องการฟังก์ชันสำหรับดึงข้อมูลผู้ใช้ (User) โดยใช้ PostgreSQL:

SQL

SQL

-- PostgreSQL SQL Code for User Repository --

-- 1. Define the table structure
CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(100) UNIQUE NOT NULL,
    email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 2. Function to retrieve a user by ID (Used by Use Case layer)
SELECT user_id, username, email
FROM users
WHERE user_id = 1;

-- 3. Function to insert a new user
INSERT INTO users (username, email) VALUES ('john_doe', '[email protected]');

ในตัวอย่างนี้ Use Case จะเรียกใช้เมธอด `UserRepository.findById(1)` โดยที่ Use Case ไม่จำเป็นต้องรู้ว่าเบื้องหลังการทำงานนั้นใช้ SQL หรือใช้ ORM ใด ๆ แต่รู้เพียงแค่ว่ามันจะได้รับ Object ของ User กลับมาเท่านั้น นี่คือการแยกความกังวลที่สมบูรณ์แบบ

บทสรุป: ประโยชน์สูงสุดในการพัฒนา

การใช้ Clean Architecture ร่วมกับ PostgreSQL ทำให้เราได้ระบบที่มีความแข็งแกร่งทางสถาปัตยกรรมอย่างยิ่ง ประโยชน์หลักคือ:

  • ความยืดหยุ่นของฐานข้อมูล: หากในอนาคตเราต้องการเปลี่ยนจาก PostgreSQL ไปใช้ MongoDB เราเพียงแค่แก้ไขโค้ดใน Interface Adapters (Repository) โดยที่ Use Cases และ Entities ไม่ต้องเปลี่ยนแปลงเลย
  • การทดสอบที่ง่ายดาย: เราสามารถ Mock (จำลอง) การทำงานของ Repository ได้ ทำให้เราสามารถเขียน Unit Test สำหรับ Use Cases โดยไม่ต้องเชื่อมต่อกับฐานข้อมูลจริงเลย

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

Exit mobile version