Φωτογραφία Νικόλαος ΓΑΒΡΙΗΛ
Κανόνες σωστού προγραμματισμού - getters/setters
από Νικόλαος ΓΑΒΡΙΗΛ - Saturday, 4 December 2010, 7:58 PM
 
Καλησπέρα,
έχω μια απορία σχετικά με τη χρήση των getters/setters.

Στο βιβλίο των Deitel, συγκεκριμένα στην Παρατήρηση Μηχανικής Λογισμικού 8.4, γράφει:

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

Σε αντίθεση με αυτό, στις σημειώσεις της ενότητας, η μέθοδος displayCoords()της κλάσης Point (σελ. 118) διαβάζει απευθείας τις private μεταβλητές x και y της κλάσης χωρίς τη χρήση των αντίστοιχων getters.

Εγώ έχω καταλάβει οτι οι getters/ setters προορίζονται για την προσπέλαση των private μεταβλητών μιας κλάσης από μεθόδους έξω από την κλάση αυτή. Είναι σωστό αυτό ή ανήκει στους "κανόνες σωστού προγραμματισμού" να κάνουμε χρήση τους και στις μεθόδους της ίδιας κλάσης, ακόμα και στους constructors;


 
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: Κανόνες σωστού προγραμματισμού - getters/setters
από Νικόλαος Πανάγος - Saturday, 4 December 2010, 9:59 PM
 
Καλησπέρα Νίκο,

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

Σύμφωνα με τους κανόνες σωστού προγραμματισμού οι μεταβλητές μέλη μιας κλάσης θα πρέπει να δηλώνονται πάντα private και η προσπέλασή τους να γίνεται αποκλειστικά μέσω public μεθόδων. Οι getters/setters παρέχουν ελεγχόμενη πρόσβαση στις μεταβλητές αυτές και θα πρέπει (σχεδόν) πάντα να υπάρχουν σε κάθε κλάση για κάθε μεταβλητή μελος.
Αυτό πάντως δε σημαίνει πως δε είναι σωστό και άλλες μέθοδοι της ίδιας κλάσης να προσπελαύνουν τις μεταβλητές αυτές για το δικό τους λόγο, κάθε άλλο μάλιστα. Στο συγκεκριμένο παράδειγμα έχεις μια μέθοδο που εμφανίζει μία έξοδο στην κονσόλα που χρησιμοποιεί τις τιμές αυτές. Για ποιο λογο κάτι τέτοιο να μην είναι σωστό;

Δεν πρέπει να πας στο άλλο άκρο και να χρησιμοποιείς τις getters/setters και μέσα από μεθόδους της ίδιας της κλάσης γιατί γράφεις κώδικα που υστερεί λίγο σε ταχύτητα λόγω των απανωτών κλήσεων χωρίς αυτό να είναι απαραίτητο. Όσον αφορά τους constructors, αυτό που λες δε μπορεί να γίνει γιατί για να καλέσεις μια μεθοδο θα πρέπει πρώτα το αντικείμενο να έχει δημιουργηθεί. Το αντικείμενο έχει δημιουργηθεί αφότου ολοκληρώσει την εκτέλεσή του ο εκάστοτε constructor.

ΝΠ

p.s. By the way, όσον αφορά τον αντικεμενοστρεφή προγραμματισμό, θα σε συμβούλευα να δώσεις περισσότερο βάρος στα αναγραφόμενα στις σημειώσεις παρά στο βιβλίο.
Φωτογραφία Νικόλαος ΓΑΒΡΙΗΛ
Απάντηση: Κανόνες σωστού προγραμματισμού - getters/setters
από Νικόλαος ΓΑΒΡΙΗΛ - Sunday, 5 December 2010, 12:23 PM
 
Εντάξει, πιστεύω οτι κατάλαβα. Το βιβλίο μου τα μπέρδεψε λίγο...
Ευχαριστώ για την απάντηση!