Newsgroup: it.comp.java
Titolo: Consiglio su stile di programmazione

Non è molto che programmo, e mi manca la visione di insieme di un
programma... sto sviluppando un'applicazione che ha un numero impressionante
di costanti e tabelle fisse (non database), tanto che non so più dove
metterle.
All'inizio avevo messo un po' di final static in una classe Tabella, poi le
costanti più specializzate le ho messe in classi apposite (es. Materiale,
con tutte le costanti che hanno a che fare con i materiali) ma ho paura che
il design fatto così sia un po' confuso, se ripreso in mano tra un po' di
mesi...
Qualche consiglio?
Grazie
Wil

 Wil
Senza conoscere i problemi specifico e' difficile consigliare.
per prima cosa metterei le costanti in un file XML,
poi sciverei un classe che implementa una struttura tipo dizionario
(Map), magari a piu' livelli,
che si "auto-costruisce" leggendo il file XML.
Questo ti da grande flessibilita' e ti evita la ricompilazione se devi
aggiungere o cambiare un costante.
La classe dovrebbe avere die metodi "get" abbastanza potenti, senza
conoscere il problema (mi ripeto) e' difficile consigliare. 
Dipende se puoi prevedere durante a design-time il numero dei livelli
che il dizionario deve avere, mantenendolo fisso per sempre, oppure voiu
rimanere flessibile.
Inoltre questa classe dovrebbe essere una Singleton (non consentire + di
una sola instanza).
Qualche cosa di carino l'ho visto in articolo di Martin Fowler con la
classe Registrar vedi:
http://www.martinfowler.com/apsupp/appfacades.pdf
Anche se non corrisponde esattamente al tuo caso.
Ciao
jock

 Wil
Senza conoscere i problemi in profondita' e' difficile consigliare.
Per prima cosa metterei le costanti in un file XML,


 
Ciao,
dai un'occhiata al typesafe enum pattern
http://developer.java.sun.com/developer/Books/effectivejava/Chapter5.pdf
(item21: replace enum construct with classes)
Io lo uso sempre quando ci sono da definire delle costanti.
Marco
-- 
replay: remove .duh.spam
http://web.ticino.com/cthulhu/

 Qualche consiglio?
senza entrare nel merito di dove mettere le costanti perché francamente
sulla base di quello che hai detto non saprei, ti suggerisco di non
sottovalutare la documentazione. Finché hai ben chiaro in testa come é
strutturato il programma e perché hai fatto certe scelte scrivi il javadoc
e tutto quello che ti viene in mente (diagrammi UML, automi, descrizioni in
italiano...). Una buona documentazione ti permette di rimettere le mani su
un programma di cui ti sei dimenticato tutto.
Se quando stai programmando pensi che sia inutile ti garantisco che anche
pochi mesi dopo te ne penti :)
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://noitre.ilnomedeldominio.it
un piccolo programma per studenti universitari:
nuova versione!!!! provatelo numerosi
http://inutility.ilnomedeldominio.it/imsv/

> Senza conoscere i problemi in profondita' e' difficile consigliare.
Allora tento di spiegarmi un po' meglio...
Il 90% delle costanti sono array bidimensionali di interi o float, del tipo:
private final static int[][] aggeggiEffetto;
private final static String[] nomeAggeggio = { "aggeggio1", "aggeggio2",
...};
private final static int NUMERO_AGGEGGI = 15;
private final static int AGGEGGIO1 = 0;
private final static int AGGEGGIO2 = 1;
...
private final static String[] nomeEffetto = { "effetto1", "effetto2", ...};
private final static int NUMERO_EFFETTI = 5;
private final static int EFFETTO1 = 0;
...
Spesso il problema è che gli Aggeggi o gli Effetti servono anche per altre
tabelle, quindi:
1) o facevo una classe Tabella che contiene tutto per evitare errori nella
scrittura del codice e nell'aggiornamento, ma ad un certo punto finisco i
nomi
2) o facevo la classe Aggeggio e la classe Effetto per mantere i valori ed
evitare collisioni dei nomi, ma poi per aggiornare le tabelle e i campi
diventa un inferno
L'idea di mettere tutto in file separato è ottima, così effettivamente può
essere solo aggiornato il file delle costanti senza ricompilare tutto, ma:
1) ho bisogno anche di un certo grado di segretezza, non voglio che i dati
delle tabelle siano visibili
2) devo essere in grado di aggiornare, correggere e espandere le tabelle
anche dopo la fase di sviluppo
3) la consultazione deve essere quanto di più veloce possibile, poichè verrà
effettuata migliaia di volte
Spero di essermi spiegato meglio, cmq mille grazie per i consigli!
Wil

 (item21: replace enum construct with classes)
Ho letto a fondo il paragrafo e ci ho riflettuto abbastanza... ma mi
piacerebbe rifletterne ancora con voi, se vi interessa. Ci provo...
L'idea dei typesafe enum pattern non è per niente male, per cui ho pensato
di provare ad applicarla per le costanti, però si apre una questione per le
tabelle, finora gestite con array di dati primitivi.
Supponendo che io abbia la classe Materiali e la classe TipoDiDanno, ognuna
con nomi e id delle costanti, potrei gestire la tabella Materiali x
TipoDiDanno (che mi ritorna il valore di protezione) con una classe
MaterialiDanno con un pattern simile... seguendo sempre la stessa
convenzione per i nomi se un giorno mi trovo ad aggiornare i Materiali mi
basterebbe aggiornare solo le classi che hanno "Materiali" nel nome, tipo
MaterialiPeso, o ArmaMateriali. Inoltre buttando tutte queste classi in un
package, se dovessi aggiornare le costanti dopo la fase di sviluppo mi
basterebbe aggiornare solo il package...
Però penso... ad ogni tabella gestita con un typesafe enum pattern (simile)
si accederebbe con una metodo publlico tipo get(classA a, classB b), il che
rallenterebbe di molto l'esecuzione rispetto ad un array di interi, almeno
credo. Quindi più sicurezza e versatilità a scapito di rapidità... uhmm...
che ne pensate? non vi chiedo la soluzione di un problema, solo di parlarne
e imparare da differenti punti di vista.
Wil

 effettuata migliaia di volte
Vedi sopra


 Wil
Personalmente ti suggerisco di seguire i consigli di jock; non ha senso
specificare tutti i valori tramite costanti all'interno del programma.
Marco
-- 
replay: remove .duh.spam
http://web.ticino.com/cthulhu/
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it