Newsgroup: it.comp.programmare.win32
Titolo: Terminologia...

Ciao,
scusate la domanda probabilmente stupida,ma voglio togliermi questa
curiosità,e comunque ritengo importante destreggiarsi tra le varie
terminologie...
Innanzitutto,si tratta di una domanda relativa alla terminologia usata nei
testi in lingua inglese che sto consultando per imparare a lavorare con le
MFC.
Ormai mi è chiaro come l'incapsulamento corrisponda al data hiding (ossia
rendere disponibile solo un'interfaccia al "mondo esterno",nascondendo
l'implementazione della classe).
Quando invece viene detto "MFC wraps the RECT structure within the CRect
class" si intende sostanzialmente la stessa cosa?A me sembra di sì,ma
allora perchè non viene usato un singolo termine?
E quindi,di rimando, cosa si intende per classe wrapper?
Vi ringrazio anticipatamente :)

 Vi ringrazio anticipatamente :)
Il termine "classe Wrapper" credo sia più inteso come una specie di
Pattern (e.g. Decorator, Adapter o Façade) che appunto _avvolgono_
altre classi preesistenti. Il termine "Incapsulamento descrive quello
che fanno i wrapper, ma anche quello che fa una classe con i suoi
membri e metodi, che tu menzioni appunto.
L'incapsulamento è un principio generale, le classi wrapper sono -a
mio parere- un'implementazione del principio. Ce ne sono altre,
certamente.
Perchè non viene usato un singolo termine credo si evinca o sia
evidente o appaia chiaro da quello che ho scritto sopra. Bello avere
sinonimi, poi, fanno lo scrivere e il parlare più gradevoli, no? Poi,
queste sfumature sono quasi sempre delicate e vanno capite a fondo.
--
Saludos
Adriano

 E quindi,di rimando, cosa si intende per classe wrapper?
Una classe "wrapper" č una classe che, appunto, "wrappa", cioč avvolge,
racchiude una certa implementazione.
Generalmente una classe wrapper serve a offrire un'interfaccia concreta e
consistente a un "mondo" a cui sarebbe difficile accedere in maniera
ordinata.  
Ti faccio un esempio: supponi di avere l'API di un database. Perché ogni
linguaggio possa conformarsi ad essa, ti viene dato un SDK fatto di DLL
che espongono certe funzioni. Il meccanismo di accesso al DB prevede certi
step precisi (non so se hai mai l'ottato con l'OCI di Oracle... brrrrrr) e
quindi sei tenuto a seguire un certo percorso.
L'alternativa all'uso diretto delle funzioni č quello di costruire una
classe che mediante dei metodi racchiuda l'utilizzo di queste funzioni.
Per esempio supponendo che tu costruisca una classe:
 CDatabaseConnection
potresti esporre i metodi: open() e close()
Il metodo open() fa per esempio le seguenti operazioni (nomi e tipi
inventati):
   DB_CONTEXT_HANDLE dbctxh = openDatabaseContext();
   setDatabaseInitialConfiguration(dbctxh, myConfiguration);
   DB_CONNECTION_HANDLE connh= openConnection(dbctxh);
Il metodo close() chiama in sequenza le funzioni:
   closeConnection(dbctxh);
   closeDatabaseContext(dbctxh);
Se vuoi aprire e chiudere una connessione a questo fantomatico DB, quindi,
anziché invocare manualmente quelle funzioni (e quindi rischiare di
sbagliare i passi, saltarli o passare dati errati), hai "wrappato" quegli
step in metodi di una classe CDatabaseConnection con un'interfaccia piů
intuitiva:
CDatabaseConnection 
  - open() // apre la connessione al PaperinoDB
  - close() // chiuse la connessione al PaperinoDB
Ovviamente, da qui puoi sbizzarrirti a pensare a tutti gli altri possibili
casi.  Spero di non aver contribuito a confonderti le idee :-P
Ti ho fatto questo esempio perché credo che per capire un canguro, la cosa
migliore sia vederlo saltare :-)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 allora perchč non viene usato un singolo termine?
La classe CRect non effettua un "data hiding". Si limita a ereditare 
pubblicamente dalla struttura RECT, e quindi tutti i campi di RECT 
rimangono accessibili agli utenti di CRect.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila