Ύστερα από χρόνια συμπλήρωσης εντύπων και αναμονής, απέκτησες επιτέλους την τραπεζική σου άδεια. Αυτό σημαίνει ότι πλέον δικαιούσαι επίσημα να ανοίξεις τη δική σου τράπεζα, ζήτω!
Η πρώτη σου προτεραιότητα είναι να στήσεις και να θέσεις σε λειτουργία τα συστήματα πληροφορικής. Ύστερα από μια μέρα σκληρής δουλειάς, μπορείς ήδη να ανοίγεις και να κλείνεις λογαριασμούς, καθώς και να χειρίζεσαι αναλήψεις και καταθέσεις.
Επειδή βαριόσουν να γράψεις tests, καλείς κάποιους φίλους να σε βοηθήσουν να δοκιμάσετε το σύστημα. Ωστόσο, μόλις πέντε λεπτά αργότερα, ένας από τους φίλους σου ισχυρίζεται ότι έχασε χρήματα! Αν και είσαι σίγουρος ότι ο κώδικάς σου δεν έχει bugs, αρχίζεις να ψάχνεις τα αρχεία καταγραφής για να το ερευνήσεις.
Α, ναι, όπως ακριβώς υποψιαζόσουν, ο φίλος σου φταίει! Μοιράστηκε τα διαπιστευτήρια δοκιμής του με έναν άλλο φίλο, και μαζί συνωμότησαν να κάνουν καταθέσεις και αναλήψεις από τον ίδιο λογαριασμό παράλληλα. Ποιος θα έκανε κάτι τέτοιο;
Ενώ εσύ επιμένεις ότι είναι σωματικά αδύνατο να έχει κάποιος πρόσβαση στον λογαριασμό του παράλληλα, ο φίλος σου σε ενημερώνει με αυτάρεσκο ύφος ότι οι τραπεζικοί κανονισμοί απαιτούν να το υποστηρίζεις. Έτσι, χωρίς υποστήριξη παράλληλης τραπεζικής λειτουργίας, δεν δίνεται το σήμα για να ξεκινήσεις. Αναστενάζοντας, σημειώνεις νοερά να ασχοληθείς με αυτό αύριο. Αυτό θα καθυστερήσει την ημερομηνία κυκλοφορίας σου κατά τουλάχιστον μία ακόμη μέρα, αλλά τι να κάνουμε...
Ο στόχος σου είναι να υλοποιήσεις τραπεζικούς λογαριασμούς που υποστηρίζουν άνοιγμα/κλείσιμο, αναλήψεις και καταθέσεις χρημάτων.
Καθώς οι τραπεζικοί λογαριασμοί είναι προσβάσιμοι με πολλούς διαφορετικούς τρόπους (διαδίκτυο, κινητά τηλέφωνα, αυτόματες χρεώσεις), το τραπεζικό σου λογισμικό πρέπει να επιτρέπει την ασφαλή πρόσβαση στους λογαριασμούς από πολλά νήματα/διεργασίες (η ορολογία εξαρτάται από τη γλώσσα προγραμματισμού σου) παράλληλα. Για παράδειγμα, μπορεί να συμβαίνουν πολλές καταθέσεις και αναλήψεις παράλληλα· πρέπει να διασφαλίσεις ότι δεν υπάρχουν συνθήκες ανταγωνισμού ανάμεσα στη στιγμή που διαβάζεις το υπόλοιπο του λογαριασμού και στη στιγμή που ορίζεις το νέο υπόλοιπο.
Θα πρέπει να είναι δυνατό να κλείσεις έναν λογαριασμό· οι πράξεις σε έναν κλειστό λογαριασμό πρέπει να αποτυγχάνουν.
Για να ολοκληρώσεις αυτή την άσκηση, πρέπει να υλοποιήσεις τις παρακάτω συναρτήσεις:
openAccount - Καλείται στην αρχή κάθε test. Επιστρέφει ένα BankAccount.closeAccount - Καλείται στο τέλος κάθε test.getBalance - Πάρε το υπόλοιπο του τραπεζικού λογαριασμού.updateBalance - Αύξησε το υπόλοιπο του τραπεζικού λογαριασμού κατά το δοσμένο ποσό.Το ποσό μπορεί να είναι αρνητικό για ανάληψη.
Το αρχικό υπόλοιπο του τραπεζικού λογαριασμού πρέπει να είναι 0.
Θα βρεις μια δήλωση δεδομένων dummy και τις υπογραφές τύπων ήδη στη θέση τους, αλλά εξαρτάται από εσένα να ορίσεις τις συναρτήσεις και να δημιουργήσεις έναν ουσιαστικό τύπο δεδομένων, newtype ή συνώνυμο τύπου.
Αν χρειάζεσαι βοήθεια, ορίστε μερικοί επιπλέον πόροι:
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Haskell με 107 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.