Visualizzazione dei risultati da 1 a 9 su 9

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Voglio essere sincero e onesto: il tuo codice è parecchio "fumoso" e ci sono svariate cose che sono inappropriate e per niente belle.
    Il problema non è una variabile volatile ......
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Voglio essere sincero e onesto: il tuo codice è parecchio "fumoso" e ci sono svariate cose che sono inappropriate e per niente belle.
    Il problema non è una variabile volatile ......

    ti sarei grato se specificassi cosa non ti piace o non va

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    ti sarei grato se specificassi cosa non ti piace o non va
    Oh certo ... ma l'elenco è lungo (e non sarò sicuramente esaustivo al 100%):

    - il codice non è completo ma dai metodi si deduce che SWListaOperatori è uno SwingWorker. SWListaOperatori contiene una inner-class SWInviaAppuntamento che è di nuovo uno SwingWorker (di per sé tecnicamente nulla di sbagliato ma è perlomeno strano/inusuale). Nel doInBackground di SWInviaAppuntamento c'è una anonymous inner class per un Runnable. Nel suo run() ad un certo punto c'è una ulteriore anonymous inner-class per un WindowAdapter. Quando si arriva ad un tale livello di annidamento con pure tutti i vari blocchi if/try in mezzo, dovrebbe suonarti un campanello di allarme .... un grosso campanello ...

    - in questo codice usi di tutto e di più: da SwingWorker, ai thread, alla sincronizzazione con synchronized, all'uso di volatile, all'uso della condition-queue "intrinseca" (il wait/notify sugli oggetti). Dubito che quello sia l'unico modo per fare quello che volevi ma anche se fosse davvero tutto necessario, così è comunque un po' sparpagliato e fumoso.

    - nel primo doInBackground non si capisce assolutamente che cosa si ottiene. Cosa conterrà quel ArrayList<Object>? Che colonna (e di che tipo) prendi con getObject(1) ? Solo tu lo sai ....
    Manca di chiarezza.

    - sempre in questo doInBackground il close non viene fatto sempre. Se next() o getObject() lanciano SQLException, tu non chiudi nulla. Manca di correttezza nella gestione delle eccezioni.
    E anche se facessi tutto corretto con le eccezioni, tutta la logica di query ed estrazione dal result-set andrebbe fatta in una classe separata.

    - guardando le invocazioni sulla istanza di Database, sembrano un po' una accozzaglia di operazioni ben diverse. Evita di fare una classe "Database" che fa di tutto e di più. Avresti potuto/dovuto applicare almeno il pattern DAO, per risolvere anche quanto detto al punto precedente.

    - Database.getInstance().updateField(10, 1, Integer.toString(cliente.getId_cliente()), (String) userOperatore, GestoreDatabase.Tabella.CLIENTE);
    Non è un buon modo di fare un update di uno o più campi. Tra l'altro "sembra" un metodo molto generico/arbitrario e quindi poco comprensibile. Cosa sono ad esempio 10 e 1 ? Solo tu lo sai ....

    - nel run() del tuo thread vai ad accedere alla interfaccia utente. Non sei nel contesto del EDT, tutto quello che fai con JOptionPane, setVisible(true) ecc... è tutto inappropriato.

    - nel run() comunque c'è un mix di accesso a database, interfaccia grafica, wait/notify. Tutto potenzialmente molto dubbio (fumoso sicuramente).

    - fai un synchronized su schedaCliente che è un oggetto GUI. Per quanto ne so, non c'è nulla di intrinsecamente (e tecnicamente) errato nell'usare oggetti GUI come "lock". Ma personalmente io non lo farei mai nemmeno se mi pagate il doppio del mio stipendio ....

    E mi sono limitato solo alle cose più evidenti ....
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Database.getInstance().updateField(10, 1, Integer.toString(cliente.getId_cliente()), (String) userOperatore, GestoreDatabase.Tabella.CLIENTE);
    Non è un buon modo di fare un update di uno o più campi. Tra l'altro "sembra" un metodo molto generico/arbitrario e quindi poco comprensibile. Cosa sono ad esempio 10 e 1 ? Solo tu lo sai ....

    Per quanto riguarda la classe database al suo interno i metodi sono commentati e hanno la javadoc, comunque si è un metodo generico e a dire il vero non ci vedo nulla di male null'utilizzarlo.


    Quote Originariamente inviata da andbin Visualizza il messaggio

    - guardando le invocazioni sulla istanza di Database, sembrano un po' una accozzaglia di operazioni ben diverse. Evita di fare una classe "Database" che fa di tutto e di più. Avresti potuto/dovuto applicare almeno il pattern DAO, per risolvere anche quanto detto al punto precedente.


    grazie per questo consiglio , purtroppo è un corso introduttivo a java e non sapevo nemmeno l'esistenza di questo pattern, non è tra gli argomenti del corso , almeno adesso so che esiste

    Quote Originariamente inviata da andbin Visualizza il messaggio

    - il codice non è completo ma dai metodi si deduce che SWListaOperatori è uno SwingWorker. SWListaOperatori contiene una inner-class SWInviaAppuntamento che è di nuovo uno SwingWorker (di per sé tecnicamente nulla di sbagliato ma è perlomeno strano/inusuale). Nel doInBackground di SWInviaAppuntamento c'è una anonymous inner class per un Runnable. Nel suo run() ad un certo punto c'è una ulteriore anonymous inner-class per un WindowAdapter. Quando si arriva ad un tale livello di annidamento con pure tutti i vari blocchi if/try in mezzo, dovrebbe suonarti un campanello di allarme .... un grosso campanello ..

    Non mi pare di aver letto da nessuna parte che non si possano annidare classi oltre un certo livello, e' una regola?

    Quote Originariamente inviata da andbin Visualizza il messaggio

    sempre in questo doInBackground il close non viene fatto sempre. Se next() o getObject() lanciano SQLException, tu non chiudi nulla. Manca di correttezza nella gestione delle eccezioni.
    E anche se facessi tutto corretto con le eccezioni, tutta la logica di query ed estrazione dal result-set andrebbe fatta in una classe separata.


    mmmm su questo sono d'accordo con te dovrei farlo stesso nella classe database o creare una classe a parte?
    Quote Originariamente inviata da andbin Visualizza il messaggio

    - nel primo doInBackground non si capisce assolutamente che cosa si ottiene. Cosa conterrà quel ArrayList<Object>? Che colonna (e di che tipo) prendi con getObject(1) ? Solo tu lo sai ....
    Manca di chiarezza.
    Anche in questo caso il metodo è commentato e spiega cosa contiene quell'array di ritorno

    Comunque le critiche purchè costruttive sono sempre accettatissime
    Ultima modifica di linux_r; 13-07-2014 a 10:11

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    comunque si è un metodo generico e a dire il vero non ci vedo nulla di male null'utilizzarlo.
    No, non è comunque un "buon" modo.

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Non mi pare di aver letto da nessuna parte che non si possano annidare classi oltre un certo livello, e' una regola?
    Sì ... del "buon senso".

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Anche in questo caso il metodo è commentato e spiega cosa contiene quell'array di ritorno
    Ammetto che quando ho letto il tuo codice, mi sono concentrato sul codice ... e non sui commenti.
    Ma se sono nomi .... allora perchè "Object" ?
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    perchè magari un giorno sarebbe potuto cambiare il campo del database , ho messo object per non dover poi modificare il codice

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    perchè magari un giorno sarebbe potuto cambiare il campo del database , ho messo object per non dover poi modificare il codice
    Allora metti un generico T, no?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    giacchè comuqnue l'argomento si è spostato sulla programmazione java vorrei chiederti una cosa. "uno stream è un flusso di dati, un oggetto dal quale si può leggere una sequenza di byte prende nome di input stream , mentre un oggetto nel quale si può scrivere una sequenza di byte prende nome di output stream o sink stream. Vengono detti nodi di stream i file , le memorie e pipe tra thread o processi. Source stream e sink stream sono entrambi dei node streams-."
    Cosa ne pensi di questa definizione ? la trovi corretta?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.