5

Câu hỏi này phát sinh từ công việc của tôi trên một ứng dụng Grails, nhưng nó áp dụng cho khá nhiều ứng dụng web được phát triển trong các lớp. Dưới đây là ví dụ đơn giản:Các phương thức của lớp dịch vụ có phải là các cá thể hoặc id không?

class OrderService { 

    // Option 1 
    def shipOrder(Order order) { 
     order.status = OrderStatus.SHIPPED 
     emailService.sendShipmentEmail(order) 
     // ... 
    } 

    // Option 2 
    def shipOrder(long orderId) { 
     def order = Order.get(orderId) 
     order.status = OrderStatus.SHIPPED 
     emailService.sendShipmentEmail(order) 
     // ... 
    } 

} 

Có bất kỳ tùy chọn nào trong số này được coi là tốt hơn cái kia không?

+1

Như thường lệ với các loại câu hỏi này, điều đó phụ thuộc. Đây không phải là một câu hỏi hay cho SO và có thể sẽ bị đóng. – Gregg

+0

Hm, không nhận ra điều đó. Tôi đã thay đổi câu hỏi một chút để làm cho nó ít phụ thuộc vào ý kiến. –

Trả lời

9

Tôi có xu hướng thích id hơn, vì đôi khi bạn muốn sử dụng khóa bi quan, và sau đó thật dễ dàng để thay đổi Order.get(orderId) thành Order.lock(orderId). Việc khóa phải xảy ra trong một giao dịch, do đó, bằng cách sử dụng phương pháp đầu tiên bạn sẽ khóa sau khi đọc, chạy nguy cơ cập nhật nhỏ ở giữa.

Đôi khi cần phải tải trường hợp bên ngoài dịch vụ, ví dụ: để kiểm tra sự tồn tại trong bộ điều khiển, vì vậy phương pháp thứ hai có thể cảm thấy như nó lãng phí một cuộc gọi cơ sở dữ liệu. Nhưng bạn có thể thay đổi cuộc gọi get() thành cuộc gọi exists() và chỉ kiểm tra sự tồn tại của id, thay vì tải toàn bộ cá thể để xem liệu nó có ở đó hay không.

Lưu ý rằng bạn nên sử dụng long orderId trong chữ ký phương thức của mình vì việc cho phép một id không có ý nghĩa.

+0

+1 Postmortem tuyệt đối của trường hợp sử dụng. Đặc biệt là 'exist()', tôi thấy rằng rất nhiều ở nơi làm việc của tôi. :) – dmahapatro

+1

Thú vị. Tôi không biết về 'exist()'. –

+0

Tôi cũng vậy. Ngoài ra, tôi nghe Groovy xử lý lâu dài và dài như nhau (khác với Java). Bây giờ tôi mới xác nhận rằng lâu không thể là vô giá trị, thực sự! Đã thay đổi mã ở trên. Cảm ơn! –