Oppure

Loading
01/02/11 11:56
Jolly
Ciao a tutti.
Vorrei chiedere il vostro supporto per impostare la struttura base di una applicazione e per alcuni passaggi che mi sono poco chiari.

Premetto che me la cavo abbastanza bene con la sintassi del codice, però malgrado lo studio di diversi manuali, e la ricerca su vari forum,
ancora non mi è chiaro come impostare IN MODO CORRETTO la struttura globale delle applicazioni, sia in termini di utilizzo di classi, moduli, ecc.,
sia riguardo la gestione di alcune funzionalità, come ad esempio la validazione dei dati, la gestione della concorrenza sull'accesso ai dati, e
altre funzioni che andrò a chiarire (e a chedervi) più avanti.

So cos'è una classe, un modulo, e tutto il resto, quindi non vorrei parlare di questo; vorrei invece confrontarmi sulle pratiche migliori per utilizzare questi costrutti e come farlo concretamente e senza errori grossolani di struttura.
In pratica vorrei che la mia applicazione non si limitasse a funzionare e fare quello che deve fare, ma che fosse anche scritta bene!


LA MIA PROPOSTA:
Per fare un buon lavoro sia per me che per chi potrà aver bisogno di queste info, ho pensato di immaginare di costruire in questo post (con il vostro aiuto),
una applicazione elementare, che però rispetti passo passo il corretto approccio allo sviluppo delle funzionalità necessarie.

Proporrei la solita classica applicazione, Clienti-Ordini, che gestisca anche l'accesso di diversi utenti con diversi permessi sull'applicazione e possibilmente sul menù.

Quindi l'applicativo dovrà avere una form iniziale di login, una MainForm MDI con un piccolo menù, e le form per l'inserimento, cancellazione e aggiornamento dei dati anagrafici dei clienti, dei dati sui prodotti, e infine una form dove poter associare ai clienti le ordinazioni dei prodotti.
L'ultima form mi consentirà di aggiungere gli utenti utilizzatori della mia applicazione, con diversi livelli di abilitazione.


Userei un database access, dato che l'applicazione non è molto complessa, e ci saranno cinque tabelle: "AnagraficaClienti", "AnagraficaProdotti",
"Ordini", la tabella "Utenti" e la tabella "Autorizzazioni" per gestire, tra gli utenti, chi può fare cosa;

AnagraficaClienti avrà 3 colonne: ID (chiave primaria e autoincrementante), "NomeCliente" (testo), "Indirizzo" (testo)

AnagraficaProdotti avrà 3 colonne: ID (chiave primaria e autoincrementante), "DescrizioneProdotto"(testo), "QuantitaDisponibile"(Numerico)

Ordini avrà 4 colonne: ID (chiave primaria e autoincrementante), "IdCliente"(Numerico), "IdProdotto"(Numerico), "DataOrdine"(Data)

La tabella "Utenti" avrà 4 colonne: ID (chiave primaria e autoincrementante), "NomeUtente"(testo), Password(Testo), "IdAutorizzazione"(Numerico)

Infine la tabella "Autorizzazioni" avrà 4 colonne: ID (chiave primaria e autoincrementante), "IdUtente", "DescrizioneAbilitazione", "OkInserimento",
"OkAggiornamento", "OkCancellazione"


Vorrei fermarmi a questo punto per potervi chiedere se secondo voi fin qui tutto bene, o se avreste fatto scelte e considerazione diverse, e cominciare con alcune domande, in modo da non spingerci oltre con lo sviluppo senza prima esserci accertati di essere ancora sulla buona strada.

Domanda 1: E' necessario, utile e corretto, creare una classe per ogni entità che dovrò gestire con la mia applicazione?
Se Sì, creeremo 4 classi: Clienti, Prodotti, Ordini, Utenti, ognuna con le sue proprietà.

Per la gestione del menù, immaginando che la nostra applicazione fosse un po' più complessa di come in realtà è, potremmo implementare un binding con una ulteriore tabella nel database (ad esempio una Tab_Menù che contenga le voci del menù e dei sottomenù;); come la implementereste? Dovremmo creare una qunta classe "Menu"per tenere sotto controllo la gestione del suddetto menù o lo fareste da codice della mainForm?
Come potremmo gestire lo stato enabled/disabled di alcune voci di menù a seconda dell'utente loggato?

Ultima domanda (per ora): conviene (ed è formalmente più corretto) implementare una classe a se stante per la gestione dello scambio dati con il database?
E' preferibile usare un modulo?
E' meglio implementare le funzioni "Aggiungi", "Aggiorna" "Elimina" sia dei clienti che degli ordini, che degli utenti, direttamente nel codice delle relative form oppure all'interno di una classe/modulo separati, o ancora all'interno delle classi stesse che già rappresentano gli oggetti (intendo ad esempio che ogni classe come "Clienti" possa esporre delle funzioni di Inserimento, Aggiornamento, Cancellazione)


E' un post lungo, che non finisce qui, e un po' ambizioso: definire insieme le procedure formalmente migliori per sviluppare una applicazione.
Vorrei dire che ho letto diverse cose in giro in termini di pattern di sviluppo come MVC o MVVM, ma quello che sto cercando qui con voi non è un pattern standard e indiscutibile, ma piuttosto un approccio semplificato alla gestione dei vari pezzi di codice, e cercare di chiarirsi sul perchè di alcune scelte piuttosto che altre.

Spero che interessi e di avere il vostro feedback. Alla prox. puntata!

Ciao
aaa
01/02/11 14:34
TheKaneB
La tua richiesta è tanto legittima quanto complessa.

Io stesso ho imparato a costruire "correttamente" un'applicazione complessa soltanto tramite lo studio di diversi manuali di software engineering (ti consiglio in tal proposito "Ingegneria del Codice" di Steve McConell) e, soprattutto, grazie a 4 anni di lavoro in team di piccola-media grandezza (da 5 a 40 programmatori) per la realizzazione di prodotti commerciali.

L'approccio che hai scelto è corretto, ma non lo è il "mezzo" cioè il forum.

Se vuoi una mano concreta serve un supporto più "discorsivo" (sarebbe ideale lavorare fisicamente nella stessa stanza), ma possiamo accontentarci della Chat del sito se vuoi.

Vieni a trovarmi in chat, sono spesso lì, e magari potrai aggiornare il post con i tuoi progressi man mano che lo vai sviluppando, con l'aiuto mio e di altri esperti della community.

Ciao :-)
aaa