003
19.07.2018, 09:40 Uhr
ao
(Operator)
|
Ich meine das so:
C++: |
#include <iostream> using namespace std;
class BankAccount{ private: float balance;
bool setBalance(float xbalance){ if(xbalance<=-1000){ //balance = xbalance; return false; } else{ balance = xbalance; return true; } }
public: float getBalance(){ return balance; }
BankAccount(float startguthaben) : balance (startguthaben) {} enum ETransactionStatus { TransactionOk , TransactionCreditLine , TransactionInvalidData };
ETransactionStatus einzahlen(float betrag) { if (betrag < 0) return TransactionInvalidData; setBalance( balance + betrag ); return TransactionOk; } ETransactionStatus auszahlen(float betrag) { if (betrag < 0) return TransactionInvalidData; bool result = setBalance( balance - betrag ); return result ? TransactionOk : TransactionCreditLine; } };
//------------------------------------------------------------------------------------------- int main(){ int x; BankAccount konto (100); cout << "Kontostand: " << konto.getBalance() << endl; cout << "Einzahlen(1) Auszahlen(2): "; cin >> x; switch(x){ case 1: { cout << "Wie viel Geld moechten sie einzahlen?" << endl; int betrag; cin >> betrag; BankAccount::ETransactionStatus status = konto.einzahlen (betrag); if (status != BankAccount::TransactionOk) { cout << "Fehler: " << status << endl; } } break; case 2: { cout << "Wie viel Geld moechten sie abheben?" << endl; int betrag; cin >> betrag; BankAccount::ETransactionStatus status = konto.auszahlen (betrag); if (status != BankAccount::TransactionOk) { cout << "Fehler: " << status << endl; } } break; } cout << "Kontostand: " << konto.getBalance() << endl; return 0; }
|
Erklärungen:
1. Die Klasse BankAccount verwaltet NUR das Konto. User-Interaktion (cin/cout oder grafisch) gehört nicht zu ihren Aufgaben. Das geschieht woanders.
2. setBalance schlägt fehl, wenn durch die Transaktion der Dispo überschritten würde. Die Transaktion wird dann NICHT ausgeführt, der Kontostand ändert sich nicht.
3. setBalance ist keine public-Funktion, weil das nicht gebraucht wird. Die Public-Funktionen zum Verändern des Kontostandes sind einzahlen() und auszahlen(). Beide haben ein Argument (betrag) und geben einen Status zurück, der anzeigt, ob die Transaktion erfolgreich war.
4. Als private Helper-Methode ist setBalance aber sinnvoll, weil es mehrere Transaktionen gibt (Einzahlen und Auszahlen), die setBalance benutzen. Die erforderliche Logik muss so nur einmal programmiert werden.
5. Negative Beträge sind ungültig (Status "TransactionInvalidData").
6. Einzahlen positiver Beträge geht immer.
7. Beim Auszahlen wird die Rückgabe von setBalance geprüft, weil hierbei der Dispo überschritten werden könnte (Status "TransactionCreditLine").
8. Der Rückgabewert ist ein enum-Typ, weil so den einzelnen Fehlercodes sprechende Namen gegeben werden können.
9. Ich habe den parameterlosen Konstruktor BankAccount () entfernt. Den braucht man nicht wirklich, und jede Überladung, die man hinschreibt, ist eine mehr, die man testen muss.
10. In der main() finden alle Benutzer-Ein- und Ausgaben statt. Aus ihnen werden die erforderlichen Daten gebildet (cin >> betrag), mit denen die Public-Methoden des Kontos aufgerufen werden. Vorteil: Wenn das Programm mit einer grafischen Oberfläche neu geschrieben werden soll (*), kann die Klasse BankAccount ohne Änderungen übernommen werden. Die Beträge werden dann eben in einem Fenster oder Dialog erfasst.
(*) In Übungsaufgaben für die Uni ist das unwahrscheinlich. Im echten Leben ist solche oder ähnliche Wiederverwendung aber die Regel. Deshalb ist es wichtig, klar zu definieren, was Objekte tun und was sie nicht tun.
11. Anstelle von "Fehler: " und der Nummer könnten noch aussagekräftigere Meldungen generiert und ausgegeben werden.
Zitat: |
aber getter und setter methoden sind dafür dass man trotz private status auf den Inhalt zugreifen kann
|
Das stimmt, aber nicht jedes Member braucht einen Getter UND Setter. Am BankAccount ist der öffentliche Getter sinnvoll, der Setter aber nicht. Der Zugriff wird anders geregelt, über Methoden wie einzahlen() und auszahlen() für Barbeträge, ueberweisen() für bargeldlose Transaktionen usw. Man kann das noch beliebig ausbauen, aber dass jemand an ein Bankterminal gehen und einfach setBalance() machen kann, das will man nicht. Dieser Post wurde am 19.07.2018 um 10:26 Uhr von ao editiert. |