Nach Jahren des Formularausfüllens und Wartens hast du endlich deine Banklizenz erworben. Das heißt, du bist jetzt offiziell berechtigt, deine eigene Bank zu eröffnen, hurra!
Deine erste Priorität ist es, die IT-Systeme ans Laufen zu bringen. Nach einem Tag harter Arbeit kannst du bereits Konten eröffnen und schließen sowie Abhebungen und Einzahlungen bearbeiten.
Da du keine Lust hattest, Tests zu schreiben, bittest du ein paar Freunde, dir beim Testen des Systems zu helfen. Doch schon nach fünf Minuten behauptet einer deiner Freunde, Geld verloren zu haben! Du bist dir zwar sicher, dass dein Code fehlerfrei ist, doch du fängst an, die Logs zu durchsuchen, um der Sache nachzugehen.
Ah ja, genau wie du vermutet hast, ist dein Freund schuld! Einer deiner Freunde hat seine Test-Zugangsdaten mit einem anderen Freund geteilt, und gemeinsam haben sie sich verschworen, vom selben Konto parallel Einzahlungen und Abhebungen vorzunehmen. Wer würde so etwas tun?
Während du argumentierst, es sei physisch unmöglich, dass jemand parallel auf sein Konto zugreift, teilt dein Freund dir selbstgefällig mit, dass die Bankregeln verlangen, dass du das unterstützt. Also: keine parallele Unterstützung fürs Banking, keine Freigabe für den Livegang. Seufzend machst du dir eine mentale Notiz, dich morgen darum zu kümmern. Das verschiebt deinen Starttermin um mindestens einen weiteren Tag, aber nun ja...
Deine Aufgabe ist es, Bankkonten zu implementieren, die das Eröffnen und Schließen sowie Abhebungen und Einzahlungen von Geld unterstützen.
Da auf Bankkonten auf viele verschiedene Arten zugegriffen werden kann (Internet, Mobiltelefone, automatische Abbuchungen), muss deine Banksoftware es ermöglichen, dass mehrere Threads/Prozesse (die Terminologie hängt von deiner Programmiersprache ab) parallel und sicher auf Konten zugreifen. Zum Beispiel kann es viele Einzahlungen und Abhebungen geben, die parallel ablaufen; du musst sicherstellen, dass zwischen dem Lesen des Kontostands und dem Setzen des neuen Kontostands keine Race Conditions auftreten.
Es sollte möglich sein, ein Konto zu schließen; Operationen auf einem geschlossenen Konto müssen fehlschlagen.
Python unterstützt keine „echte" Nebenläufigkeit, weil es den Global Interpreter Lock gibt. Während an der Unterstützung für Free-Threading in Python gearbeitet wird, ist es noch experimentell. Die aktuellen Lösungen aus der Standardbibliothek wie multiprocessing und threading lassen sich mit dem aktuellen Tooling des Tracks nur schwer umsetzen.
Deshalb wurde die Anforderung an die Nebenläufigkeit für diese Übung zurückgestellt. Die Kontovorgänge laufen sequenziell in einem einzigen Thread ab, und es werden keine Tests für Nebenläufigkeit oder „Race Conditions" ausgeführt.
Wenn du mit Free-Threading oder Nebenläufigkeitstests experimentieren möchtest, bitten wir dich, das lokal zu tun. Hilfe beim Herunterladen und beim lokalen Arbeiten an Übungen findest du in der Exercism CLI.
Manchmal ist es notwendig, eine Ausnahme auszulösen. Dabei solltest du immer eine aussagekräftige Fehlermeldung angeben, die anzeigt, woher der Fehler stammt. Das macht deinen Code lesbarer und hilft beim Debuggen deutlich weiter. Wenn du weißt, dass die Fehlerquelle von einem bestimmten Typ ist, kannst du einen der eingebauten Fehlertypen auslösen. Eine aussagekräftige Meldung solltest du trotzdem mitgeben.
In dieser Übung musst du die raise-Anweisung verwenden, um einen ValueError zu „werfen", wenn ein Konto offen oder nicht offen ist oder die Beträge zum Abheben oder Einzahlen falsch sind. Die Tests bestehen nur, wenn du die exception mit raise auslöst und ihr eine Meldung mitgibst.
Um einen ValueError mit einer Meldung auszulösen, gibst du die Meldung als Argument an den exception-Typ an:
# account is not open
raise ValueError('account not open')
# account is already open
raise ValueError('account already open')
# incorrect withdrawal/deposit amount
raise ValueError('amount must be greater than 0')
# withdrawal is too big
raise ValueError('amount must be less than balance')
Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.