Poniższy przykład jest całkowicie sztuczny, a jego jedynym celem jest przekazanie mojego punktu widzenia.
Załóżmy, że mam tabelę SQL:
CREATE TABLE rectangles (
width int,
height int
);
Klasa domeny:
public class Rectangle {
private int width;
private int height;
/* My business logic */
public int area() {
return width * height;
}
}
Załóżmy teraz, że mam wymaganie, aby pokazać użytkownikowi całkowity obszar wszystkich prostokątów w bazie danych. Mogę to zrobić, pobierając wszystkie rzędy stołu, obracając je w obiekty i iterując po nich. Ale to wygląda po prostu głupio, ponieważ mam wiele prostokątów w swoim stole.
Więc robię to:
SELECT sum(r.width * r.height)
FROM rectangles r
Jest to łatwe, szybkie i wykorzystuje zalety bazy danych. Wprowadza jednak zduplikowaną logikę, ponieważ mam również takie same obliczenia w mojej klasie domeny.
Oczywiście w tym przykładzie powielanie logiki wcale nie jest śmiertelne. Jednak mam ten sam problem z innymi klasami domen, które są bardziej złożone.
źródło
Odpowiedzi:
Jak wskazał lxrec, będzie się różnić w zależności od bazy kodu. Niektóre aplikacje umożliwiają umieszczenie tego rodzaju logiki biznesowej w funkcjach SQL i / lub zapytaniach oraz pozwalają na ich uruchomienie w dowolnym momencie, w którym użytkownik chce pokazać te wartości.
Czasami może się to wydawać głupie, ale lepiej jest zakodować poprawność niż wydajność jako główny cel.
W przykładzie, jeśli wyświetlasz wartość obszaru dla użytkownika w formularzu internetowym, musisz:
To głupie dla prostych rzeczy, takich jak ta z próbki, ale może być konieczne bardziej skomplikowane rzeczy, takie jak obliczanie IRR inwestycji klienta w system bankowy.
Kod poprawności . Jeśli twoje oprogramowanie jest poprawne, ale powolne, będziesz mieć szansę na optymalizację tam, gdzie potrzebujesz (po profilowaniu). Jeśli to oznacza zachowanie logiki biznesowej w bazie danych, niech tak będzie. Dlatego mamy techniki refaktoryzacji.
Jeśli stanie się powolny lub przestanie odpowiadać, być może będziesz musiał wykonać pewne optymalizacje, takie jak naruszenie zasady OSUSZANIA, co nie jest grzechem, jeśli otoczysz się właściwym testowaniem jednostkowym i testowaniem spójności.
źródło
Mówisz, że przykład jest sztuczny, więc nie wiem, czy to, co mówię, pasuje do twojej aktualnej sytuacji, ale moja odpowiedź brzmi - użyj warstwy ORM (Object-relational mapping) do zdefiniowania struktury i zapytania / manipulacji twoja baza danych. W ten sposób nie masz zduplikowanej logiki, ponieważ wszystko zostanie zdefiniowane w modelach.
Na przykład, używając frameworka Django (python), zdefiniowałbyś klasę domeny prostokąta jako następujący model :
Aby obliczyć całkowity obszar (bez filtrowania), należy zdefiniować:
Jak wspomnieli inni, powinieneś najpierw kodować poprawność, a optymalizować tylko wtedy, gdy naprawdę napotkasz wąskie gardło. Więc jeśli później zdecydujesz, absolutnie musisz zoptymalizować, możesz przejść do definiowania surowego zapytania, takiego jak:
źródło
Napisałem głupi przykład, aby wyjaśnić pewien pomysł:
Jeśli masz logikę:
Możesz go ponownie użyć w klasach domen:
Lub w warstwie generacji sql:
I oczywiście możesz to łatwo zmienić. Spróbuj tego:
źródło
Jak powiedział @Machado, najprostszym sposobem na to jest uniknięcie tego i wykonanie całego przetwarzania w głównej Javie. Jednak nadal możliwe jest kodowanie kodu bazowego za pomocą podobnego kodu bez powtarzania się przez wygenerowanie kodu dla obu baz kodu.
Na przykład za pomocą zębatki enable można wygenerować trzy fragmenty ze wspólnej definicji
fragment 1:
fragment 2:
fragment 3:
z jednego pliku referencyjnego
źródło