Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-10-2008, 11: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, 08: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, 08: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, 14: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, 07: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, 08: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, 14: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, 07: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


Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
Il satellite LINK è rientrato nel...
L'ESA risponde alle critiche di Jared Is...
La NASA annuncia il nuovo telescopio spa...
HONOR pubblica The Sea Between Us, un co...
L'Olanda punta su NixOS e open source pe...
OPPO Find X10 Pro Max, il flagship con t...
Gli smartphone Samsung potrebbero avere ...
GeForce Now arriverà sui Googlebo...
Opus 5.5 e GPT-6 Sol nello stesso pomeri...
Weekend Amazon, le prime 5 offerte sono ...
Mini Compressore a 21,84€: gonfia le gom...
Gemini si aggiorna, ora può conne...
Da 32 a 65 pollici: ecco le TV più...
Xiaomi Redmi Note 17 a 269€: ecco perch&...
ASUS avverte i clienti: accesso non auto...
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: 21:09.


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