java:data_encapsulation

Απόκρυψη δεδομένων και εσωτερικής υλοποίησης

Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων σε άλλες κλάσεις που τις χρησιμοποιούν. Κατά κάποιο τρόπο, συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους (interface), το οποίο μπορούν αν χρησιμοποιήσουν άλλοι προγραμματιστές προκειμένου να χρησιμοποιήσουν την κλάση μας. Ο λόγος που αποκρύπτουμε τα εσωτερικά δεδομένα είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μία κλάσης ή βοηθητικών συναρτήσεων αυτής τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει, χωρίς όμως να πρέπει να αλλάξουν και οι υπόλοιπες κλάσεις που χρησιμοποιούν την κλάση αυτή. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως data encapsulation ή information hiding.

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

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;
    }
}

Για κάθε μεταβλητή έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (getters), αλλά και συναρτήσεις για τον ορισμό η την μεταβολή της τιμής τους (setters).

Τύποι πεδίων της κλάσης

Μία κλάση μπορεί να διαθέτει primitive (βασικούς) τύπους δεδομένων (πχ. int, long, char, double, float κλπ) ή reference τύπους δεδομένων. Reference τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που αναφέρονται σε άλλες κλάσεις. Για παράδειγμα, ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ποδηλάτου. Η θέση του ποδηλάτου μπορεί να προσδιοριστεί από την παρακάτω κλάση Coordinates που προσδιορίζει την θέση με βάση το γεωγραφικό ύψος και πλάτος.

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;
    }    
}

Με χρήση της παραπάνω κλάσης η κλάση Bicycle γίνεται.

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;
    }
}

Η κλάση Bicycle επομένως περιέχει εκτός από primitive πεδία και ένα reference πεδίο το πεδίο coordinates. Εδώ θα πρέπει να παρατηρήσουμε δύο πράγματα.

  1. Στην 1η γραμμή του κατασκευαστή τη κλάσης Βicycle συναντούμε coordinates = new Coordinates(lat,long);.
  2. Το πεδίο coordinates ορίζεται ως public και όχι ως private (γιατί;).
java/data_encapsulation.txt · Last modified: 2016/02/26 11:15 (external edit)