在領域驅動設計(DDD)中,常用的縮寫和概念包括以下幾種:DO(Domain Object)、DTO(Data Transfer Object)、VO(Value Object)、Entity、Repository、Service、Factory、和Aggregate。我們這裏簡單總結一下這些概念的使用場景、特點、檔案命名規範
VO(Value Object):值物件
命名慣例: 通常使用屬性名作為檔名,例如:Address.java
。
VO是不可變的物件,通常用於封裝資料,像顏色、座標或日期這樣的簡單物件。
使用場景:
表示不可變的物件,通常用來描述一些屬性的組合,不具有唯一識別符號。
常用於表示貨幣、地址等不可變物件。
特點:
不可變物件,沒有唯一識別符號。
通常用於表示屬性的組合。
程式碼示例
public class Address { private final String street; private final String city; private final String postalCode; public Address(String street, String city, String postalCode) { this.street = street; this.city = city; this.postalCode = postalCode; } // Getters and no setters to ensure immutability }
DO(Domain Object):領域物件
命名慣例: 通常使用實體名作為檔名,例如:Order.java
。
DO,表示具有業務含義的實體,例如使用者、訂單等。這些物件不僅僅包含資料,還可能包含業務邏輯。
使用場景:
表示業務領域中的實體,包含業務邏輯和行為。
常用於業務邏輯的實現和業務規則的封裝。
特點:
包含業務邏輯和行為。
表示業務領域中的實體或值物件。
程式碼示例
public class Order { private String orderId; private List<OrderItem> items; private Customer customer; public Order(String orderId, Customer customer) { this.orderId = orderId; this.customer = customer; this.items = new ArrayList<>(); } public void addItem(OrderItem item) { items.add(item); } public double calculateTotalPrice() { return items.stream().mapToDouble(OrderItem::getPrice).sum(); } // Getters and setters }
DTO(Data Transfer Object):數據傳輸物件
命名慣例: 通常在實體名後加上DTO
,例如:OrderDTO.java
。
DTO是爲了數據傳輸而設計的物件,它不包含任何業務邏輯,而僅僅是爲了在不同層之間傳遞資料。例如,一個從資料庫層向服務層傳遞使用者資訊的UserDTO可能包含使用者的姓名、email等。
使用場景:
用於在不同層之間傳輸資料,通常不包含業務邏輯。
常用於服務層和資料訪問層之間的數據傳輸。
特點:
僅包含資料,不包含業務邏輯。
用於數據傳輸和序列化。
程式碼示例
public class OrderDTO { private String orderId; private List<OrderItemDTO> items; private String customerId; // Getters and setters }
Entity:實體
命名慣例: 通常使用實體名作為檔名,例如:Customer.java
。
使用場景:
表示具有唯一識別符號的物件,通常是領域物件的一部分。
常用於表示資料庫中的記錄。
特點:
具有唯一識別符號。
通常與資料庫表一一對應。
程式碼示例
public class Customer { private String customerId; private String name; private Address address; public Customer(String customerId, String name, Address address) { this.customerId = customerId; this.name = name; this.address = address; } // Getters and setters }
Repository:倉庫
命名慣例: 通常在實體名後加上Repository
,例如:OrderRepository.java
。
使用場景:
提供對聚合的持久化和查詢操作,封裝資料訪問邏輯。
常用於資料訪問層。
特點:
封裝資料訪問邏輯。
提供CRUD操作。
程式碼示例
public interface OrderRepository { void save(Order order); Order findById(String orderId); List<Order> findAll(); }
Service:服務
命名慣例: 通常在功能名後加上Service
,例如:OrderService.java
。
使用場景:
封裝業務邏輯的服務,通常分為應用服務和領域服務。
常用於處理業務邏輯和協調多個領域物件的操作。
特點:
封裝業務邏輯。
提供業務操作的方法。
程式碼示例
public class OrderService { private final OrderRepository orderRepository; public OrderService(OrderRepository orderRepository) { this.orderRepository = orderRepository; } public void placeOrder(Order order) { // Business logic for placing an order orderRepository.save(order); } }
Factory:工廠
命名慣例: 通常在實體名後加上Factory
,例如:OrderFactory.java
。
使用場景:
提供建立複雜物件的邏輯,封裝物件建立的細節。
常用於建立複雜的領域物件或聚合。
特點:
封裝物件建立邏輯。
提供建立物件的方法。
程式碼示例
public class OrderFactory { public static Order createOrder(String orderId, Customer customer) { return new Order(orderId, customer); } }
Aggregate:聚合
命名慣例: 通常使用聚合根實體名作為檔名,例如:OrderAggregate.java
。
使用場景:
表示一組相關的領域物件的集合,透過一個根實體(Aggregate Root)來進行管理和操作。
常用於表示複雜的業務邏輯和數據結構。
特點:
由多個領域物件組成。
透過根實體進行管理和操作。
程式碼示例
public class OrderAggregate { private Order order; private List<OrderItem> items; public OrderAggregate(Order order) { this.order = order; this.items = new ArrayList<>(); } public void addItem(OrderItem item) { items.add(item); } public double calculateTotalPrice() { return items.stream().mapToDouble(OrderItem::getPrice).sum(); } // Getters and setters }