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

Οι καθαρές συναρτήσεις είναι συναρτήσεις που δεν παράγουν παρενέργειες και, όταν καλούνται με τις ίδιες παραμέτρους εισόδου, θα επιστρέφουν πάντα την ίδια έξοδο.

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

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

Χαρακτηριστικά μιας καθαρής συνάρτησης

Για μια συνάρτηση για να είναι «καθαρό», πρέπει να ικανοποιεί μερικές απαιτήσεις.

Σταθερή Αξία Επιστροφών

Μια καθαρή συνάρτηση θα πρέπει πάντα να επιστρέφει την ίδια τιμή με την ίδια είσοδο, ανεξάρτητα από τον αριθμό των φορών που καλείται.

instagram viewer

Για παράδειγμα, εξετάστε την παρακάτω συνάρτηση:

λειτουργίαπολλαπλασιάζω(α, β) {
ΕΠΙΣΤΡΟΦΗ a * b;
}

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

Η κλήση αυτής της συνάρτησης πολλές φορές με τα ίδια ορίσματα θα έχει την ίδια έξοδο κάθε φορά. Για παράδειγμα:

πολλαπλασιάζω(2, 3); // επιστρέφει 6
πολλαπλασιάζω(2, 3); // επιστρέφει 6
πολλαπλασιάζω(2, 3); // επιστρέφει 6

Εναλλακτικά, εξετάστε το παρακάτω παράδειγμα:

λειτουργίαmultiplyRandomNumber(αρ) {
ΕΠΙΣΤΡΟΦΗ αριθμός * Μαθηματικά.πάτωμα(Μαθηματικά.random() * 10);
}

multiplyRandomNumber(5); // Απρόβλεπτα αποτελέσματα
multiplyRandomNumber(5); // Απρόβλεπτα αποτελέσματα
multiplyRandomNumber(5); // Απρόβλεπτα αποτελέσματα

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

Χωρίς παρενέργειες

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

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

Για παράδειγμα, εξετάστε το παρακάτω παράδειγμα:

αφήνω καταμέτρηση = 0;

λειτουργίααύξηση() {
count++;
κονσόλα.log (count);
}

αύξηση(); // Αρχεία καταγραφής 1
αύξηση(); // Αρχεία καταγραφής 2
αύξηση(); // Αρχεία καταγραφής 3

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

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

Όπως έτσι:

λειτουργίααύξηση(μετρώ) {
ΕΠΙΣΤΡΟΦΗ μετρώ + 1;
}

αύξηση(1); // επιστρέφει 2
αύξηση(1); // επιστρέφει 2
αύξηση(1); // επιστρέφει 2

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

Άλλα Χαρακτηριστικά

Εκτός από το ότι έχετε σταθερή τιμή επιστροφής και δεν προκαλείτε παρενέργειες, θα πρέπει να τηρείτε τους ακόλουθους κανόνες όταν είστε δημιουργία μιας συνάρτησης JavaScript ότι θέλεις να είσαι αγνός:

  • Η συνάρτησή σας δεν πρέπει να τροποποιήσει κανένα από τα ορίσματά της. Αντίθετα, εάν οποιαδήποτε λειτουργία απαιτεί μετάλλαξη, δημιουργήστε ένα αντίγραφο του ορίσματος και μεταλλάξτε το αντίγραφο.
  • Η συνάρτησή σας πρέπει να έχει πάντα μια τιμή επιστροφής. Εάν η συνάρτησή σας δεν έχει επιστρεφόμενη τιμή ή παρενέργειες, δεν μπορεί να κάνει τίποτα!
  • Η λειτουργία σας δεν πρέπει να εξαρτάται από καμία εξωτερική κατάσταση.

Πλεονεκτήματα των Pure Functions

Οι καθαρές συναρτήσεις έχουν ορισμένα πλεονεκτήματα έναντι των ακάθαρτων συναρτήσεων, μερικά από τα οποία περιλαμβάνουν τα ακόλουθα.

Δοκιμαστικότητα

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

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

Απομνημόνευση

Επειδή οι καθαρές λειτουργίες παράγουν πάντα την ίδια έξοδο για την ίδια είσοδο και δεν παράγουν παρενέργειες, μπορείτε εύκολα να τις απομνημονεύσετε.

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

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

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

Συγχρονισμός

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

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

Pure Functions vs. Μη καθαρές συναρτήσεις

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

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

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