ป้ายกำกับ: หน่วยเป็นวินาที

Clean Architecture: The Dependency RuleClean Architecture: The Dependency Rule

ในฐานะ Senior Architect ที่เชี่ยวชาญด้านระบบที่ยั่งยืน การทำความเข้าใจหลักการออกแบบสถาปัตยกรรม (Architecture) เป็นสิ่งสำคัญอย่างยิ่ง Clean Architecture คือแนวทางที่ช่วยให้เราแยกส่วนประกอบของระบบออกจากกันอย่างชัดเจน เพื่อให้โค้ดหลัก (Domain) ไม่ขึ้นอยู่กับรายละเอียดทางเทคนิคภายนอก เช่น ฐานข้อมูล (Database) หรือ UI

หัวใจสำคัญของ Clean Architecture คือ ‘Dependency Rule’ ซึ่งเป็นกฎที่ระบุว่าการพึ่งพา (Dependency) ของโค้ดจะต้องชี้เข้าด้านในเสมอ นั่นหมายความว่า โมเดลธุรกิจหลัก (Core Domain) จะต้องไม่รู้จักหรือพึ่งพารายละเอียดของชั้นโครงสร้างพื้นฐาน (Infrastructure) เช่น PostgreSQL, ORM, หรือระบบไฟล์ภายนอก

Understanding the Dependency Rule in PostgreSQL Context

เมื่อเราใช้ PostgreSQL เป็นระบบหลัก เราต้องระมัดระวังไม่ให้ตรรกะทางธุรกิจที่สำคัญที่สุด (เช่น การคำนวณสถานะการสั่งซื้อ) ถูกฝังอยู่ในคำสั่ง SQL หรือ Stored Procedure ที่ผูกติดกับรายละเอียดของตาราง (Table Schema) มากเกินไป

ตามหลัก Dependency Rule, โค้ดส่วน Domain ควรทำงานกับ ‘อินเทอร์เฟซ’ หรือ ‘โมเดลข้อมูล’ ที่เป็นนามธรรม (Abstract) เท่านั้น ส่วน PostgreSQL จะทำหน้าที่เป็น ‘ตัวนำไปใช้’ (Implementation) ของอินเทอร์เฟซเหล่านั้น

Structuring Layers with PostgreSQL

เราสามารถจำลองการแยกชั้นใน PostgreSQL โดยการแยก Schema หรือการใช้ Functions/Views เพื่อให้ Domain Logic อยู่ในชั้นที่สูงกว่า (หรือในส่วนที่เรียกใช้) และ Infrastructure Logic อยู่ในส่วนที่จัดการข้อมูลดิบ

สมมติว่าเรามี Domain Logic ที่ต้องการตรวจสอบว่ารายการสินค้าชุดหนึ่งมีสถานะพร้อมส่งหรือไม่ (Core Domain) ไม่ว่าข้อมูลจะมาจากตารางใดก็ตาม:

SQL

-- 1. Domain Layer (The Core Logic - Independent of DB details)</code>
CREATE OR REPLACE FUNCTION check_shipping_status(item_list text[]) RETURNS BOOLEAN AS $$
BEGIN
    -- Logic here only uses the abstract list of items, not table names.
    IF array_length(item_list, 1) < 2 THEN
        RETURN FALSE;
    END IF;
    RETURN TRUE;
END;$$
LANGUAGE plpgsql;

-- 2. Infrastructure Layer (The PostgreSQL Implementation)
-- This layer handles the actual data retrieval and mapping.
CREATE TABLE IF NOT EXISTS products (item_id TEXT PRIMARY KEY, status TEXT);
INSERT INTO products VALUES ('A', 'READY'), ('B', 'OUT_OF_STOCK');

-- 3. Calling the Domain Logic from the Infrastructure Layer
SELECT check_shipping_status(ARRAY['A', 'B']);

ในตัวอย่างนี้, ฟังก์ชัน `check_shipping_status` คือ Domain Logic ที่บริสุทธิ์ มันรับค่าเป็น Array ของ Item ID โดยไม่รู้ว่าข้อมูลเหล่านั้นถูกจัดเก็บในตาราง `products` อย่างไร การพึ่งพาจึงชี้เข้าสู่ Core Domain เสมอ

Conclusion: Benefits of Adhering to the Rule

การยึดมั่นใน Dependency Rule ทำให้ระบบของเรามีความยืดหยุ่นสูง (Highly Testable and Maintainable) หากในอนาคตเราต้องการเปลี่ยนจาก PostgreSQL ไปใช้ NoSQL Database, เราเพียงแค่ต้องเขียนโค้ดใหม่ในชั้น Infrastructure (เช่น การเขียน Repository Pattern ใหม่) โดยที่ Core Domain Logic ของเราไม่จำเป็นต้องเปลี่ยนแปลงแม้แต่น้อย นี่คือพลังที่แท้จริงของ Clean Architecture ที่ช่วยให้ระบบของเราทนทานต่อการเปลี่ยนแปลงทางเทคโนโลยีได้อย่างสมบูรณ์