Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-02-2003, 10:39   #1
killalot
Member
 
Iscritto dal: Mar 2002
Città: Trento
Messaggi: 215
salviamo la gerarchia

Dunque, questo dovrebbe essere un problema abbastanza comune che però non viene nemmeno sfiorato in tutti i libri di programmazione ad oggetti che ho letto/consultato.
In pratica si tratta di salvare su disco tutte le informazioni sulla gerarchia di oggetti che risiedono in memoria durante l'esecuzione del programma.
In genere non faccio altro che inserire nella classe root un metodo saveData() o giù di lì che discende in maniera scimmiesca tutta la gerarchia e richiede ai singoli oggetti le informazioni.
Ora, mi rendo conto io stesso che è un metodo abbastanza troglodita , se non altro perchè ogni volta che aggiungo una classe al progetto devo andare a modificare il tutto.
Quindi mi chiedevo se esiste una tecnica più furba, applicabile possibilmente sia a c++ che java o a qualsiasi altro linguaggio ad oggetti... qualcuno ne sa qualcosa??
killalot è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 11:15   #2
Kleidemos
Bannato
 
L'Avatar di Kleidemos
 
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
Re: salviamo la gerarchia

mi faresti un esempio di quello che usi?
Kleidemos è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 11:50   #3
killalot
Member
 
Iscritto dal: Mar 2002
Città: Trento
Messaggi: 215
Dunque ti faccio un esempio che riguarda più o meno la roba su cui lavoro. Diciamo che c'e' un programma per l'analisi della struttura chimica delle molecole, scritto in c++. Ora, quando ho iniziato a scriverlo, la mia conoscenza della logica ad oggetti non era proprio cristallina e quindi diciamo che c'e' qualche difetto di progettazione .
In pratica ho una classe principale Project che contiene una serie di array a dimensione variabile, (sono dei vector<> ma potrebbero essere benissimo delle ArrayList in java o qualche altro tipo di classe container) che rappresentano le varie sostanze, la lista delle proprietà chimico-fisiche, nonchè una lista di algoritmi che mettono in correlazione le proprietà con la struttura.
Quindi, per salvare i dati su disco, nella classe Project ho inserito un metodo che iterativamente scorre tutti gli array (strutture, proprietà, etc), e per ogni oggetto contenuto nell'array fa la stessa cosa con le strutture dati nidificate nell'oggetto stesso (ad esempio ogni oggetto di tipo struttura contiene un array di oggetti di tipo "atomo" e uno di tipo "legame").
La cosa tutto sommato funziona, anche perchè diciamo che la complessità del progetto non è elevata, il fatto è che ogni volta che si operano dei cambiamenti nelle classi sottostanti occorre andare a modificare i metodi saveData()/loadData() della classe project, cosa che, oltre ad essere poco elegante, viola probabilmente anche qualche regola della programmazione ad oggetti .
Non so se mi sono spiegato abbastanza chiaramente...
killalot è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 11:50   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Re: salviamo la gerarchia

Quote:
Originally posted by "killalot"

Quindi mi chiedevo se esiste una tecnica più furba, applicabile possibilmente sia a c++ che java o a qualsiasi altro linguaggio ad oggetti... qualcuno ne sa qualcosa??
Se i dati non sono dichiarati dinamicamente e non ci sono puntatori in C++ basterebbe fare una write(this, sizeof(*this)); In Java non dovrebbe funzionare...

Magari in Java esiste già qualcosa riguardo alla serializzazione delle classi...
Comunque il tuo metodo credo che sia valido.. Cioè fare una funzione virtuale in ogni classe della gerarchia che richiama la stessa funzione sulla/e classe/i da cui deriva e successivamente salva i dati relativi alla sua istanza eventualmente presenti nella classe...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 11:54   #5
Kleidemos
Bannato
 
L'Avatar di Kleidemos
 
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
capisco!
Aspetto risposte perche interessato
Kleidemos è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 12:14   #6
killalot
Member
 
Iscritto dal: Mar 2002
Città: Trento
Messaggi: 215
Re: salviamo la gerarchia

Quote:
Originally posted by "cionci"


Comunque il tuo metodo credo che sia valido.. Cioè fare una funzione virtuale in ogni classe della gerarchia che richiama la stessa funzione sulla/e classe/i da cui deriva e successivamente salva i dati relativi alla sua istanza eventualmente presenti nella classe...
Si, in effetti adesso come adesso sto usando proprio questo tipo di approccio. Mi chiedevo però se esiste un metodo più furbo per fare in modo che ogni oggetto sappia già i dati che contiene, sia a livello di attributi "semplici" che di dati tipo "array", in modo da non essere obbligati a ridefinire per ogni classe la funzione che salva i dati e poterne scrivere una "universale" definita nella classe root della gerarchia.
Non so, forse è una fissazione dovuta alla proverbiale prigrizia del programmatore
killalot è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 12:22   #7
Kleidemos
Bannato
 
L'Avatar di Kleidemos
 
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
fammi capire..............

...tu intendi una funzione nella superclasse che salvi , senza essere ridefinita nelle derivate, tutto quello che ti serve?
Kleidemos è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 12:23   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originally posted by "killalot"

La cosa tutto sommato funziona, anche perchè diciamo che la complessità del progetto non è elevata, il fatto è che ogni volta che si operano dei cambiamenti nelle classi sottostanti occorre andare a modificare i metodi saveData()/loadData() della classe project, cosa che, oltre ad essere poco elegante, viola probabilmente anche qualche regola della programmazione ad oggetti .
Non so se mi sono spiegato abbastanza chiaramente...
Ti faccio un esempio:
Codice:
class atomo
{
   ... //dati privati
public:
   virtual void SaveData(ofstream &fs);
   virtual void LoadData(ifstream &fs);
   void SaveData();
   void LoadData();
};

void atomo::SaveData()
{ 
   ofstream file(FILENAME); //non so come tu voglia fare per ottenere il filename
   SaveData(file);
   file.close();
}

void atomo::SaveData(ofstream &fs)
{ 
   ...//Salvi i dati nel file
}

void atomo::LoadData()
{ 
   ifstream file(FILENAME); //non so come tu voglia fare per ottenere il filename
   LoadData(file);
   file.close();
}

void atomo::LoadData(ifstream &fs)
{ 
   ...//Carichi i dati nella classe
}

class molecola: public atomo
{
   ... //dati privati
public:
   virtual void SaveData(ofstream &fs);
   virtual void LoadData(ifstream &fs);
};

void molecola::SaveData(ofstream &fs)
{ 
   atomo::SaveData(fs); //salvo i dati della classe base
   ...//Salvi i dati nel file
}

void molecola::LoadData(ifstream &fs)
{ 
   atomo::LoadData(fs); //carico i dati della classe base
   ...//Carichi i dati nella classe
}

class project
{
   vector<molecola> m;
   vector<atomo> a;
public:
   virtual void Save();
   virtual void Load();
};

void project::Save()
{
   for(int i=0; i<m.size(); ++i)
      m[i].SaveData(); //puoi fare in questo modo

   ofstream file(FILENAME); //non so come tu voglia fare per ottenere il filename
   for(int i=0; i<a.size(); ++i)
      a[i].SaveData(file); //oppure in questo modo
   file.close();
}

void project::Load()
{
   for(int i=0; i<m.size(); ++i)
      m[i].LoadData(); //puoi fare in questo modo

   ifstream file(FILENAME); //non so come tu voglia fare per ottenere il filename
   for(int i=0; i<a.size(); ++i)
      a[i].LoadData(file); //oppure in questo modo
   file.close();
}
In questo modo se fai una modifica in qualsiasi classe dovrai rimettere mano solamente alla sezione di salvataggio e caricamento dei dati di quella classe aggiungendo id ati modificati...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 15:19   #9
killalot
Member
 
Iscritto dal: Mar 2002
Città: Trento
Messaggi: 215
Quote:
Originally posted by "cionci"


Ti faccio un esempio:
Codice:

In questo modo se fai una modifica in qualsiasi classe dovrai rimettere mano solamente alla sezione di salvataggio e caricamento dei dati di quella classe aggiungendo id ati modificati...
accidenti
grazie... in effetti è quello che attualmente tenta di fare il lio programma, in una maniera un po' più confusa .
Credo che in fin dei conti sia la cosa più ragionevole, dato che permette di aggiungere al programma tutte le funzionalità necessarie senza rimettere mano ogni volta al codice base, mantendendo al tempo stesso il controllo sui dati che vanno effettivamente salvati all'interno di ogni oggetto.
In effetti l'idea di un metodo "generale" all'interno della classe root che percorra automaticamente tutta la gerarchia degli oggetti non è poi così flessibile...
in ogni caso appena ho un po' di tempo mi metto al lavoro
intanto grazie a tutti
killalot è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 16:03   #10
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
La serializzazione del codice in Java e' relativamente semplice (basta implementare una interfaccia) visto che tutti i problemi vengono poi gestiti dalla Virtual Machine. In C++ il discorso e' decisamente piu' complicato. Per il salvataggio il problema principale e' che devi distinguere tra campi normali e puntatori, e il linguaggio non offre strumenti di introspezione per chiedere "dimmi quali campi e quali puntatori ha quella classe" per fare un salvataggio ricorsivo. La soluzione e' quindi quella mostrata da cionci, in cui ogni oggetto implementa una funzione di salvataggio virtuale da ridefinire. Per la lettura il problema e' ancora piu' grosso. Spesso infatti tu hai voglia di caricare solo un oggetto di cui sai la classe base, ma non la classe specifica. Un metodo per il caricamento tradizionale non va quindi bene.
Ad esempio
Codice:
class A{ 
  public:
  virtual void do_something(){ /*...*/ }
};
class B:public A
{
  public:
  void do_something() { /* ... */ }
};

A* a = "Leggi da stream l'oggetto";
a->do_something();
L'ideale sarebbe poter caricare un oggetto di tipo B "senza accorgersene".
In questo caso l'unica possibilita' e' creare una classe di appoggio che provveda a salvare il nome effettivo della classe prima dei chiamare il metodo ridefinito. Al momento della lettura poi questo nome viene letto e chiamato il costruttore adatto.Tempo fa ho fatto una cosa del genere e funzionava decorosamente.
Alternativa piu' semplice.... cercare qualcosa su internet . Materiale commerciale di sicuro ce n'e', gratuito non so.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 18:41   #11
killalot
Member
 
Iscritto dal: Mar 2002
Città: Trento
Messaggi: 215
Quote:
Originally posted by "/\/\@®¢Ø"


L'ideale sarebbe poter caricare un oggetto di tipo B "senza accorgersene".
In questo caso l'unica possibilita' e' creare una classe di appoggio che provveda a salvare il nome effettivo della classe prima dei chiamare il metodo ridefinito. Al momento della lettura poi questo nome viene letto e chiamato il costruttore adatto.
Chiaro. Forse un approccio alternativo potrebbe essere quello di utilizzare un formato dati basato su XML con relativo parser... sto sparando perchè non me ne intendo un granchè di XML
killalot è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2003, 19:52   #12
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Il problema e' proprio il parser, visto che sintassi piu' complicate di quella del C++ non se ne trovano .
Una volta che si ha la lista dei campi da salvare e dei puntatori generare il codice non e' una impresa impossibile. Si potrebbe pure stabilire un back-end diverso a seconda delle esigenze (salvataggio in xml per scambiarsi i dati, byte "grezzi" per migliori performances etc..)
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
L’ex CEO di Intel Gelsinger punta su una...
Techly, quattro nuovi supporti TV fra mo...
Mass Effect sacrificato per Star Wars: i...
Gemini, addio al copia e incolla per cor...
13 miliardi per un colpo di stato? NVIDI...
L'agente AI Wabi crea mini-app su misura...
Edge è il primo browser a supportare Acc...
L'IA di Firefox ora compila i moduli da ...
Tracking pixel nelle email: cosa cambia ...
La GeForce RTX 5080 da 24 GB potrebbe ar...
Apple mette alle strette OpenAI, la caus...
Xbox ancora in calo: ecco com'è a...
Car of the Year 2027: sette finaliste e ...
Google Beam cambia tutto: arrivano le vi...
Curry Barker, il regista di Obsession, p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:58.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v