Newsgroup: it.comp.lang.c++
Titolo: classi 2

Vi ringrazio molto siete stati molto chiari ho capito abbastanza ilk
concetto...
Quello che vorrei ancora sapere è come mai l'autista non deve sapere che
cosa succede da un punto di vista meccanico o elettronico cosa succede se
schiaccia un pulsante voglio dire un programmatore è tenuto a sapere come
usare una classe ma non che cosa è questa classe..non so se mi sono
spiegato...Perchè c'è questa necessità per sicurezza per copyright..non
capisco bene...L'altra volta ad un esame il mio prof mi chiese come mai si è
introdotto il concetto di occultamento dati... ed io nn sapevo cosa
rispondere sapreste consigliarmi?
Grazie Alex

 Grazie Alex
non c'è di che
-- 
Abruzzo SIlvio
goku_...@libero.it
silvi...@aruba.it
Linux Machine 219721
^_____^

 introdotto il concetto di occultamento dati... ed io nn sapevo cosa
Perché in genere il programmatore che utilizza una classe non è per forza
quello che l'ha creata. Se io scrivo una classe che assolve un certo
compito, poi questa classe la prendo e la passo a te, l'unica cosa che ti
dirò è chi sono i dati e metodi pubblici che puoi utilizzare e cosa fanno.
Dal tuo punto di vista (o di chi utilizza tale classe) non importa come io
l'abbia implementata: si presume che funzioni! Come ha detto Silvio nel suo
post, è la stessa cosa quando utilizzi oggetti standard come cin e cout: sai
che facendo
cout << "Hello World!";
ti viene stampata una scritta, ma non sai come tale oggetto esegua questa
operazione.
--
  Jerle Shannara
Per rispondere in email togli NO e SPAM
homepage 
http://utenti.tripod.it/jerleshannara

 Grazie Alex
Studiare.
----
Gaetano.
-- 
Posted from [194.214.173.28] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG


L'idea dietro l' "information-hiding" (credo sia questo il termine a cui
ti riferisci on "occultamento dati") e quella di garantire una migliore
manutenibilita' del codice, consentendo di cambiare l'implementazione
di una classe senza nessuna conseguenza per gli utilizzatori della
classe stessa...
Classico esempio:
Supponiamo di avere una classe Punto con tre membri x,y,z (le coordinate
cartesiane).
Potremmo realizziarla con una semplice 
struct Punto { double x,y,z; }; // nessun information-hiding
oppure con una classe del tipo
class Punto
{
	double x_, y_, z_;
    public:
	double x() const { return x_; }
	double y() const { return y_; }
	double z() const { return z_; }
};
Apparentemente le due soluzioni sono equivalenti (solo la seconda e' un
po'
piu' lunga da scrivere ;-)
Ne scegliamo una e poi cominciamo a scrivere un centinaio di classi che
usano "Punto" per le piu' svariate applicazioni.
Un bel giorno decidiamo che forse e' meglio passare dalle coordinate
cartesiane alle coordinate polari...
Se all'inizio abbiamo scelto la prima soluzione e' un bel disastro:
bisogna 
cambiare tutto il codice scritto da quel giorno a oggi.
Se invece siamo stati previdenti e abbiamo preferito scrivere qualche
linea
in piu' e' sufficiente cambiare l'implementazione dei metodi x(),y() e
z()
(e di eventuali pochi altri metodi per gestire i punti) e tutto il
codice
scritto con la vecchia classe continua a funzionare (basta solo
ricompilarlo).
Portando la cosa all'estremo, e' possibile addirittura poter decidere di
cambiare implementazione in qualsiasi momento "senza" dover ricompilare
sempre tutto quanto,  usando la tecnica del "pImpl", che consiste nel
dichiarare la classe Punto in questo modo:
class Punto
{
   class ImplPunto * pImpl;
 public:
   double x() const;
   double y() const;
   double z() const;
};
La classe ImplPunto verra' definita in un modulo a parte assieme
all'implementazione dei metodi x() y() e z()  (tipicamente in una
libreria o
dll) e sostituendo la libreria in qualsiasi momento si puo' sostituire
l'implementazione senza che le applicazioni 'clienti' di questa classe
si
accorgano di nulla.
Ovviamente questa versatilita' ha un costo in prestazioni: infatti per
accedere alle coordinate del punto bisogna invocare un metodo non inline
e dereferenziare un puntatore (pImpl) viceversa l'altra soluzione non
comporta costi in piu' rispetto alla semplice struct, visto che i metodi
possono essere definiti inline.
Saluti,
Fabio
