Οι 4 πυλώνες του Αντικειμενοστρεφούς Προγραμματισμού

Encapsulation:

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

Βασικές έννοιες του εγκλεισμού:

Διακριτικοί Τροποποιητές Πρόσβασης:

Το encapsulation συχνά χρησιμοποιεί access modifiers (όπως private, protected και public σε Java ή C++) για να ελέγξει την ορατότητα των μελών μιας κλάσης. Καθιστώντας ορισμένες ιδιότητες ή μεθόδους ιδιωτικές (private), είναι προσβάσιμες μόνο εντός της κλάσης, εξασφαλίζοντας ότι η εσωτερική κατάσταση δεν τροποποιείται απευθείας από έξω.

Μέθοδοι Getter και Setter:

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


Απόκρυψη Δεδομένων:

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


Απόκρυψη Πληροφοριών:

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


Παράδειγμα:



Κληρονομικότητα

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

Εδώ είναι τα βασικά έννοια της κληρονομιάς:

Βασική Κλάση (Υπερκλάση):
Η βασική κλάση, επίσης γνωστή ως υπερκλάση, είναι η υπάρχουσα κλάση που περιέχει κοινά χαρακτηριστικά και μεθόδους. Λειτουργεί ως υπόδειγμα για τη δημιουργία νέων κλάσεων.

Κληρονομημένη Κλάση (Υποκλάση):
Η κληρονομημένη κλάση, επίσης γνωστή ως υποκλάση, είναι η νέα κλάση που κληρονομεί χαρακτηριστικά και μεθόδους από τη βασική κλάση. Μπορεί επίσης να έχει δικά της επιπλέον χαρακτηριστικά και μεθόδους ή να αντικαθιστά υπάρχοντες.

Σχέση "is-a":
Η κληρονομία καθιερώνει μια σχέση "is-a" μεταξύ της υποκλάσης και της υπερκλάσης. Για παράδειγμα, ένας Σκύλος "is-a" τύπος Ζώο. Αυτή η σχέση υποδηλώνει ότι ένας Σκύλος μοιράζεται κοινά χαρακτηριστικά με ένα Ζώο αλλά μπορεί να έχει επιπλέον ή εξειδικευμένες συμπεριφορές.

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

Επαναρρύθμιση Μεθόδων:
Οι υποκλάσεις μπορούν να αναρρυθμίσουν (παρέχουν νέα υλοποίηση για) μεθόδους που κληρονομούν από την υπερκλάση. Αυτό επιτρέπει την προσαρμογή της συμπεριφοράς στην υποκλάση διατηρώντας ταυτόχρονα μια συνεπή διεπαφή.

Παράδειγμα:



Πολυμορφισμός

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

Υπάρχουν δύο κύρια είδη πολυμορφισμού: 
- ο πολυμορφισμός κατά τον χρόνο συγγραφής ή στατικός πολυμορφισμός (compile time)
- ο πολυμορφισμός κατά τη διάρκεια της εκτέλεσης ή δυναμικός πολυμορφισμός (run time )

Compile Time Polymorphism:
Ο πολυμορφισμός κατά τον χρόνο συγγραφής συμβαίνει όταν υπάρχουν πολλές μέθοδοι με το ίδιο όνομα αλλά διαφορετικούς καταλόγους παραμέτρων (πλήθος ή τύποι παραμέτρων) στην ίδια κλάση. Ο μεταγλωττιστής καθορίζει ποια μέθοδο να κληθεί βασισμένος στην υπογραφή της μεθόδου κατά τη διάρκεια του χρόνου συγγραφής.

Run Time Polymorphism:
Ο πολυμορφισμός κατά την εκτέλεση συμβαίνει όταν μια υποκλάση παρέχει μια συγκεκριμένη υλοποίηση για μια μέθοδο που έχει ήδη καθοριστεί στην υπερκλάση της. Αυτό επιτυγχάνεται μέσω της ανασύνθεσης μεθόδων.

Παράδειγμα:



Abstraction

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

Κύριες έννοιες της αφαίρεσης περιλαμβάνουν:

Αφαιρετικές Κλάσεις και Διεπαφές:
Η αφαίρεση συχνά υλοποιείται μέσω αφαιρετικών κλάσεων και διεπαφών. Οι αφαιρετικές κλάσεις είναι κλάσεις που δεν μπορούν να δημιουργηθούν αυτόνομα και μπορεί να περιέχουν αφαιρετικές μεθόδους (μεθόδους χωρίς συγκεκριμένη υλοποίηση). Οι διεπαφές δηλώνουν ένα σύνολο υπογραφών μεθόδων χωρίς να παρέχουν υλοποιήσεις. Και οι δύο καθορίζουν ένα συμβόλαιο που πρέπει να πληροίται από συγκεκριμένες κλάσεις.

Κρυφές Λεπτομέρειας Υλοποίησης:
Η αφαίρεση περιλαμβάνει την απόκρυψη στις εσωτερικές λεπτομέρειες υλοποίησης μιας κλάσης και αποκαλύπτοντας μόνο αυτό που είναι απαραίτητο για τον εξωτερικό κόσμο να αλληλεπιδρά με αυτήν. Αυτό επιτρέπει στους προγραμματιστές να επικεντρώνονται στις ουσιώδεις πτυχές ενός αντικειμένου και να αφαιρούν την πολυπλοκότητα.

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

Επικέντρωση στο "Τι", όχι στο "Πώς":
Η αφαίρεση προτρέπει τους προγραμματιστές να επικεντρώνονται στο "τι" κάνει ένα αντικείμενο, παρά στο "πώς" επιτυγχάνει τη λειτουργικότητά του. Αυτή η διάκριση βελτιώνει τη σαφήνεια του κώδικα και τον κάνει ευκολότερα κατανοητό και συντηρήσιμο.

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

Παράδειγμα: