Εργαλεία Javascript σε δράση
Ανακαλύψτε μερικά εργαλεία ανάκτησης JavaScript για να βελτιώσετε το παιχνίδι προγραμματισμού σας. Μάθετε περισσότερα για το ESLint, το Prettier και το Husky!

Διαβάστε το άρθρο μας για να ανακαλύψετε τη δύναμη του λειτουργικού προγραμματισμού στο JavaScript. Ο λειτουργικός προγραμματισμός ταξινομείται ως δηλωτικό παράδειγμα όπου η περιγραφή του προγράμματος διαχωρίζεται από τους υπολογισμούς.
"Με απλά λόγια, ο λειτουργικός προγραμματισμός είναι μια ανάπτυξη λογισμικού στυλ που δίνει μεγάλη έμφαση στη χρήση των λειτουργιών"
Αποσπάσματα από το βιβλίο: Luis Atencio "Λειτουργικός Προγραμματισμός σε JavaScript. Πώς να βελτιώσετε το JavaScript προγράμματα με χρήση λειτουργικών τεχνικών"
Λειτουργικός προγραμματισμός ταξινομείται ως δηλωτικό παράδειγμα όπου η περιγραφή του προγράμματος διαχωρίζεται από τους υπολογισμούς. Η έμφαση εδώ δίνεται στη χρήση εκφράσεων για την περιγραφή της λογικής του προγράμματος. Αυτό είναι το αντίθετο του προστακτική προγραμματισμού, όπου η κωδικός εκτελείται βήμα προς βήμα και λέει λεπτομερώς στον υπολογιστή πώς να κάνει τη δουλειά.
Σκεφτείτε μια περίπτωση όπου έχουμε έναν πίνακα ακεραίων αριθμών και πρέπει να αυξήσουμε κάθε έναν από αυτούς στη δεύτερη δύναμη και στη συνέχεια να επιλέξουμε μόνο εκείνες τις τιμές που δεν είναι ζυγοί.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9],
const results = []
for(let i = 0; i < numbers.length; i++) {
const secondPower = Math.pow(numbers[i], 2)
if(secondPower & 1) { // ή % 2 αλλά οι πράξεις σε bits είναι ταχύτερες
results.push(secondPower),
}
}
console.log(results) // [1, 9, 25, 49, 81]
Όσον αφορά το προστακτική λύση, η εστίαση στις λεπτομέρειες εφαρμογής είναι σαφώς ορατή. Στο βρόχο, μπορείτε να δείτε το δείκτη του πίνακα με βάση την ανάγκη ελέγχου του αριθμού των στοιχείων. Λόγω του μεγάλου αριθμού λεπτομερειών στον κώδικα, είναι πιο δύσκολο να εστιάσετε σε αυτό που κάνει. Ας εστιάσουμε τώρα στο δηλωτικό λύση.
const risesToSecondPower = (num) => Math.pow(num, 2)
const isOdd = (num) => num & 1,
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
const results = numbers
.map(risesToSecondPower)
.filter(isOdd),
console.log(results) // [1, 9, 25, 49, 81]
Σε αυτή τη λύση, η υλοποίηση έχει διαχωριστεί από την κλήση, μεταφέροντας τη λογική σε ξεχωριστές συναρτήσεις. Χάρη σε αυτή τη λύση, μπορούμε να επικεντρωθούμε μόνο στα ονόματα των συναρτήσεων που περιγράφουν τι συμβαίνει σε αυτές. Επιπλέον, το επίπεδο αφαίρεσης έχει αυξηθεί και η λογική μπορεί πλέον να είναι επαναχρησιμοποιήσιμη. Τώρα, ας επικεντρωθούμε στην κλήση. Δεν μπορείτε να δείτε λεπτομέρειες σε αυτήν, μόνο μια περιγραφή που σας λέει τι κάνει αυτός ο κώδικας, βήμα προς βήμα:
map(risesToSecondPower)
- παίρνει κάθε στοιχείο ενός πίνακα και το αυξάνει στη δεύτερη δύναμη,filter(isOdd)
- φίλτρο και επιλέξτε περιττά στοιχεία.Λειτουργικός προγραμματισμός έχει πολλά οφέλη. Όταν πρόκειται για JavaScript, η χρήση συναρτήσεων είναι φυσική επειδή πρόκειται για μια λειτουργική γλώσσα. Ακόμη και οι κλάσεις σε αυτή τη γλώσσα είναι "συντακτική ζάχαρη" και αποτελούνται από συναρτήσεις.
Όσον αφορά την αναγνωσιμότητα, στην προστακτική προσέγγιση, ο κώδικας συνήθως μετατρέπεται σε μια λίστα με ονόματα συναρτήσεων που μπορούν να διαβαστούν διαδοχικά χωρίς να εμβαθύνουν στη λογική τους. Ως αποτέλεσμα, δεν εστιάζουμε στις λεπτομέρειες της υλοποίησης.
Ένα άλλο πλεονέκτημα είναι η τήρηση της σύμβασης των αμετάβλητων αντικειμένων. Χάρη σε αυτή την προσέγγιση, ο κώδικας γίνεται ασφαλέστερος επειδή οι αναφορές στα JavaScript είναι πολύ ισχυρά και είναι εύκολο να τροποποιήσετε το ανεπιθύμητο αντικείμενο.
Στον λειτουργικό προγραμματισμό, ο κώδικας αναλύεται σε μικρές συναρτήσεις που μπορούν εύκολα να θεωρηθούν ως επαναχρησιμοποιήσιμος αφηρημένος κώδικας.
Ένα από τα σημαντικά ζητήματα του λειτουργικού προγραμματισμού είναι οι καθαρές συναρτήσεις. Για να δημιουργήσετε μια τέτοια συνάρτηση, πρέπει να θυμάστε μερικούς κανόνες:
// Inpure function
let counter = 5
...
const multipleCounter = (πολλαπλασιαστής) => {
counter = counter * multiplier
}
multiplyCounter(2) // -> ? το αποτέλεσμα εξαρτάται από την αρχική τιμή
// Καθαρή λειτουργία
const multiplyBy = (πολλαπλασιαστής) => (τιμή) => τιμή * πολλαπλασιαστής
const multipleByTwo = multiplyBy(2)
const counter = multiplyByTwo(5) // -> 10
Η πρώτη συνάρτηση είναι απρόβλεπτη επειδή εξαρτάται από μια εξωτερική παράμετρο που μπορεί να αλλάξει. Η δεύτερη συνάρτηση είναι διαφανής, εξαρτάται μόνο από τις παραμέτρους εισόδου, δεν τις τροποποιεί και δεν χρησιμοποιεί μεταβλητές εκτός εύρους. Είναι διαφανής επειδή εξαρτάται από παραμέτρους, δεν τις τροποποιεί, δεν χρησιμοποιεί μεταβλητές εκτός εύρους και επιστρέφει μια νέα τιμή.