5

Этот вопрос возник из моей работы над приложением Grails, но это применимо практически ко всем веб-приложениям, разработанным в слоях. Вот простой пример:Должны ли методы уровня сервиса ожидать экземпляры или идентификаторы?

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) 
     // ... 
    } 

} 

Является ли какой-либо из этих вариантов более качественным, чем другой?

+1

Как всегда с этими вопросами, это зависит. Это не является хорошим вопросом для SO и, вероятно, будет закрыт. – Gregg

+0

Хм, не понял. Я немного изменил вопрос, чтобы сделать его менее зависимым от мнения. –

ответ

9

Я обычно предпочитаю идентификаторы, так как вы иногда хотите использовать пессимистическую блокировку, а затем легко изменить Order.get(orderId) на Order.lock(orderId). Блокировка должна произойти в транзакции, поэтому, используя первый подход, который вы заблокировали после прочтения, выполняется небольшой риск обновления между ними.

Иногда необходимо загрузить экземпляр вне службы, например. чтобы проверить существование в контроллере, поэтому второй подход может чувствовать, что он отбрасывает вызов базы данных. Но вы можете изменить вызов get() на вызов exists() и проверить только наличие идентификатора, а не загружать весь экземпляр, чтобы увидеть, есть ли он там.

Обратите внимание, что в вашей сигнатуре метода вы должны использовать long orderId, так как допускать нулевой идентификатор не имеет смысла.

+0

+1 Абсолютное посмертное использование прецедента. Особенно 'существует()', я вижу это много на моем рабочем месте. :) – dmahapatro

+1

Интересно. Я не знал о 'exists()'. –

+0

Я тоже. Кроме того, я слышал, как Groovy долго обрабатывал Long и тот же (иначе, чем Java). Теперь я только что подтвердил, что долго не может быть нулевым! Изменен код выше. Благодаря! –