Δομές ελέγχου ροής
Στα προηγούμενα κεφάλαια, μάθαμε πώς να αποθηκεύουμε τιμές σε μεταβλητές με expressions και πώς να εκτελούμε απλές διεργασίες με statements. Όμως, η πραγματική δύναμη του προγραμματισμού βρίσκεται στη δυνατότητα να καθορίζουμε την ροή του προγράμματός μας και να επαναλαμβάνουμε ενέργειες βάσει των συνθηκών που εξυπηρετούν τις ανάγκες μας.
Ένα παράδειγμα
Ας φανταστούμε για ένα λεπτό ότι φτιάχνουμε μια απλή εφαρμογή για ένα μικρό κατάστημα που πουλάει φρούτα. Το ζητούμενο είναι να υπολογίσουμε το συνολικό κόστος των αγορών ενός πελάτη και να του κάνουμε μια μικρή έκπτωση αν το ποσό των αγορών του ξεπερνάει ένα συγκεκριμένο όριο.
Αν βασιζόμασταν μόνο σε expressions και statements όπως στα προηγούμενα κεφάλαια–δηλαδή δεν χρησιμοποιούσαμε δομές ελέγχου ή επανάληψης,–τότε θα έπρεπε να γράψουμε κάτι σαν κι αυτό:
// κόστος φρούτων σε €
const applePrice = 1.5;
const bananaPrice = 1.2;
const orangePrice = 0.8;
// ποσότητες φρούτων στο καλάθι του πελάτη
const numApples = 3;
const numOranges = 2;
const numBananas = 4;
// συνολικό κόστος ανα φρούτο
const totalCostApples = applePrice * numApples;
const totalCostOranges = orangePrice * numOranges;
const totalCostBananas = bananaPrice * numBananas;
// συνολικό κόστος αγοράς
const subtotal = totalCostApples + totalCostOranges + totalCostBananas;
// Εδώ τελειώνουμε και όπως είναι εμφανές, δεν μπορούμε να χειριστούμε
// εύκολα εκπτώσεις ή διαφορετικές ποσότητες, που είναι και το ζητούμενο.
console.log(`Το υποσύνολο είναι: ${subtotal}€`);
Σε αυτό το σενάριο, αν ένας πελάτης ήθελε να αγοράσει διαφορετικά φρούτα ή αν χρειαζόταν να αλλάξουμε τις τιμές, θα έπρεπε να τροποποιήσουμε χειροκίνητα κάθε γραμμή κώδικα για κάθε πελάτη ή για κάθε ανατίμηση προϊόντων. Αν το κατάστημα είχε δέκα πελάτες την ημέρα, αυτή η διαδικασία θα έπρεπε να γίνει δέκα φορές. Ας φανταστούμε τι θα γινόταν αν είχε εκατό ή χίλιους πελάτες! Θα μιλούσαμε για μια διαδικασία ασύμφορη και επιρρεπή σε λάθη.
Σε αυτό ακριβώς το σημείο έρχονται να μας βοηθήσουν οι δομές ελέγχου ροής ή όπως ονομάζονται στα αγγλικά: control flow statements.
Τί είναι τα control flow statements;
Οι δομές ελέγχου ροής (control flow statements) αποτελούν δομικά στοιχεία του προγραμματισμού, τα οποία μας δίνουν τη δυνατότητα να καθορίζουμε τη σειρά εκτέλεσης των statements ενός προγράμματος. Μας επιτρέπουν, για παράδειγμα, να εκτελέσουμε ένα συγκεκριμένο τμήμα κώδικα (ένα block) επαναληπτικά, να “τρέξουμε” ένα τμήμα κώδικα μόνο εάν ισχύει μια συγκεκριμένη συνθήκη, ή ακόμα και να παρακάμψουμε ή να τερματίσουμε την εκτέλεση ορισμένων διεργασιών.
Στη συνέχεια αυτού του κεφαλαίου, καθώς και στα επόμενα κεφάλαια, θα εξερευνήσουμε τα statements που μας επιτρέπουν να ελέγχουμε τη ροή εκτέλεσης του προγράμματός μας. Πριν όμως προχωρήσουμε σε αυτό θα πρέπει να κατανοήσουμε μια ακόμη θεμελειώδη έννοια: το block statement.
Τι είναι τα block statements;
Τί είναι, λοιπόν, τα block statements ή αλλιώς blocks κώδικα ή απλώς blocks;
Ένα block statement στην JavaScript είναι απλά μια ομάδα από ένα ή περισσότερα expression και statements που περικλείονται από άγκιστρα {}
. Τα blocks χρησιμοποιούνται για να ομαδοποιήσουν διεργασίες που θέλουμε να εκτελεστούν μαζί, συχνά ως μέρος μιας μεγαλύτερης διεργασίας, όπως μια δομή ελέγχου ροής if...else
ή ενός βρόχου επανάληψης.
Στο παρακάτω παράδειγμα, τα δύο statements (η δήλωση της μεταβλητής message
και η εκτέλεση console.log
) βρίσκονται στο ίδιο block.
{
const message = "Γεια σου από ένα block!";
console.log(message);
}
Μια σημαντική ιδιότητα των blocks στην JavaScript είναι ότι μπορούν να δημιουργήσουν ένα νέο scope (εμβέλεια) για μεταβλητές που δηλώνονται με let
και const
, κάτι αρκετά σημαντικό για την οργάνωση του κώδικά μας: μια μεταβλητή που δηλώνεται μέσα σε ένα block είναι ορατή και προσβάσιμη μόνο μέσα σε αυτό το block (και σε τυχόν εσωτερικά blocks). Θα μιλήσουμε περισσότερο για την έννοια του scope σε επόμενη ενότητα.
Ένα block μπορεί να περιέχει από κανένα ως άπειρα blocks, τα οποία ονομάζονται εμφωλευμένα (nested blocks).
Τύποι δομών ελέγχου ροής
Στον παρακάτω πίνακα εμφανίζονται επιγραμματικά οι πιο διαδεδομένες δομές ελέγχου που συναντάμαι στον προγραμματισμό:
Τύπος δομής | Περιγραφή | |
---|---|---|
Υποθετική | if | Εκτελεί ένα block κώδικα αν μια συνθήκη είναι αληθής. |
else | Εκτελεί ένα block κώδικα αν η συνθήκη του if είναι ψευδής. | |
else if | Ελέγχει μια συνθήκη αν η προηγούμενη συνθήκη είναι ψευδής. | |
switch | Επιλέγει ένα block κώδικα προς εκτέλεση βάσει της τιμής μιας μεταβλητής ή ενός expression. | |
Επανάληψης | for | Επαναλαμβάνει ένα block κώδικα για έναν καθορισμένο αριθμό φορών ή για κάθε στοιχείο ενός πίνακα. |
while | Επαναλαμβάνει ένα block κώδικα όσο μια συνθήκη είναι αληθής. | |
do-while | Επαναλαμβάνει ένα block κώδικα τουλάχιστον μία φορά και μετά για όσο μια συνθήκη είναι αληθής. | |
Μεταφοράς ελέγχου | break | Τερματίζει πρόωρα έναν βρόχο επανάληψης. |
continue | Παραλείπει την τρέχουσα επανάληψη ενός βρόχου επανάληψης και συνεχίζει στην επόμενη. | |
return | Τερματίζει την εκτέλεση μιας συνάρτησης και επιστρέφει μια τιμή (προαιρετικά). | |
Χειρισμού σφαλμάτων | try | Περιέχει κώδικα που μπορεί να προκαλέσει σφάλμα (exception). |
catch | Χειρίζεται ένα σφάλμα που προέκυψε στο block try . | |
throw | Προκαλεί ή “πετάει” σφάλμα. |
Θα ακολουθήσουν ξεχωριστά κεφάλαιά και video για κάθε μία από τις δομές ελέγχου, ξεκινώντας με το if
statement.