PlusMagi's Blog By Pitt Phunsanit Backend,Database Clean Architecture: Control Flow vs Dependency Flow

Clean Architecture: Control Flow vs Dependency Flow

Clean Architecture คือหลักการออกแบบซอฟต์แวร์ที่มุ่งเน้นการแยกส่วนประกอบ (Separation of Concerns) ออกจากกันอย่างชัดเจน เพื่อให้ระบบมีความยืดหยุ่น ทดสอบได้ง่าย และสามารถเปลี่ยนแปลงได้โดยไม่ส่งผลกระทบต่อส่วนอื่น ๆ หัวข้อ ‘Control Flow’ และ ‘Dependency Flow’ คือหัวใจสำคัญในการทำความเข้าใจว่าระบบของเราจะจัดการการไหลของข้อมูลและการไหลของตรรกะอย่างไร โดยเฉพาะเมื่อเราใช้ PostgreSQL เป็นระบบฐานข้อมูลหลัก

Dependency Flow: การพึ่งพาข้อมูล (Data Dependencies)

Dependency Flow หมายถึงการพึ่งพาทางโครงสร้างข้อมูล (Structural Dependency) ที่ส่วนหนึ่งของโค้ดต้องพึ่งพาข้อมูลหรือโครงสร้างของอีกส่วนหนึ่ง การจัดการ Dependency Flow ใน PostgreSQL มักจะเกี่ยวข้องกับการใช้ Foreign Keys, Joins, และการเรียกใช้ข้อมูลจาก Schema ต่าง ๆ

ตัวอย่างเช่น หากเรามีตาราง `products` และ `orders` การที่ `orders` ต้องอ้างอิง `product_id` แสดงถึง Dependency Flow ที่ชัดเจน

SQL

-- 1. Setup Tables (Dependency) --
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    product_id INT REFERENCES products(product_id),
    status VARCHAR(50)
);

-- 2. Query demonstrating Dependency Flow --
SELECT
    p.name, o.status
FROM
    products p
JOIN
    orders o ON p.product_id = o.product_id
WHERE
    o.status = 'pending';

Control Flow: การพึ่งพาลอจิก (Logical Dependencies)

Control Flow หมายถึงการพึ่งพาทางตรรกะ (Logical Dependency) ซึ่งหมายถึงการที่การทำงานของโค้ดส่วนหนึ่งต้องอาศัยเงื่อนไขหรือลำดับการทำงานของโค้ดอีกส่วนหนึ่ง การจัดการ Control Flow ใน PostgreSQL มักจะใช้ภาษา PL/pgSQL เพื่อสร้าง Stored Procedures หรือ Functions ที่มีเงื่อนไขการทำงาน (Conditional Logic)

ตัวอย่างเช่น การตรวจสอบสถานะสินค้าก่อนที่จะดำเนินการสั่งซื้อ เป็นการใช้ Control Flow

SQL

-- Function demonstrating Control Flow using PL/pgSQL --
CREATE OR REPLACE FUNCTION process_order(p_product_id INT, p_quantity INT) RETURNS BOOLEAN AS $$
DECLARE
    product_name VARCHAR(100);
BEGIN
    -- Check if product exists (Control Flow: IF condition)
    SELECT name INTO product_name FROM products WHERE product_id = p_product_id;

    IF product_name IS NULL THEN
        RAISE EXCEPTION 'Product ID % not found.', p_product_id;
    ELSE
        -- Simulate successful transaction
        INSERT INTO orders (product_id, status) VALUES (p_product_id, 'processed');
        RETURN TRUE;
    END IF;
END;$$ LANGUAGE plpgsql;

-- Execution of the function (Control Flow dictates the outcome)
SELECT process_order(1, 2);

บทสรุป: การแยก Flow เพื่อความยืดหยุ่น

ในฐานะ Senior Architect เราต้องมั่นใจว่าการออกแบบระบบของเราสามารถแยก Dependency Flow (โครงสร้างข้อมูล) ออกจาก Control Flow (ตรรกะทางธุรกิจ) ได้อย่างชัดเจน การใช้ PostgreSQL อย่างมีประสิทธิภาพคือการใช้ SQL สำหรับ Dependency (การเชื่อมโยงข้อมูล) และใช้ PL/pgSQL สำหรับ Control (การจัดการเงื่อนไข) การแยกส่วนนี้ทำให้เราสามารถปรับปรุงตรรกะทางธุรกิจ (เช่น การเปลี่ยนเงื่อนไขการสั่งซื้อ) โดยไม่ต้องแก้ไขโครงสร้างตารางหลัก ซึ่งเป็นหัวใจสำคัญของ Clean Architecture และทำให้ระบบของเรามีความทนทานต่อการเปลี่ยนแปลง (Maintainability) สูงสุด

Exit mobile version