Domain driven design

**Domain - driven design** là một cách tiếp cận trong việc xây dựng phần mềm phức tạp, sự phức tạp ở đây là những logic của lĩnh vực kinh doanh (domain business).

Thuật ngữ đã được đưa ra bởi Eric Evans trong một cuốn sách cùng tên.

## Các khái niệm

### Domain
Đinh nghĩa dễ hiểu nhất về domain ở đây là, ví dụ trong một hệ thống thương mại điện tử (e-commerce system) thì sản phẩm, đơn đặt hàng, khách hàng... và các hiểu biết như khách hàng có thể đặt một sản phẩm, một đơn hàng có thể được thanh toán bởi một khách hàng chính là thuộc về domain.

những phần về kỹ thuật bao gồm xử lý request, form, connect database, lưu trữ thông tin nằm ngoài domain.

### Ubiquitous Language
Một ngôn ngữ có cấu trúc xung quanh domain được sử dụng bởi tất cả các thành viên trong nhóm phát triển (developer, domain expert, customer) để kết nối các hoạt động của nhóm với phần mềm.

đây là ngôn ngữ giải quyết cho vấn đề khó khăn tồn tại là doanh nghiệp thường không hiểu được những ngôn ngữ kỹ thuật bên dưới, còn nhà phát triển thì không hiểu được business logic của product. Cần có một ngôn ngữ chung để chia sẻ giữa doanh nghiệp và nhà phát triển để hiểu sản phẩm theo một cách như nhau.

### Contexts and Bounded Contexts
Bounded Contexts tạm dịch Phạm vi Ngữ cảnh.

Phạm vi ngữ cảnh có thể được xem như một ứng dụng thu nhỏ, chứa những model của chính nó và mã nguồn cùng cơ chế lưu trữ (persistence) riêng. Bên trong Phạm vi Ngữ cảnh cần có sự thống nhất hợp lý. mỗi bounded contexts nên độc lập với bất kỳ bounded contexts khác. Ví dụ trong một e-commerce system chúng ta có thể coi chương trình của chúng ta trong ngữ cảnh của cửa hàng (shopping), nhưng sâu hơn ta có thể thấy có những ngữ cảnh khác nữa ở đây chẳng hạn Hàng hóa tồn kho (Inventory), Giao nhận (Delivery) và Tài khoản (Account).

Chia một ứng dụng lớn trong những bối cảnh hợp lý khác nhau sẽ cho chúng ta khả năng module hóa hệ thống, sẽ giúp ta phân tách mối quan tâm khác nhau vào những phần riêng biệt và làm cho các ứng dụng dễ dàng để quản lý và nâng cấp.

### Entities and Value Objects
Entiies và Value Objects là những building blocks trong Domain Driven Design nó là những thành phần để xây dựng Domain Model. Tất cả những đối tượng này đều xuất phát từ sự ánh xạ của  Ubiquitous Language và có những tính chất, hành vi mà phản ánh chính xác nghiệp vụ của miền (Domain Business), Trong DDD thì những đối tượng này được đặt ở lớp miền (Domain Layer) và được cô lập với mọi thành phần bên ngoài lớp miền này.

Entity và Value Objects đều là các đối tượng miền nhưng giữa chúng có những sự khác nhau cơ bản và cũng rất quan trọng để phân biệt.

Cụ thể:

- Các thực thể (Entities) có một định danh (Identity) riêng  của chúng trong khi các đối tượng giá trị (Value Objects) thì không.

- Các khái niệm so sanh ngang bằng về định danh đề cập đến các thực thể (so sánh 2 thực thể dựa trên định danh), các khái niệm so sánh các giá trị của đối tượng đề cập đến đối tượng giá trị (so sánh các giá trị trong một đối tượng).

- Một Value Object luôn phải thuộc về 1 hoặc nhiều Entity,

- Một Entity thì có thể thay đổi trạng thái (Mutable) trong khi một Value Object thì không (Immutable).

### Aggregates and Aggregate Roots

### Persistence Ignorance

## Tham khảo