Relazione di composizione o relazione di aggregazione?

di il
2 risposte

Relazione di composizione o relazione di aggregazione?

Salve il professore mi ha detto di implementare questo esercizio (vedi allegato foto):

Infine vedendo l'esercizio il professore ha detto che tra le due classi è presente una relazione di aggregazione. Ma a me sembra che la relazione tra le due classi sia quella di composizione con iniezione di dipendenza esercitata dal metodo aggiundiVoce():

public class MainRubrica {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
         
		Scanner tastiera=new Scanner(System.in);
		Rubrica rubrica1=new Rubrica();
		int scelta=0;
		    
		    do {
		    
		    System.out.println("Digitare 1 per aggiungere una nuova voce alla rubrica, atrimenti digitare 0 per terminare ");
		    scelta=tastiera.nextInt();
		    
		    if(scelta==1) {
		    System.out.println("Digitare un nuovo nome: ");
		    String nome=tastiera.next();
		    System.out.println("Digita il relativo numero: ");
		    String numero=tastiera.next();
			rubrica1.aggiungiVoce(new Voce(nome, numero)); 
		    
		    }
		    }while(scelta!=0);
					
			for(int i=0; i<rubrica1.get().size(); i++) {
				Voce voceCorrente=(Voce) rubrica1.get().elementAt(i);
				System.out.println("Nome="+voceCorrente.getNome()+ " "+"Telefono="+voceCorrente.getTelefono());
			}
			}
			
}


Allegati:
30668_98e53c74cacd7e116a02b42bc8ca145b.png
30668_98e53c74cacd7e116a02b42bc8ca145b.png

2 Risposte

  • Re: Relazione di composizione o relazione di aggregazione?

    mark13 ha scritto:


    Infine vedendo l'esercizio il professore ha detto che tra le due classi è presente una relazione di aggregazione. Ma a me sembra che la relazione tra le due classi sia quella di composizione
    La differenza tra "composizione" e "aggregazione" è molto fine: nella composizione, l'oggetto B (contenuto in A) non può esistere (o per dirlo diversamente, non ha senso che esista) indipendentemente dal contenitore A. Lo si può dire anche in altro modo: il ciclo di vita di B dipende da quello del contenitore A. Se il contenitore viene distrutto, anche gli oggetti contenuti devono essere distrutti.
    Nella aggregazione non è così, ovvero l'oggetto contenuto può anche esistere (cioè avere senso) indipendentemente dal contenitore in cui è contenuto.

    Questa differenza è molto fine e non sempre è importante saperla vedere o impostare. Ti serve se ad esempio devi disegnare il diagrammino UML, dove c'è la simbologia apposita per distinguere tra aggregazione e composizione.

    Ma se sviluppi in Java è invece più importante avere ben chiari i concetti sulle relazioni "is-a" (ereditarietà) e "has-a" (associazione). Poi che la associazione sia di "composizione" piuttosto che di "aggregazione", bisogna analizzare appunto il contesto e capire bene chi ha il controllo degli oggetti, dove vengono creati e se ha senso usarli indipendentemente tra di loro.

    mark13 ha scritto:


    con iniezione di dipendenza esercitata dal metodo aggiundiVoce():
    Se intendi dipendenza nel senso di dependency injection (come si usa nei framework dove viene applicata la DI, es. Spring) allora un oggetto B è una "dipendenza" di A se A ha tassativamente bisogno di B per compiere il suo lavoro.

    Caso banale: uno UserService che ha bisogno di un EmailService per inviare una email quando ad esempio l'utente deve cambiare la password. Questa è una dipendenza, lo UserService deve ricevere un oggetto EmailService per poter fare il suo lavoro. Indipendentemente dal fatto se ci troviamo in un ambiente dove c'è la gestione della DI o no, lo si può codificare così:
    public class UserService {
        private final EmailService emailService;
    
        public UserService(EmailService emailService) {
            this.emailService = emailService;
        }
      .....
    }
    Nel tuo caso, quasi sicuramente Rubrica fa solo da contenitore per N oggetti Voce e poi li espone banalmente con quel get(). Rubrica quindi non dipende dagli oggetti Voce per il suo funzionamento. Può funzionare con 0, 1, 10, 1000 oggetti Voce.
  • Re: Relazione di composizione o relazione di aggregazione?

    Salve andbin, quindi quando il professore dice che nel main viene fatta una dependency injection attraverso il metodo aggiungiVoce() dice una cosa errata.
Devi accedere o registrarti per scrivere nel forum
2 risposte