[Tech] Clean Architecture

Teerachai Laothong
The S (mana)
Published in
2 min readSep 28, 2021

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

แน่นอนว่านอกจาก Architecture ที่ดีแล้ว ระบบที่ดีควรต้องมีองค์ประกอบอื่นๆ เช่น Readable Code, KISS, LSP, SOLID, DRY หรือแม้แต่ Security และ Reliability เป็นต้น ซึ่งเราจะค่อยๆนำเสนอในบทความต่อๆไป อย่างไรก็ตามสิ่งสำคัญที่ขาดไม่ได้สำหรับระบบที่ดีก็คือ Architecture ที่ดี

องค์ประกอบสำคัญของ Clean Architecture มี 4 Layers ตามภาพ(image 1)ด้านล่าง ได้แก่
1. Application Core
2. Infrastructure
3. Tests
4. User Interface (Web / API / Desktop / Mobile)

image 1 from .NET documentation¹

แต่ละส่วนมีหน้าที่ดังนี้

Application Core

เป็นส่วนการทำงานหลักของระบบ โดยทั่วไป Business Requirements จะถูกเขียนที่นี่ ทั้งการคำนวณ ตรรกะเงื่อนไข หรือการประมวลผลต่างๆ ดังนั้น Layer นี้มักประกอบด้วย

  • Business Service เพื่อเป็นตัวจัดการทำงานหลักๆ
  • Business Logic, Business Rules, Business Process
  • Models ต่างๆ หรือบางทีอาจรวมถึง Domain Models ด้วย
  • Specifications, Validations รวมถึงการ check privilege
  • Exceptions ที่บอกเหตุผิดพลาดจากการทำงาน
  • Interfaces ทั้งหลาย
  • Interface ที่ใช้กับ Infrastructure โดยเฉพาะ, สำหรับเรื่อง infrastructure จะประกาศ interfaces ไว้ที่ Application Core แต่จะไป implements ใน Infrastructure Layer

Infrastructure

มักประกอบด้วยส่วนสนับสนุนการทำงานพื้นฐานของระบบ เช่น การเก็บข้อมูลไม่ว่าจะเป็น Relational Database, NoSQL หรือ Object Storage อื่นๆ, ส่วนของการ log, หรือแม้แต่การทำ messaging เป็นต้น ปกติงานใน Layer นี้มักจะขึ้นอยู่กับการเลือกใช้เทคโนโลยี เช่น ใช้ relational database อาจจะเขียน code แบบนึง แต่ถ้าใช้ NoSQL อาจจะเขียนต่างออกไป โดยการสร้าง layer นี้จะนำเอาเทคโนโลยีที่เลือกมา implement interfaces ที่ได้ประกาศไว้ใน Application Core เพื่อสนับสนุนการทำงานของ application ให้เป็นไปตาม business requirements องค์ประกอบที่มักจะพบในส่วนนี้ได้แก่

  • Persistence Service
  • Repository
  • Caching
  • Messaging
  • Email / SMS หรือส่วนสนับสนุนด้านเทคโนโลยีอื่นๆ

User Interface

เป็นส่วนที่รับผิดชอบการติดต่อแบบ interactive กับ clients ถ้าคิดซะว่าเป็น UI ของ web น่าจะทำให้นึกภาพตามได้ง่าย แต่ทั้งนี้ไม่จำเป็นต้องหมายถึง GUI อย่างเดียว ในบางระบบอาจจะมีการคุยกับ client ผ่าน REST API หรือ gRPC ก็นับเป็นงานใน layer นี้ได้เช่นเดียวกัน ส่วนนี้มักจะประกอบไปด้วย

  • Controllers, Views, Models ในกรณี MVC
  • บางคนอาจเลือกใช้ ViewModels หรือ MVP ก็นับเป็น layer นี้
  • Middlewares หรือ Filters ใน ASP.NET Core ก็นับ
  • Cookies, JavaScript, CSS
  • ASP.NET Core Identity
  • Web API, gRPC เป็นต้น

Tests

ระบบที่ดีต้องมี Reliability และ Quality ที่สูง หมายความว่าอย่างน้อยต้องมีการทดสอบอย่างเหมาะสม แบบไม่มีอะไรเลยก็น่าจะต้องมี Unit Tests ส่วนจะมี Integration Test หรือแม้แต่พวก Non-Functional Tests เพิ่มเติมไปด้วยได้ก็ยิ่งดี ถ้าเราวาง Architecture ไม่ดีพอ โดยทั่วไปแม้แต่ unit test ก็เขียนยากแล้ว แต่หากทำตามหลักการของ Clean Architecture เราจะเห็นว่า Infrastructure จะถูกแยกออกไป implement ต่างหาก ไม่เกี่ยวข้องกับ Business Logic ที่อยู่ใน Application Core ทำให้ Business Service ที่อยู่ใน Application Core เขียน test ได้สบายขึ้นมาก ลองดูภาพ(image 2)ประกอบด้วยจะเข้าใจมากขึ้น

image 2 from .NET documentation¹

จากที่กล่าวมาทั้งหมด ในแต่ละ Layers เราจะเห็นว่าประกอบด้วย components ย่อยๆลงไปอีกมากมาย แต่ทุก component จะช่วยเสริมงานใน layer นั้นๆให้สมบูรณ์ขึ้น ภาพ(image 3)ด้านล่างแสดงให้เห็นตัวอย่างของ Clean Architecture สำหรับ ASP.NET Core

image 3 from .NET documentation¹

สำหรับตัวอย่างของ Project ที่มีโครงสร้างตามแนวทางที่ได้อธิบายมา มีคนเก่งๆหลายคนช่วยกันเขียน template สำหรับ ASP.NET Core ไว้แล้ว ลองเข้าไปดูเพื่อทำความเข้าใจมากขึ้นได้ที่ https://github.com/jasontaylordev/CleanArchitecture

Summary

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

References:
[1]: Microsoft. (12/01/2020). Common web application architectures https://docs.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/common-web-application-architectures

--

--