5

To pytanie powstało podczas mojej pracy nad aplikacją Grails, ale dotyczy prawie każdej aplikacji internetowej tworzonej w warstwach. Oto prosty przykład:Czy metody warstwy usług powinny oczekiwać wystąpień lub identyfikatorów?

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

} 

Czy którakolwiek z tych opcji została udokumentowana jako lepsza od drugiej?

+1

To zależy od tego rodzaju pytań. To nie jest dobre pytanie dla SO i prawdopodobnie zostanie zamknięte. – Gregg

+0

Hm, nie zdawałem sobie z tego sprawy. Zmieniłem trochę pytanie, aby było mniej zależne od opinii. –

Odpowiedz

9

Ja preferuję identyfikatory, ponieważ czasami chcesz użyć pesymistycznego blokowania, a następnie łatwo jest zmienić Order.get(orderId) na Order.lock(orderId). Blokowanie musi się zdarzyć w transakcji, więc używając pierwszego podejścia, które zablokujesz po przeczytaniu, uruchomisz małe ryzyko aktualizacji pośredniej.

Czasami konieczne jest załadowanie instancji poza usługę, np. przetestować istnienie w kontrolerze, więc drugie podejście może mieć wrażenie, że marnuje połączenie z bazą danych. Ale możesz zmienić wywołanie get() na wywołanie exists() i sprawdzać tylko istnienie identyfikatora, zamiast ładować całą instancję tylko po to, aby sprawdzić, czy istnieje.

Pamiętaj, że powinieneś używać long orderId w swoim sygnaturze metody, ponieważ zezwolenie na zerowy identyfikator nie ma sensu.

+0

+1 Bezwzględny postmortem przypadku użycia. Szczególnie 'exist()', widzę to bardzo w moim miejscu pracy. :) – dmahapatro

+1

Interesujące. Nie wiedziałem o istnieniu() '. –

+0

Ja też nie. Słyszałem też, że Groovy traktowano długo i długo tak samo (inaczej niż w Javie). Teraz właśnie potwierdziłem, że długo nie może być wartością zerową! Zmieniono powyższy kod. Dzięki! –