Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-10-2008, 12:58   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
[C#/Db qualsiasi]Consigli su progettazione

Buongiorno a tutti

Allora, ho il classico problema di un'applicazione windows forms.

Vorrei capire come gestire le operazioni sul database in maniera pulita.

Mi spiego:

In genere io per ogni tabella che ho sul database, mi creo una classe:

Codice:
//Tabella Anagrafica del db:
cognome
nome
telefono
etc..

//Classe Anagrafica.cs
private string cognome;
private string nome;
private string telefono;

//valorizzo i campi mediante proprietà nella classe:
public String Cognome
{
    get { return cognome; }
    set { cognome = value; }
}
//blabla
Adesso, devo prendere i valori dal mio form ed inserirli sul database;
generalmente anche per le operazioni sul database uso una classe separata e, ad ogni modo, non uso mai inserire direttamente i valori presi dalle varie textbox ma utilizzo (a prescindere dal db) dei sql parameters.

Quindi in genere le operazioni che faccio sono:

Codice:
//dal form che contiene le varie textbox:
ClasseAnagrafica anagrafica = new ClasseAnagrafica();
anagrafica.Cognome = txtCognome.text;

//blabla
Fatto questo, istanzio poi la classe che contiene i metodi per le operazioni sul db e inizializzo i sql parameter:

Codice:
DbClass db = new DbClass();
SqlParameter cognome = new SqlParameter("@cognome", DbType.String);
cognome.Value = anagrafica.Cognome;

//etc...
Come potrete vedere, il tutto risulta un guazzabuglio orribile e credo poco efficace.

Per favore, datemi qualche consiglio su come iniziare a fare le cose in maniera pulita

Potrei fare tutto nel form dove risiedono i miei oggetti, ma come mi hanno suggerito più volte un form è solo un contenitore e non è pratico infarcirlo di metodi.

Grazie mille.

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2008, 09:00   #2
Einstein
Senior Member
 
L'Avatar di Einstein
 
Iscritto dal: Jan 2000
Città: Provincia di Parma
Messaggi: 724
Il discorso è parecchio ampio...
La prima cosa che ti consiglio di fare separare bene le responsabilità e "stratificare" l'applicazione: un assembly per gli oggetti di dominio, in modo da poterlo referenziare comodamente negli altri layers, un assembly per l'accesso ai dati (Data Access layer o DAL) e l'assembly principale dell'applicazione.
Il tuo oggetto Persona sarà quindi definito dell'assembly degli oggetti di dominio (Domain Model), in questo modo:

Codice:
public class Persona
{
    public Persona() {}

    public int Id;
    public string Nome;
    public string Cognome;
}

Tutti i metodi del DAL restituiranno delle istanze di oggetti di dominio oppure List<domainobject> nel caso di collection di oggetti.
Nel DAL puoi utilizzare il pattern Table Data Gateway, in modo da avere una classe che ti gestisca la logica CRUD (Create, Read, Update, Delete) per ogni singola tabella del db. Un'ipotetica classe di DAL che accede all'anagrafica potrebbe avere i seguenti metodi:

Codice:
Persona GetById(int idPersona)
List<Persona> GetAll()
int Insert(Persona persona)
int Update(Persona persona)
int Delete(Persona persona)
La tua logica applicativa puo risiedere nell'assembly dell'applicazione (Presentation Layer), oppure in un apposito assembly di application logic, che ti permetterebbe di avere la logica applicativa non legata ad uno specifico tipo di interfaccia.
Qualche link su questi concetti:

Domain Model: http://martinfowler.com/eaaCatalog/domainModel.html
Table Data Gateway: http://martinfowler.com/eaaCatalog/t...taGateway.html
Service Layer: http://martinfowler.com/eaaCatalog/serviceLayer.html

Spreo di essere stato abbastanza chiaro: l'argomento è vasto ed esistono quintali di letteratura riguardante l'architettura delle applicazioni e il software design.
Infine un consiglio: non sforzarti a fare tutto nella maniera più "pulita" solo perché fa "fico". Visto che il design di un'architettura può portarti via diverso tempo, tienine conto, visto che l'applicazione, prima o poi, dovrai consegnarla...
__________________
My Pc: Case Enermax Chakra - PSU Corsair HX520 - Gigabyte P35-DS3R - Core2 Duo E6550 - 6 Gb RAM Geil PC800 - 2x WD Caviar SE 320Gb (Raid1) - Xfx GeForce 8600Gt - Master Pioneer DVR111D - Samsung SM T220 - S.O. Windows 7 Ultimate x64 SP1
My blog: http://blogs.ugidotnet.org/alby
Einstein è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2008, 09:15   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Grazie Einstein

Sei stato chiarissimo.

Fortunatamente non ho pressione sui tempi di consegna (non essendo io un programmatore di professione).

E' solo che mentre sviluppo (per hobby o per conto di qualche amico che richiede software senza pretese) mi vengono sempre mille dubbi e mi faccio sempre mille domande. Certe volte mi chiedo addirittura se abbiano senso.

Ma, vedendo il codice che viene fuori man mano, a 'orecchio' mi rendo conto che è sbagliato. Di preciso non saprei neanche dirti io il perchè, ma intuisco che, seppure ottengo il risultato desiderato, l'ottengo per strade lunghe e tortuose

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2008, 15:01   #4
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Un altro dubbio....:

generalmente i forms sono molto diversi fra loro e contengono anche oggetti diversi (combobox, checkbox, griglie, textbox, etc..)

Al punto in cui sono, non riesco a vedere un modo "complessivo" per scrivere una classe che abbia metodi comuni a tutti, se non per le operazioni sul db ma, anche qui, i dati da inserire/aggiornare, sono sempre diversi.

Al momento posso quindi solo semplificare e adattare le mie conoscenze attuali.

Chiedo quindi una cosa:

E' saggio/giusto avere per ciascun form il suo modo di scrivere/leggere i dati ?

Faccio un esempio:

Creo una lista direttamente dalla classe del form:

Codice:
List<string> anagrafica = new List<string>();

anagrafica.Add(txtCognome.Text);
anagrafica.Add(txtNome.Text);

//bla
//su un altro form avrò altri dati... quindi:
List<double> pagamenti = new List<double>();
pagamenti.Add(double.Parse(txtBolloAuto.Text);
pagamenti.Add(double.Parse(txtAssicurazioni.Text);

//blabla
C'è da considerare però che queste due liste diverse, riferite all'interazione dell'utente sui rispettivi forms, hanno un elemento in comune:

id_anagrafico (per esempio).

Mi fermo qui

Grazie mille.

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2008, 08:56   #5
Einstein
Senior Member
 
L'Avatar di Einstein
 
Iscritto dal: Jan 2000
Città: Provincia di Parma
Messaggi: 724
Non ho capito bene il tuo dubbio... Perché crei liste (di stringhe) direttamente dall'interfaccia?
__________________
My Pc: Case Enermax Chakra - PSU Corsair HX520 - Gigabyte P35-DS3R - Core2 Duo E6550 - 6 Gb RAM Geil PC800 - 2x WD Caviar SE 320Gb (Raid1) - Xfx GeForce 8600Gt - Master Pioneer DVR111D - Samsung SM T220 - S.O. Windows 7 Ultimate x64 SP1
My blog: http://blogs.ugidotnet.org/alby
Einstein è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2008, 09:24   #6
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Einstein Guarda i messaggi
Non ho capito bene il tuo dubbio... Perché crei liste (di stringhe) direttamente dall'interfaccia?
Ciao

Cerco di spiegarmi meglio:

Sono arrivato a questa soluzione:

Form -> Classe che si occupa di ricevere i dati del form -> Classe operazioni db;

Ma, in considerazione del fatto che un form è una classe come tutte le altre, non sarebbe meno dispendioso :

Form -> Classe operazioni db ?

Grazie mille

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2008, 15:37   #7
Einstein
Senior Member
 
L'Avatar di Einstein
 
Iscritto dal: Jan 2000
Città: Provincia di Parma
Messaggi: 724
Secondo me, hai due possibilità:

1. Dalla form invochi dei metodi di logica applicativa (che magari risiedono in un assembly separato) che si preoccupano poi di interagire con il db. La tua applicazione quindi non "vede" direttamente il db.

2. Aggiungi un riferimento al DAL nella tua applicazione, quindi le tue forms invocheranno direttamente i metodi del DAL.

Secondo me la "Classe che si occupa di ricevere i dati del form" non ha molto senso.
Ovviamente non conosco il contesto esatto del tuo applicativo, quindi potrei sbagliarmi...
__________________
My Pc: Case Enermax Chakra - PSU Corsair HX520 - Gigabyte P35-DS3R - Core2 Duo E6550 - 6 Gb RAM Geil PC800 - 2x WD Caviar SE 320Gb (Raid1) - Xfx GeForce 8600Gt - Master Pioneer DVR111D - Samsung SM T220 - S.O. Windows 7 Ultimate x64 SP1
My blog: http://blogs.ugidotnet.org/alby
Einstein è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2008, 08:58   #8
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Einstein Guarda i messaggi
Secondo me, hai due possibilità:

1. Dalla form invochi dei metodi di logica applicativa (che magari risiedono in un assembly separato) che si preoccupano poi di interagire con il db. La tua applicazione quindi non "vede" direttamente il db.

2. Aggiungi un riferimento al DAL nella tua applicazione, quindi le tue forms invocheranno direttamente i metodi del DAL.

Secondo me la "Classe che si occupa di ricevere i dati del form" non ha molto senso.
Ovviamente non conosco il contesto esatto del tuo applicativo, quindi potrei sbagliarmi...
E' proprio su questi punti che mi sono arenato.

Ho trovato una marea di documentazione in rete, ma sinceramente mi è servita più che altro ad aumentare la mia confusione

Un esempio di DAL abbastanza chiaro e alla portata di un newbie dove potrei trovarlo ?

Grazie mille.

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Lo compri una volta, lo giochi dove vuoi...
Qiantinuum annuncia Helios, "il com...
Samsung Galaxy S26 Ultra: una sola novit...
Google prepara Gemini 3 Pro e Nano Banan...
TVS non è solo moto e scooter: ec...
Alexa+ arriva su BMW: gli automobilisti ...
Gemini Deep Research arriva su Google Fi...
Rinvii a catena, Marvel 1943: Rise of Hy...
Xiaomi inaugura uno spazio dedicato ai f...
Rilasciate le specifiche di Bluetooth 6....
L'obiettivo che mette tutto a fuoco: la ...
Meta avrebbe raccolto fino al 10% dei ri...
NVIDIA DGX Spark e videogiochi? Una pess...
Serie Oppo Reno15 confermata: arriva il ...
UPDF 2025: l'editor PDF che fa (quasi) t...
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: 22:26.


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