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) สูงสุด