Zbyt duża klasa kontrolera.

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.

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

1
  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".

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