Μετά από τόσο καιρό όσο είναι αυτά τα (προηγούμενα) ποστ αποφάσισα να ασχοληθώ με την C++ και να στρώσω τον ... κάτω και να την μάθω.
Ακόμη είμαι στην αρχή οπότε ευχηθείτε μου καλή αρχή και καλή επιμονή να τελειώσω το βιβλίο και να συνεχίσω να μαθαίνω.
Με αφορμή αυτό το παράδειγμα θέλω να συζητήσουμε κάτι που παρατήρησα.
Στο βιβλίο που διαβάζω αναφέρει την τεχνική να διαχωρίζουμε το interface από το implementation μιας κλάσης.
Για παράδειγμα στο interface γράφουμε
ΤΙ κάνει η κλάση ενώ στην υλοποίηση
ΠΩΣ το κάνει.
Για παράδειγμα ας πούμε ότι έχω την κλάση GradeBook με τον παρακάτω κώδικα
- Κώδικας: Επιλογή όλων
#include <iostream>
#include <string>
using namespace std;
class GradeBook
{
private:
string courseName;
public:
GradeBook (string name) //constructor
{
setCourseName(name);
}
void setCourseName (string name)
{
courseName = name;
}
string getCourseName()
{
return courseName;
}
void displayMessage()
{
cout << "Welcome to the GradeBook for\n" << getCourseName() << "!\n";
}
};
Αυτήν την κλάση την διαχωρίζουμε σε GradeBook.h ως το interface και GradeBook.cc ως την υλοποίηση.
GradeBook.h
- Κώδικας: Επιλογή όλων
#include <string>
using namespace std;
class GradeBook
{
private:
string courseName;
public:
GradeBook(string);
void setCourseName (string);
string getCourseName();
void displayMessage();
};
GradeBook.cc
- Κώδικας: Επιλογή όλων
#include <iostream>
#include "GradeBook.h"
using namespace std;
GradeBook::GradeBook (string name) //constructor
{
setCourseName(name);
}
void GradeBook::setCourseName (string name)
{
courseName = name;
}
string GradeBook::getCourseName()
{
return courseName;
}
void GradeBook::displayMessage()
{
cout << "Welcome to the GradeBook for\n" << getCourseName() << "!\n";
}
Πάνω σε αυτήν την τεχνική θέλω να επισημάνω κάποια θέματα.
1ον) Μου φαίνεται περιττή. Διότι στην υλοποίηση ξανα δηλώνουμε τις μεθόδους π.χ.
αντί του
void setCourseName (string name)γράφουμε
void GradeBook::setCourseName2ον) Αποκρύπτονται οι μεταβλητές τις κλάσης. π.χ. στην διεπαφή ορίζουμε το
private:
string courseName;
και μετά ο προγραμματιστής που θα χρησιμοποιήσει την κλάση (και υποτίθεται δεν θα χρειαστεί να ξέρει το GradeBook.h αρχείο) πρέπει να γνωρίζει τις εσωτερικές μεταβλητές της κλάσης διότι τις χρησιμοποιεί στην υλοποίηση.
π.χ.
- Κώδικας: Επιλογή όλων
void GradeBook::setCourseName (string name)
{
courseName = name;
}
Οπότε εγώ ρωτάω τώρα, αν ο διαχωρισμός διεπαφής - υλοποίησης της κλάσης γίνεται για να λειτουργεί κάπως διάφανα η κλάση χωρίς να είναι απαραίτητο να γνωρίζουμε το πώς λειτουργεί αλλά απλά να την χρησιμοποιήσουμε .... πώς στο καλό εγώ θα πρέπει να ξέρω την μεταβλητή
courseName για να την χρησιμοποιήσω χωρίς να διαβάσω το .h αρχείο;
Οπότε σε τι ωφελεί αυτός ο διαχωρισμός από το να γράφω την κλάση σε ένα μόνο αρχείο;