Distruzione oggetto java in sequence diagram UML

di il
7 risposte

Distruzione oggetto java in sequence diagram UML

Ciao a tutti! Spero di non aver sbagliato sezione ma ho visto altri post di UML relativi a java pubblicati in questa sezione.
Cerco di spiegarvi meglio il mio quesito:
Ho un applicazione java che gestisce dei clienti memorizzati su un database. Consideriamo il caso dell'inserimento di un nuovo cliente.
Le classi che utilizzo per l'inserimento sono 2:

-Una classe Controller con il metodo inserisci che riceve in input delle stringhe (nome,cognome ecc...), crea un oggetto Cliente ed invoca il metodo inserisci della classe DAO (descritta di seguito)
-Una classe DAO con il metodo inserisci che riceve in input un oggetto Cliente ed effettua l'inserimento nel database

Entrambi i metodi inserisci (di Controller e DAO) restituiscono true se l'inserimento è andato a buon fine, false altrimenti.
Volendo disegnare il sequence diagram relativo all'inserimento di un nuovo cliente vorrei capire una cosa: quando viene invocato il metodo inserisci del Controller, questo crea un oggetto Cliente ed invoca il metodo inserisci del DAO. Una volta che il metodo del DAO termina, vorrei capire se anche quello del Controller termina subito dopo oppure se prima di terminare il Controller deve distruggere (mi riferisco dempre al sequence diagram) l'oggetto Cliente precedentemente creato.
Cerco di porla anche in un altro modo: cosa accade effettivamente durante l'esecuzione? Quando il metodo inserisci del Controller termina, l'oggetto Cliente viene distrutto subito o semplicemente rimane privo di riferimenti e viene poi liberato dal garbage collector?

Spero di essere stato chiaro ma nel caso non lo fossi stato non esitate a chiedere! Grazie a tutti in anticipo

7 Risposte

  • Re: Distruzione oggetto java in sequence diagram UML

    spx ha scritto:


    -Una classe Controller con il metodo inserisci che riceve in input delle stringhe (nome,cognome ecc...), crea un oggetto Cliente ed invoca il metodo inserisci della classe DAO (descritta di seguito)
    -Una classe DAO con il metodo inserisci che riceve in input un oggetto Cliente ed effettua l'inserimento nel database
    Fin qui mi sembra tutto ben ragionevole.

    spx ha scritto:


    Entrambi i metodi inserisci (di Controller e DAO) restituiscono true se l'inserimento è andato a buon fine, false altrimenti.
    Per carità .. non è sbagliato in assoluto ragionare in termini di valori di ritorno true/false. Ma generalmente non si fa. In Java si ragiona con le eccezioni.

    spx ha scritto:


    quando viene invocato il metodo inserisci del Controller, questo crea un oggetto Cliente ed invoca il metodo inserisci del DAO. Una volta che il metodo del DAO termina, vorrei capire se anche quello del Controller termina subito dopo oppure se prima di terminare il Controller deve distruggere (mi riferisco dempre al sequence diagram) l'oggetto Cliente precedentemente creato.
    Cerco di porla anche in un altro modo: cosa accade effettivamente durante l'esecuzione? Quando il metodo inserisci del Controller termina, l'oggetto Cliente viene distrutto subito o semplicemente rimane privo di riferimenti e viene poi liberato dal garbage collector?
    Partiamo da un aspetto: in Java il recupero della memoria degli oggetti non più utilizzati è "automatico". Non è il programmatore che può chiedere di eliminare subito un oggetto, non esiste un equivalente della free() del "C". E' il garbage collector che si occupa di questo.

    Quando è che un oggetto viene preso in considerazione dal g.c.? Lo si può dire in modo semplice: un oggetto diventa "eleggibile" per il garbage collection quando non è più "raggiungibile". Attenzione, che si parla di raggiungibilità, non di essere solo referenziato.
    Due oggetti possono referenziarsi reciprocamente tra di loro ed essere entrambi NON raggiungibili. In questo caso il g.c. è perfettamente in grado di reclamare entrambi gli oggetti.

    Il concetto di raggiungibilità non è difficile. Se a partire da una serie di "radici" NON è possibile tracciare un cammino che porta direttamente/indirettamente ad un oggetto, allora quell'oggetto non è raggiungibile. Altrimenti, se è raggiungibile, il g.c. non lo può/deve toccare in alcun modo. Le radici di cui ho parlato sono, per dirlo semplicemente, sicuramente le seguenti: tutte le variabili reference allocate sugli stack-frame negli stack dei thread e tutte le variabili reference "di classe" (static) delle classi.

    P.S. ci sarebbe altro da dire, magari con qualche esempio ma non ho purtroppo tempo ora di andare oltre. Vediamo innanzitutto se ti è chiaro quanto appena detto.
  • Re: Distruzione oggetto java in sequence diagram UML

    Ciao andbin e grazie mille della dettagliata risposta.

    andbin ha scritto:


    Per carità .. non è sbagliato in assoluto ragionare in termini di valori di ritorno true/false. Ma generalmente non si fa. In Java si ragiona con le eccezioni.
    In realtà questi 2 metodi gestiscono eventuali eccezioni "internamente" (soprattutto il DAO) e ritornano true o false come descritto sopra. Intendi forse dire che dovrebbero essere void e le eccezioni dovrebbero essere gestite dal chiamante? Scusami se ho detto sciocchezze ma non ho ben capito.

    Per quanto riguarda il funzionamento del garbage collector grazie della precisazione, mi era sfuggita questa differenza tra non referenziato e non raggiungibile. Sapevo che non è possibile "forzare" il garbage collector e che ques'tultimo agisce in modo "autonomo" (passami il termine) ma avendo visto alcuni esempi di sequence diagram in cui veniva fatta la 'destroy' di un oggetto da parte dello stesso metodo che lo aveva creato mi sorge la seguente domanda: visto che il sequence diagram segue una timeline, come è possibile disegnare la distruzione di un oggetto se non si può conoscere il momento effettivo in cui l'oggetto viene distrutto (visto che se ne occupa il g.c.)?

    Se sono stato poco chiaro cerco di spiegarmi meglio
  • Re: Distruzione oggetto java in sequence diagram UML

    spx ha scritto:


    Intendi forse dire che dovrebbero essere void e le eccezioni dovrebbero essere gestite dal chiamante?
    Sì, esattamente così.
    In "C" (dove le eccezioni non esistono), "purtroppo" si deve fare in quel modo, con valori di ritorno true/false o cose similari o (peggio) variabili globali di "stato". Un po' una "robaccia" purtroppo ....
    In Java non è di per sé sbagliato. Ma generalmente "non si fa". Si sfruttano opportunamente le eccezioni.

    spx ha scritto:


    visto che il sequence diagram segue una timeline, come è possibile disegnare la distruzione di un oggetto se non si può conoscere il momento effettivo in cui l'oggetto viene distrutto (visto che se ne occupa il g.c.)?
    Conoscendo bene il contesto di utilizzo di un certo oggetto (dove viene creato, assegnato, passato, ecc..) al massimo puoi dedurre a priori quando l'oggetto diventerà "non raggiungibile". Ma la reclamazione vera e propria dell'oggetto da parte del g.c. sarà più avanti nel tempo e quando esattamente ... non è predicibile. Dipende da svariati fattori: tipologia del g.c., dimensione del heap-space, caratteristiche (es. # core), prestazioni della macchina, ecc..
  • Re: Distruzione oggetto java in sequence diagram UML

    Dunque non essendo predicibile il momento della reclamazione da parte del garbage collector, nel sequence diagram si puó omettere la distruzione dell'oggetto oppure si puó far coincidere la distruzione col momento in cui l'oggetto non é piú raggiungibile (anche se effettivamente verrá distrutto successivamente)?
  • Re: Distruzione oggetto java in sequence diagram UML

    spx ha scritto:


    nel sequence diagram si puó omettere la distruzione dell'oggetto oppure si puó far coincidere la distruzione col momento in cui l'oggetto non é piú raggiungibile (anche se effettivamente verrá distrutto successivamente)?
    Mah .. innanzitutto cosa è la tua ... una "esercitazione"? O una cosa di "lavoro"? Insomma, a chi/cosa serve che nel diagram ci siano le distruzioni degli oggetti?
  • Re: Distruzione oggetto java in sequence diagram UML

    andbin ha scritto:


    spx ha scritto:


    nel sequence diagram si puó omettere la distruzione dell'oggetto oppure si puó far coincidere la distruzione col momento in cui l'oggetto non é piú raggiungibile (anche se effettivamente verrá distrutto successivamente)?
    Mah .. innanzitutto cosa è la tua ... una "esercitazione"? O una cosa di "lavoro"? Insomma, a chi/cosa serve che nel diagram ci siano le distruzioni degli oggetti?
    In realtá si tratta di un progetto universitario per un esame, quindi magari in questo caso potrei omettere le distruzioni. Ma trattandosi comunque di formalismi cosa prevede uml in questi casi?
  • Re: Distruzione oggetto java in sequence diagram UML

    Niente. Se vuoi descrivere con un pittogramma uml un programma java.
Devi accedere o registrarti per scrivere nel forum
7 risposte