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.