切換語言為:簡體

Java領域驅動設計:VO、DO、DTO:這些名詞你都懂了嗎?

  • 爱糖宝
  • 2024-06-07
  • 2083
  • 0
  • 0

在領域驅動設計(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
}

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.