PDA

Visualizza la versione completa : [C] Domanda su OOP


Felixfree
27-10-2005, 12:23
Per quanto da me saputo il C non consente la definizione di una classe e quindi di istanziare oggetti, però in C sono scritte alcune applicazioni che agli oggetti fanno riferimento. Un esempio è il PostgreSQL, un ORDBMS (Object Relational DBMS) scritto in C. Qualcuno mi può dire se la mia asserzione è inesatta e se non lo è mi può spiegare come posso sfruttare il paradigma della OOP con un linguaggio che non permette di definire le classi?

La questione può essere un pò lunga e ringrazio chi vorrà aiutarmi a capire questa discordanza o indicarmi dove documentarmi per capirci qualcosa! :messner:

oregon
27-10-2005, 12:31
Stai facendo un po' di confusione ...

Un ORDBMS e' un DBMS che ha la capacità di trattare, oltre ai dati "normali" che trattano tutti i DB, anche dati "complessi", come possono essere gli "oggetti complessi" come diverse tipologie di dati binari di tipo media (immagini, audio, video ...).

Gli "oggetti" per tali DBMS sono quindi dei dati che possono essere memorizzati ...

Non c'entra nulla il linguaggio con cui è stato realizzato tale sistema ... le capacita' di trattare gli oggetti (intesi come istanze di una classe) in un programma e la capacità di gestire dati complessi come oggetti in un DBMS, sono cose completamente distinte e che non hanno nessun "punto di contatto tra loro".

Felixfree
27-10-2005, 12:57
Originariamente inviato da oregon
Stai facendo un po' di confusione ...


Hai pienamente ragione



Un ORDBMS e' un DBMS che ha la capacità di trattare, oltre ai dati "normali" che trattano tutti i DB, anche dati "complessi", come possono essere gli "oggetti complessi" come diverse tipologie di dati binari di tipo media (immagini, audio, video ...).


Su questo siamo d'accordo: infatti per quanto ne so io, dagli studi fatti in materia, il modello relazionale per sua natura e concezione richiede che tutti gli attributi siano caratterizati da un dominio elementare. Da qui ecco gli ORDBMS che permettono anche di definire dati complessi.



Gli "oggetti" per tali DBMS sono quindi dei dati che possono essere memorizzati ...


Questi dati complessi però, o oggetti come li chiami giustamente tu, come vengono strutturati? Un dominio elementare come gli interi e i caratteri sono tipi nativi per ogni DB, come faccio io se devo costruire una struttura che deve memorizzare una matrice di bit ad esempio e definire una qualche metrica per operare dei confronti tra due oggetti di questo tipo?



Non c'entra nulla il linguaggio con cui è stato realizzato tale sistema ... le capacita' di trattare gli oggetti (intesi come istanze di una classe) in un programma e la capacità di gestire dati complessi come oggetti in un DBMS, sono cose completamente distinte e che non hanno nessun "punto di contatto tra loro".

Questo significa quindi che Postgresql non soffre di alcuna limitazione dovuta al fatto che il linguaggio con cui è scritto, cioè il C, non consente la definizione degli oggetti?

oregon
27-10-2005, 13:18
Originariamente inviato da Felixfree
Questi dati complessi però, o oggetti come li chiami giustamente tu, come vengono strutturati? Un dominio elementare come gli interi e i caratteri sono tipi nativi per ogni DB, come faccio io se devo costruire una struttura che deve memorizzare una matrice di bit ad esempio e definire una qualche metrica per operare dei confronti tra due oggetti di questo tipo?

Questi sono problemi che affrontano e risolvono proprio i software di tipo ORDBMS ... mi sembra che ci sia SQL3 con determinate caratteristiche, regole e sintassi per gestire queste problematiche ...

Ma, ripeto, e' un problema che attiene la gestione di quel tipo di dati in quei sistemi, non la OOP.


Questo significa quindi che Postgresql non soffre di alcuna limitazione dovuta al fatto che il linguaggio con cui è scritto, cioè il C, non consente la definizione degli oggetti?

E perche' dovrebbe? Ripeto ... non c'e' alcuna connessione tra le due cose ...

Posso scrivere anche in Assembler un programma che gestisce dei dati strutturati ... l'oggetto trattato dalla OOP e l'oggetto come struttura dati complessa da memorizzare in un DB, sono cose diverse ...

Felixfree
27-10-2005, 13:47
Si è vero SQL:1999, o SQL3 come dir si voglia, permette la definizione di tipi di dati strutturati quali BLOB (Binary Large Object) e CLOB (Character Large Object), il discorso è che per entrambi i domini il sistema (non solo PostgreSQL, ma anche altri che permettono la definizione di questi) garantisce solo di memorizzare il valore, ma non permette che il valore venga utilizzato come criterio di selezione per le interrogazioni. Il mio problema consiste nel fatto che io devo fare un'analisi sulla possibile estensione dei domini del PostgreSQL, quindi eseguire una successiva modifica del codice sorgente e ricompilazione di questo al fine di poter eseguire nella clausola WHERE confronti fra dati strutturati (tipo immagini ad esempio). Per me è quindi importante capire come il sistema definisce le strutture di dati appunto "strutturati" e rendersi conto di come fare, senza usare classi ed oggetti, a definire dei metodi che siano abili operatori di confronto fra questi dati strutturati. Lasciamo perdere il senso che può avere o meno eseguire un confronto fra due immagini, pensa a due attributi che memorizzano dei vettori (vect) e pensa che io devo modificare il PostgreSQL in modo tale da poter scrivere una query così:

SELECT tabella1.nome, tabella2.nome
FROM tabella1, tabella2
WHERE tabella1.vect>tabella2.vect

Spero in qualche modo di averti fatto capire che ho ben chiaro qual è il mio scopo ma che non conosco il codice sorgente e al momento ho dei seri dubbi su come operare in tal senso... fatto sta che da qualche parte devo iniziare e per togliersi i dubbi e capire come stanno le cose spesso si dicono anche degli sfondoni!

oregon
27-10-2005, 14:39
Sì ... nessun problema ... le mie precisazioni erano intese a dire che l'OOP non ha niente a che vedere con il tuo problema, che e' quello di usare "dati complessi e strutturati" (nota che non ho usato il termine "oggetti" proprio per non cadere in ambiguità ...).

Quello e' un problema delle caratteristiche dell' ORDBMS che dovrai scegliere (non c'e' solo quello indicato) in base a quello che ti serve, non secondo quale linguaggio e' scritto, credendo che abbia maggiori capacità se ha maggiori affinita' con l'OOP.

L'esempio che hai fatto, aldila' del fatto che e' solo un esempio per capire la tua problematica, e questo va bene, non mi sembra pero' che abbia molto senso ... quale sarebbe la regola per cui un vettore e' maggiore di un altro?

Felixfree
27-10-2005, 16:22
Originariamente inviato da oregon
Sì ... nessun problema ... le mie precisazioni erano intese a dire che l'OOP non ha niente a che vedere con il tuo problema, che e' quello di usare "dati complessi e strutturati" (nota che non ho usato il termine "oggetti" proprio per non cadere in ambiguità ...).


Bene, già questo rispetto a stamani per me è un passo avanti!



Quello e' un problema delle caratteristiche dell' ORDBMS che dovrai scegliere (non c'e' solo quello indicato) in base a quello che ti serve, non secondo quale linguaggio e' scritto, credendo che abbia maggiori capacità se ha maggiori affinita' con l'OOP.


Sono vincolato a dover utilizzare PostgreSQL, che appunto appartiene alla famiglia degli ORDBMS, poichè il mio obiettivo è proprio di conferire ad esso la funzionalità di cui parlavo sopra, sempre se ciò è possibile.... adesso è questo che devo capire!



L'esempio che hai fatto, aldila' del fatto che e' solo un esempio per capire la tua problematica, e questo va bene, non mi sembra pero' che abbia molto senso ... quale sarebbe la regola per cui un vettore e' maggiore di un altro?

In Analisi Matematica due vettori sono confrontabili definendo una "metrica" o "distanza" che dir si voglia.

Senza voler annoiare nessuno per completezza:

Se x e y sono due numeri reali la metrica o distanza è d(x,y)=|x-y|, cioè una delle possibili che posso definire, dove questa in effetti è quella comunemente utilizzata. La coppia (spazio dei numeri reali, d), dove d è una metrica, prende appunto il nome di "spazio metrico".

Se X e Y sono due vettori definiti in uno spazio tridimensionale(R³), posso definire la seguente metrica o distanza: d(X,Y)=√∑|Xi-Yi|² dove i è l'indice della sommatoria che va da 1 a 3. Questa è nota come "distanza euclidea".

In pratica la metrica è una funzione che restituisce un valore reale e quindi permette un confronto fra dati strutturati apparteneti all'insieme su cui è definito lo spazio metrico.

Dopo questa doverosa (e forse noiosa) appendice spero che sia chiara la mia posizione: io devo capire come PostgreSQL memorizza dati strutturati e principalmente come è scritto il sorgente che permette la loro definizione, come definire delle funzioni (cioè delle metriche) che permetteno il confronto fra questi dati in modo tale da poter utilizzare questi confronti come criteri di selezione quando vado ad eseguire delle query con PostgreSQL. Detto ciò come sempre qualsiasi indicazione è ben accetta!

Ikitt
27-10-2005, 16:25
Originariamente inviato da Felixfree
[...]
Dopo questa doverosa (e forse noiosa) appendice spero che sia chiara la mia posizione: io devo capire come PostgreSQL memorizza dati strutturati e principalmente come è scritto il sorgente che permette la loro definizione, come definire delle funzioni (cioè delle metriche) che permetteno il confronto fra questi dati in modo tale da poter utilizzare questi confronti come criteri di selezione quando vado ad eseguire delle query con PostgreSQL. Detto ciò come sempre qualsiasi indicazione è ben accetta!
Dovrebbe essere indicato sulla documentazione di postgresql. Sia come operano gli operatori di confronto predefiniti sia come modificarne la semantica, intendo.

Felixfree
27-10-2005, 16:38
Originariamente inviato da Ikitt
Dovrebbe essere indicato sulla documentazione di postgresql. Sia come operano gli operatori di confronto predefiniti sia come modificarne la semantica, intendo.

Infatti ci sto guardando anche se al momento mi pare di essere su una zattera in mezzo ad un oceano di cose che non conosco e che non posso ovviamente pretendere di capire in un giorno!

Grazie comunque x il suggerimento! :ciauz:

Fox82
27-10-2005, 16:47
Originariamente inviato da oregon
Stai facendo un po' di confusione ...

Un ORDBMS e' un DBMS che ha la capacità di trattare, oltre ai dati "normali" che trattano tutti i DB, anche dati "complessi", come possono essere gli "oggetti complessi" come diverse tipologie di dati binari di tipo media (immagini, audio, video ...).

Gli "oggetti" per tali DBMS sono quindi dei dati che possono essere memorizzati ...

Non c'entra nulla il linguaggio con cui è stato realizzato tale sistema ... le capacita' di trattare gli oggetti (intesi come istanze di una classe) in un programma e la capacità di gestire dati complessi come oggetti in un DBMS, sono cose completamente distinte e che non hanno nessun "punto di contatto tra loro".

Forse non ho capito bene il discorso ma mi sembra che confusione la stai facendo tu: :nonono:

gli ordmbs sono dbms che gestiscono oggetti nel senso vero e proprio della oop. Sono in grado cioè di serializzare su hd istanze di classi e deserializzarle all'occorrenza

http://it.wikipedia.org/wiki/DBMS#DBMS_ad_oggetti

Non avendoli mai usati e non conoscendo postgressql non ti so dire di più, ma il principio è quello

:ciauz:

Loading