C# COMPLETE COURSE

image description

ΕΝΟΤΗΤΑ 20 - ENCAPSULATION

INTRODUCTION

Σε αυτό το δωρεάν μάθημα C# θα αναλύσουμε την έννοια του encapsulation και θα διαμορφώσουμε τον κώδικα μας με τέτοιο τρόπο έτσι ώστε να ακολουθεί την σωστή τακτική όσο αφορά την ασφάλεια ανάθεσης τιμών στις μεταβλητές.

WHY WE NEED ENCAPSULATION

Στο παράδειγμα με το οποίο έχουμε ασχοληθεί στις τελευταίες δωρεάν C# ενότητες, έχουμε δημιουργήσει μια κλάση με το όνομα Product μέσα στην οποία όλες οι μεταβλητές έχουν οριστεί με είδος πρόσβασης public.

Δωρεάν Μαθήματα C#

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

Δωρεάν Μαθήματα C#

Μέχρι εδώ νομίζω ότι γνωρίζετε όλη τη θεωρία και πρέπει όλες αυτές οι έννοιες να σας είναι γνωστές. Όμως, όσο αφορά το πρακτικό σκέλος του κώδικα, υπάρχει ένα μικρό πρόβλημα - δεν υπάρχει κάνενας απολύτως έλεγχος στην ανάθεση των τιμών. Για παράδειγμα, η μεταβλητή productID, που έχει οριστεί στην κλάση Product να είναι είδος int, θα δεχτεί οποιαδήποτε τιμή που βρίσκεται μέσα στο εύρος των int αριθμών. Οπότε ο αριθμός 1001, ο αριθμός 10001 αλλά και ο αριθμός -1001 είναι όλοι αποδεκτοί σαν τιμές με βάση τον έλεγχο που κάνει η C# στην int μεταβλητή. Από την πλευρά της C# δεν υπάρχει κάνενα απολύτος λάθος, από την πλευρά όμως του business και γενικότερα της λογικής πως θέλουμε ακριβώς να λειτουργεί η εφαρμογή μας, αυτή η προσέγγιση παρουσιάζει αδύνατα σημεία. Είναι σχεδόν σίγουρο ότι αργά ή γρήγορα κάποιες από τις τιμές που θα γίνουν εισαγωγή στο πρόγραμμα θα είναι λάθος για την λογική της εφαρμογής αλλά θα δυσκολευτούμε να τις ανακαλύψουμε γιατί η εφαρμογή μας θα συνεχίζει να λειτουργεί κανονικά αφού όλες οι τιμές είναι μέσα στα όρια των data types που έχουμε ορίσει. Εννοείται ότι η ίδια λογική ισχύει για όλα τα data types που μπορούμε να ορίσουμε σε μεταβλητές μέσα σε μια κλάση.

HOW TO APPLY ENCAPSULATION

Για να αντιμετωπίσουμε αυτό το πρόβλημα εφαρμόζουμε την λογική του encapsulation στις μεταβλητές. Πρακτικά, αυτό σημαίνει ότι θα αλλάξουμε το data type στις μεταβλητές που δεν είναι static ή const από public σε private σαν πρώτο βήμα.

Product.cs

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

Δωρεάν Μαθήματα C#

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

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

Δωρεάν Μαθήματα C#

CREATING SET AND GET METHODS

Τι είναι λοιπόν το encapsulation? Είναι το κρύψιμο μιας ομάδας στοιχείων σε μια κλάση εφαρμόζοντας private data type σε αυτά και δίνοντας πρόσβαση μόνο δια μέσω public μεθόδων.

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

Ας δημιουργήσουμε τις δύο απαραίτητες μεθόδους που χρειαζόμαστε για να διαβάσουμε ή να αναθέσουμε τιμή στην μεταβλητή productID.

Για να διαβάσουμε την τιμή που ήδη έχει η μεταβλητή productID, υλοποιούμε μια μέθοδο με το όνομα GetProductID() που δεν θα δέχεται καμία παράμετρο στην παρένθεση, και όταν την καλέσουμε θα μας επιστρέψει την τιμή της productID μεταβλητής για αυτό άλλωστε το data type της μεθόδου συμφωνεί με το data type της μεταβλητής από την οποία διαβάζει την τιμή. Για να μπορούμε εύκολα να αναγνωρίσουμε την λειτουργία της ξεκινάμε το όνομα της με την λέξη Get.

GetProductID Method

Με την ίδια λογική δημιουργούμε μια ακόμα μέθοδο η οποία όμως θα πρέπει να δέχεται μια τιμή, την τιμή που θέλουμε να αναθέσουμε στην μεταβλητή, μέσω μιας παραμέτρου και θα αναθέτει την τιμή αυτή στη μεταβλητή του αντικειμένου. Το όνομα αυτής της μεθόδου το ξεκινάμε με την λέξη Set και μέσα στη μέθοδο, πριν την ανάθεση της τιμής, είμαστε ελεύθεροι να πραγματοποιήσουμε οποιοδήποτε έλεγχο επιθυμούμε σύμφωνα με την λογική της εφαρμογής. Ας υποθέσουμε ότι για τη μεταβλητή productID οι αριθμοί θα πρέπει να είναι μεταξύ 1 και 5000 ενώ για οποιαδήποτε άλλη περίπτωση θα γίνει ανάθεση τιμής 0 στην μεταβλητή για να γνωρίζουμε στην ουσία ότι δεν πέτυχε η διαδικασία.

SetProductID Method

Ας δούμε τώρα πως έχει αλλάξει ο κώδικας σε ολόκληρη την κλάση Product.

Product.cs

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

Program.cs

Output

Δωρεάν Μαθήματα C#

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

Μιχάλης Κασάπογλου

Ο Μιχάλης Κασάπογλου, είναι ένας από τους πιο έμπειρους τεχνικούς εκπαιδευτές στον χώρο του προγραμματισμού με πάνω από 20 χρόνια εμπειρία. Έχει εργαστεί σαν IT Operations Manager, Senior Programmer, και Training Team Leader ενώ κατέχει και αρκετές πιστοποιήσεις που καλύπτουν ένα μεγάλο φάσμα τεχνολογιών στο προγραμματισμό, σε βάσεις δεδομένων και cloud. Στον ελεύθερο του χρόνο διατηρεί ένα τεχνολογικό blog στο οποίο θα βρείτε αρκετά δωρεάν μαθήματα προγραμματισμού για αρχάριους.

loader