Διαδρομές
/
Python
Python
/
Ασκήσεις
/
Τραπεζικός Λογαριασμός
Τραπεζικός Λογαριασμός

Τραπεζικός Λογαριασμός

Μέτριο

Εισαγωγή

Ύστερα από χρόνια συμπλήρωσης εντύπων και αναμονής, απέκτησες επιτέλους την τραπεζική σου άδεια. Αυτό σημαίνει ότι πλέον δικαιούσαι επίσημα να ανοίξεις τη δική σου τράπεζα, ζήτω!

Η πρώτη σου προτεραιότητα είναι να στήσεις και να θέσεις σε λειτουργία τα συστήματα πληροφορικής. Ύστερα από μια μέρα σκληρής δουλειάς, μπορείς ήδη να ανοίγεις και να κλείνεις λογαριασμούς, καθώς και να χειρίζεσαι αναλήψεις και καταθέσεις.

Επειδή βαριόσουν να γράψεις tests, καλείς κάποιους φίλους να σε βοηθήσουν να δοκιμάσετε το σύστημα. Ωστόσο, μόλις πέντε λεπτά αργότερα, ένας από τους φίλους σου ισχυρίζεται ότι έχασε χρήματα! Αν και είσαι σίγουρος ότι ο κώδικάς σου δεν έχει bugs, αρχίζεις να ψάχνεις τα αρχεία καταγραφής για να το ερευνήσεις.

Α, ναι, όπως ακριβώς υποψιαζόσουν, ο φίλος σου φταίει! Μοιράστηκε τα διαπιστευτήρια δοκιμής του με έναν άλλο φίλο, και μαζί συνωμότησαν να κάνουν καταθέσεις και αναλήψεις από τον ίδιο λογαριασμό παράλληλα. Ποιος θα έκανε κάτι τέτοιο;

Ενώ εσύ επιμένεις ότι είναι σωματικά αδύνατο να έχει κάποιος πρόσβαση στον λογαριασμό του παράλληλα, ο φίλος σου σε ενημερώνει με αυτάρεσκο ύφος ότι οι τραπεζικοί κανονισμοί απαιτούν να το υποστηρίζεις. Έτσι, χωρίς υποστήριξη παράλληλης τραπεζικής λειτουργίας, δεν δίνεται το σήμα για να ξεκινήσεις. Αναστενάζοντας, σημειώνεις νοερά να ασχοληθείς με αυτό αύριο. Αυτό θα καθυστερήσει την ημερομηνία κυκλοφορίας σου κατά τουλάχιστον μία ακόμη μέρα, αλλά τι να κάνουμε...

Οδηγίες

Ο στόχος σου είναι να υλοποιήσεις τραπεζικούς λογαριασμούς που υποστηρίζουν άνοιγμα/κλείσιμο, αναλήψεις και καταθέσεις χρημάτων.

Καθώς οι τραπεζικοί λογαριασμοί είναι προσβάσιμοι με πολλούς διαφορετικούς τρόπους (διαδίκτυο, κινητά τηλέφωνα, αυτόματες χρεώσεις), το τραπεζικό σου λογισμικό πρέπει να επιτρέπει την ασφαλή πρόσβαση στους λογαριασμούς από πολλά νήματα/διεργασίες (η ορολογία εξαρτάται από τη γλώσσα προγραμματισμού σου) παράλληλα. Για παράδειγμα, μπορεί να συμβαίνουν πολλές καταθέσεις και αναλήψεις παράλληλα· πρέπει να διασφαλίσεις ότι δεν υπάρχουν συνθήκες ανταγωνισμού ανάμεσα στη στιγμή που διαβάζεις το υπόλοιπο του λογαριασμού και στη στιγμή που ορίζεις το νέο υπόλοιπο.

Θα πρέπει να είναι δυνατό να κλείσεις έναν λογαριασμό· οι πράξεις σε έναν κλειστό λογαριασμό πρέπει να αποτυγχάνουν.

Note

Η Python δεν υποστηρίζει "πραγματικό" ταυτοχρονισμό λόγω του Global Interpreter Lock. Ενώ βρίσκονται σε εξέλιξη εργασίες για την υποστήριξη του free-threading στην Python, αυτό είναι ακόμα πειραματικό. Οι τρέχουσες λύσεις της τυπικής βιβλιοθήκης, όπως το multiprocessing και το threading, είναι δύσκολο να υλοποιηθούν με τα εργαλεία της τρέχουσας διαδρομής.

Ως αποτέλεσμα, η απαίτηση ταυτοχρονισμού έχει παραμεριστεί για αυτή την άσκηση. Οι λειτουργίες του λογαριασμού είναι διαδοχικές σε ένα μόνο νήμα και δεν εκτελούνται έλεγχοι ταυτοχρονισμού ή "race condition".

Αν θέλεις να πειραματιστείς με free-threading ή με ελέγχους ταυτοχρονισμού, σου ζητάμε να το κάνεις τοπικά. Για βοήθεια με τη λήψη και την τοπική εργασία σε ασκήσεις, προτείνουμε το Exercism CLI.


Μηνύματα εξαιρέσεων

Μερικές φορές είναι απαραίτητο να πετάξεις μια εξαίρεση. Όταν το κάνεις αυτό, θα πρέπει πάντα να συμπεριλαμβάνεις ένα ουσιαστικό μήνυμα σφάλματος για να δηλώνεις ποια είναι η πηγή του σφάλματος. Αυτό κάνει τον κώδικα σου πιο ευανάγνωστο και βοηθάει σημαντικά στην αποσφαλμάτωση. Σε περιπτώσεις όπου γνωρίζεις ότι η πηγή του σφάλματος θα είναι συγκεκριμένου τύπου, μπορείς να επιλέξεις να πετάξεις έναν από τους ενσωματωμένους τύπους σφάλματος, αλλά θα πρέπει και πάλι να συμπεριλάβεις ένα ουσιαστικό μήνυμα.

Αυτή η συγκεκριμένη άσκηση απαιτεί να χρησιμοποιήσεις την εντολή raise για να "πετάξεις" ένα ValueError όταν ένας λογαριασμός είναι ή δεν είναι ανοιχτός, ή όταν τα ποσά ανάληψης/κατάθεσης είναι λανθασμένα. Οι δοκιμές θα περάσουν μόνο αν και κάνεις raise στην exception και συμπεριλάβεις ένα μήνυμα μαζί της.

Για να πετάξεις ένα ValueError με μήνυμα, γράψε το μήνυμα ως όρισμα στον τύπο exception:

# 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')
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Python Exercism

Έτοιμος να ξεκινήσεις την άσκηση Τραπεζικός Λογαριασμός;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.