Zbyt duża klasa kontrolera.

Odpowiedz Nowy wątek
2014-12-11 20:06
0

Piszę, ale zdaję sobie sprawę, że zostanę zaraz wyśmiany za taki kod w aplikacji banku.;d Mam taki kontroler:

    @RequestMapping(value = "/admin/personalAccountTransfer", method = RequestMethod.POST)
    public ModelAndView personalAccountTransfer(
            @RequestParam("title") String title,
            @RequestParam("accountNr") String accountNr,
            @RequestParam("amount") float amount, @RequestParam("id") int id) {
 
        ModelAndView mav = new ModelAndView("admin/managepersonalaccount");
        UserAccount userAccountFrom = userAccountService.findUserAccount(id);
        UserAccount userAccountTo;
 
        if ((userAccountFrom.getBalance() + userAccountFrom.getNormalAccount()
                .getDebit()) < (amount + userAccountFrom.getNormalAccount()
                .getTransferFee())) {
            mav.addObject("errorTransfer",
                    "Kwota jaką chcesz przelać przekracza dostępne środki");
        } else {
            if ((userAccountTo = userAccountService
                    .findUserAccountByNumber(accountNr)) != null) {
 
                userAccountFrom.setBalance(userAccountFrom.getBalance()
                        - amount
                        - userAccountFrom.getNormalAccount().getTransferFee());
                userAccountTo.setBalance(userAccountTo.getBalance() + amount);
                userAccountService.updateUserAccount(userAccountFrom);
                userAccountService.updateUserAccount(userAccountTo);
                Transfer transfer = new Transfer();
                transfer.setTitle(title);
                transfer.setData(new Date());
                transfer.setAmount(amount);
                transfer.setUserAccountFrom(userAccountFrom);
                transfer.setUserAccountTo(userAccountTo);
                transferService.createTransfer(transfer);
                mav.addObject("infoTransfer", "Pieniądze zostały przelane");
            } else {
                mav.addObject("errorTransfer",
                        "Nie można dokonać przelewu na podany numer konta");
            }
        }
 
        EntityConverter converter = new EntityConverter();
        UserAccountDto userAccountDto = converter
                .prepareUserAccountDto(userAccountFrom);
        mav.addObject("userAccount", userAccountDto);
        return mav;
    } 

Dotąd te kontrolery jako tako wyglądały, ale jak doszedłem do momentu pisania kontrolera dla przelewu to mi się ten kontroler rozrósł do takich rozmiarów. Nawet już nie o te rozmiary mi chodzi, ale o to co on robi. Prosiłbym kogoś bardziej ogarniętego o poradę i poprawienie mnie w moich przemyśleniach. Mianowicie wydaje mi się, że kontrolery powinny służyć tylko do pośredniczenia między logiką a widokiem i nie powinny wykonywać jakichś skomplikowanych operacji. U mnie jak widać np wykonują jakieś sprawdzenia np.

        if ((userAccountFrom.getBalance() + userAccountFrom.getNormalAccount()
                .getDebit()) < (amount + userAccountFrom.getNormalAccount()
                .getTransferFee())) { 

sprawdza kwota do przelewu nie przekracza dostępnych środków. Czy przenieść to np. do serwisu UserAccount i tam to sprawdzać a do kontrolera zwracać jedynie wynik i ewentualny komunikat o błędzie. Tak na marginesie czy taki długie gety nie lepiej wcześniej zastępować:

userAccountFrom.getNormalAccount().getTransferFee() 

na Float transferFee = userAccountFrom.getNormalAccount().getTransferFee()


Potem mam to:

```java
            if ((userAccountTo = userAccountService
                    .findUserAccountByNumber(accountNr)) != null) {

                userAccountFrom.setBalance(userAccountFrom.getBalance()
                        - amount
                        - userAccountFrom.getNormalAccount().getTransferFee());
                userAccountTo.setBalance(userAccountTo.getBalance() + amount);
                userAccountService.updateUserAccount(userAccountFrom);
                userAccountService.updateUserAccount(userAccountTo);
                Transfer transfer = new Transfer();
                transfer.setTitle(title);
                transfer.setData(new Date());
                transfer.setAmount(amount);
                transfer.setUserAccountFrom(userAccountFrom);
                transfer.setUserAccountTo(userAccountTo);
                transferService.createTransfer(transfer);
                mav.addObject("infoTransfer", "Pieniądze zostały przelane"); 

Sprawdza czy podane konto istniej jeśli tak to potem dokonujemy ustawień np. ile odliczyć od konta z którego przelewamy i ile doliczyć do konta na, które przelewamy. Następnie znowu tworzę klasę Transfer, która zapisuje logi o transakcji i znowu w niej pełno ustawień, ale muszę to wszystko ustawić. Czy to też lepiej przenieść do serwisu i do kontrolera zwracać tylko ewentualny komunikat o błędzie?

Druga sprawa dotycząc aplikacji. Jako, że jest to bank to czy da się zrobić coś takiego, że np aplikacja przy starcie wykrywa, że mamy nowy miesiąc i np. dolicza na wszystkie konta odsetki oraz opłaty za miesięczne prowadzenie konta? Nie wiem jak by można zrealizować to w takie aplikacji, która nie jest taką z prawdziwego banku działającą non stop. Na razie to robię w ten sposób, że gdy chcę przejść do danego konta to przed wyświetleniem informacji o nim dokonuję sprawdzenia czy trzeba coś odliczyć itp, ale to chyba nie jest najlepsze rozwiązanie.

edytowany 5x, ostatnio: olek1, 2014-12-11 20:09

Pozostało 580 znaków

2014-12-11 20:26
3

A gdzie masz warstwę service ? Wszystko to co masz w kontrolerze powinno być w warstwie serwisowej, a kontroler powinien służyć za wywołanie metody serwisowej, i zwrócenie widoku lub ew. danych w postaci JSON czy XML


Hate the sin, love the sinner
edytowany 1x, ostatnio: NoZi, 2014-12-11 20:30

Pozostało 580 znaków

2014-12-11 20:30
  1. Nie dziwota że ci tak urósł kontroler skoro zgubiłeś gdzieś warstwę serwisów / logiki biznesowej. Kontroler zajmuje się TYLKO przygotowanie parametrów dla widoku / odebraniem parametrów z formularza. NICZYM WIĘCEJ. Kontroler w szczególności nie wie NIC na temat logiki samej aplikacji. A u ciebie kontroler sprawdza jakis stan konta...
  2. Scheduler, triggery w bazie danych etc. Ale to zwykle wymaga żeby jednak coś "chodziło cały czas".

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 3x, ostatnio: Shalom, 2014-12-11 20:31

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0