java:data_encapsulation

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

java:data_encapsulation [2015/01/21 13:55]
gthanos
java:data_encapsulation [2016/02/26 11:15]
Line 1: Line 1:
-====== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης ====== 
- 
-Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων σε άλλες κλάσεις που τις χρησιμοποιούν. Κατά κάποιο τρόπο, συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους (interface),​ το οποίο μπορούν αν χρησιμοποιήσουν άλλοι προγραμματιστές προκειμένου να χρησιμοποιήσουν την κλάση μας. Ο λόγος που αποκρύπτουμε τα εσωτερικά δεδομένα είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μία κλάσης ή βοηθητικών συναρτήσεων αυτής τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει,​ χωρίς όμως να πρέπει να αλλάξουν και οι υπόλοιπες κλάσεις που χρησιμοποιούν την κλάση αυτή. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως **data encapsulation** ή **information hiding**. ​ 
- 
-Ακολουθώντας την παραπάνω πρακτική θα επαναορίσουμε την κλάση του ποδηλάτου,​ ώστε να υπακούει στον παραπάνω κανόνα. 
- 
-<code java> 
-public class Bicycle { 
-        ​ 
-    private int cadence; 
-    private int gear; 
-    private int speed; 
-        ​ 
-    public Bicycle(int startCadence,​ int startSpeed, int startGear) { 
-        gear = startGear; 
-        cadence = startCadence;​ 
-        speed = startSpeed; 
-    } 
-        ​ 
-    public int getCadence() { 
-        return cadence; 
-    } 
-        ​ 
-    public void setCadence(int newValue) { 
-        cadence = newValue; 
-    } 
-        ​ 
-    public int getGear() { 
-        return gear; 
-    } 
-        ​ 
-    public void setGear(int newValue) { 
-        gear = newValue; 
-    } 
-        ​ 
-    public int getSpeed() { 
-        return speed; 
-    } 
-        ​ 
-    public void applyBrake(int decrement) { 
-        speed -= decrement; 
-    } 
-        ​ 
-    public void speedUp(int increment) { 
-        speed += increment; 
-    } 
-} 
-</​code>​ 
- 
-Για κάθε μεταβλητή έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (**getters**),​ αλλά και συναρτήσεις για τον ορισμό η την μεταβολή της τιμής τους (**setters**). 
- 
-===== Τύποι πεδίων της κλάσης ===== 
- 
-Μία κλάση μπορεί να διαθέτει **primitive** (βασικούς) τύπους δεδομένων (πχ. int, long, char, double, float κλπ) ή **reference** τύπους δεδομένων. **Reference** τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που αναφέρονται σε άλλες κλάσεις. Για παράδειγμα,​ ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ποδηλάτου. Η θέση του ποδηλάτου μπορεί να προσδιοριστεί από την παρακάτω κλάση ''​Coordinates''​ που προσδιορίζει την θέση με βάση το γεωγραφικό ύψος και πλάτος. 
- 
-<code java> 
-class Coordinates { 
-    private double latitude; 
-    private double longitude; 
-    ​ 
-    public void Coordinates(double lat, double long) { 
-        latitude = lat; 
-        longitude = long; 
-    } 
-    ​ 
-    public double getLatitude() { 
-        return latitude; 
-    } 
-    public double getLongitude() { 
-        return longitude; 
-    } 
-    public void setLatitude(double lat) { 
-        latitude = lat; 
-    } 
-    public void setLongitude(double long) { 
-        longitude = long; 
-    }    ​ 
-} 
-</​code>​ 
- 
-Με χρήση της παραπάνω κλάσης η κλάση ''​Bicycle''​ γίνεται. 
- 
-<code java> 
-public class Bicycle { 
-        ​ 
-    private int cadence; 
-    private int gear; 
-    private int speed; 
-    public Coordinates coordinates;​ 
-        ​ 
-    public Bicycle(int startCadence,​ int startSpeed, int startGear, int lat, int log) { 
-        coordinates = new Coordinates(lat,​long);​ 
-        gear = startGear; 
-        cadence = startCadence;​ 
-        speed = startSpeed; 
-    } 
-        ​ 
-    public int getCadence() { 
-        return cadence; 
-    } 
-        ​ 
-    public void setCadence(int newValue) { 
-        cadence = newValue; 
-    } 
-        ​ 
-    public int getGear() { 
-        return gear; 
-    } 
-        ​ 
-    public void setGear(int newValue) { 
-        gear = newValue; 
-    } 
-        ​ 
-    public int getSpeed() { 
-        return speed; 
-    } 
-        ​ 
-    public void applyBrake(int decrement) { 
-        speed -= decrement; 
-    } 
-        ​ 
-    public void speedUp(int increment) { 
-        speed += increment; 
-    } 
-} 
-</​code>​ 
- 
-Η κλάση ''​Bicycle''​ επομένως περιέχει εκτός από **primitive** πεδία και ένα **reference** πεδίο το πεδίο ''​coordinates''​. Εδώ θα πρέπει να παρατηρήσουμε δύο πράγματα. 
-  - Στην 1η γραμμή του κατασκευαστή τη συνάρτησης bicycle συναντούμε ''​coordinates = new Coordinates(lat,​long);''​. 
-  - Το πεδίο ''​coordinates''​ ορίζεται ως **public** και όχι ως **private** (γιατί;​). 
- 
  
java/data_encapsulation.txt · Last modified: 2016/02/26 11:15 (external edit)