Odniesienia do obiektów - Pomoc przy programie imitującym bank

0

Witam.
Mam do napisania pewien program, w zasadzie wiem jak to powinno działać jednak mam problem ze zrozumienie pewnego zapisu i proszę po małą pomoc lub nakierowanie mnie w zrozumieniu tego zapisu.

Poniżej przedstawiam treść zadania i pogrubiam ten zapis który nie jest dla mnie do końca jasny. Nie wiem czy to jest wywołanie obiektu w obiekcie czy coś w tym rodzaju.

Napisać program, który symuluje operacje na kontach bankowych.
Konta są obiektami klasy Account. Każde konto ma aktualny stan (balance) i można:
wplacać pieniądze (metoda deposit())
wypłacać pieniądze (metoda withdraw())
przelewać na inne konto (metoda transfer(...))
dodawać do stanu konta odsetki w skali rocznej (metoda addInterest()).
Stopa oprocentowania jest wspólna dla wszystkich kont i ustalana za pomocą metody setInterestRate(...).

Konta posiadają klienci banku (obiekty klasy BankCustomer). W roli klienta występuje osoba (obiekt klasy Person).

Dostarczyć takich definicji w/w klas, aby poniższy program:

public class BankingTest {

public static void main(String[] args) {

Person janP = new Person("Jan"),
alaP = new Person("Ala");

BankCustomer jan = new BankCustomer(janP);
BankCustomer ala = new BankCustomer(alaP);

**jan.getAccount().deposit(1000);**
**ala.getAccount().deposit(2000);**
**jan.getAccount().transfer(ala.getAccount(), 500);**
**ala.getAccount().withdraw(1000);**

System.out.println(jan);
System.out.println(ala);

Account.setInterestRate(4.5);
**jan.getAccount().addInterest();**
**ala.getAccount().addInterest();**

System.out.println(jan);
System.out.println(ala);
}
}

wyprowadził następującą informację:

Klient: Jan stan konta 500.0
Klient: Ala stan konta 1500.0
Klient: Jan stan konta 522.5
Klient: Ala stan konta 1567.5

1

jan.getAccount().deposit(1000);

obiekt jan zawiera obiekt Account, lub jakąś zmienną o tej nazwie, metoda getAccount() zwraca obiekt klasy Account (poczytaj o enkapsulacji), i na tym obiekcie jest przeprowadzana metoda deposit z argumentem 1000 (pewnie balans konta).

z withdraw podobna sytuacja, logicznie na to patrząc chodzi o wypłacenie z konta podanej ilości pieniędzy. Pozostałe możesz na tej samej zasadzie samodzielnie rozkminić.

1
jan.getAccount().deposit(1000);

to typowy zapis kolejnego wywoływania metod. Inaczej można to zapisać tak:

Konto k = jan.getAccount();
k.deposit(1000);
2

Konstrukcja typu jan.getAccount().deposit(1000); nie jest dobra z kilu powodów. Konto może mieć właściciela i nawet stwierdzenie klient.getAccount() ujdzie (choć jest zaprzeczeniem enkapsulacji) to już zrobienie czegoś takiego jw. nie jest OK.
Po pierwsze rzecz trywialna wiele kropek w jednej linii. Poleci NullPointer i nawet nie będziesz wiedzieć co dokładnie jest nullem.
Po drugie klient zleca operację bankowi, a nie sam przelewa pieniądze, czyli piszemy:

OperationDataBuilder.type(Operations.DEPOSIT)
    .from(client.getAccount())
    .to(targetAccount)
    .value(1000);

clerk.operation(client, operationData);  

I tak pierwszy parametr client służy do autoryzacji transakcji. Obiekt clerk sprawdzi czy dane z przelewu operationData pasują do klienta (czy klient korzysta z własnego konta, czy ma do tego prawo itp.) oraz czy są poprawne pod kątem biznesowym (konta istnieją i są aktywne, kwota >0, są środki itp.).

Po co tak? Po pierwsze by nie tworzyć programu, który ma naturę proceduralną z użyciem obiektów, a program bardziej obiektowy oparty o zasadę współpracy obiektów - swoją drogą majstersztykiem zadania jest jan.getAccount().transfer(ala.getAccount(), 500); oznaczające, że to klient transferuje środki na inne konto. Bank nie jest potrzebny!
Po drugie kod będzie ci łatwiej przetestować.
Po trzecie, znając świat, ludzi i wykładowców/kursy to za niedługo program będzie trzeba wzbogacić o obsługę wątków. Wtedy będzie to prostsze.

0

Dziękuje wszystkim za pomoc, dzięki temu zrozumiałem o co chodzi i o tyle co wiedziałem doskonale o enkapsulacji, o tyle nie wiedziałem że można używać jest też w taki sposób. Co do samej treści klasy test to jest to część polecenia i program który mam do napisania musi dać dokładnie taki wynik jak podany. Dziękuje jeszcze raz za pomoc.
Pozdrawiam.

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