Come capire se il proprio oggetto non rispetta l'information hiding?

di il
4 risposte

Come capire se il proprio oggetto non rispetta l'information hiding?

Mettiamo il caso che all'interno dell'oggetto (studenti) creo un metodo public che mi fa vedere (ad esempio) tutti gli elementi di un ipotetico array studenti(definito in precedenza come variabile istanza ) (privato) , e quindi ritorno come valore l' indirizzo di quell'array (ad esempio: this.studenti).
La mia professoressa ha detto che cosi' facendo tutti possono modificare l'elenco di quell'array. Quel che non capisco e' come fanno .

4 Risposte

  • Re: Come capire se il proprio oggetto non rispetta l'information hiding?

    liquidlurker ha scritto:


    Mettiamo il caso che all'interno dell'oggetto (studenti) creo un metodo public che mi fa vedere (ad esempio) tutti gli elementi di un ipotetico array studenti(definito in precedenza come variabile istanza ) (privato) , e quindi ritorno come valore l' indirizzo di quell'array (ad esempio: this.studenti).
    La mia professoressa ha detto che cosi' facendo tutti possono modificare l'elenco di quell'array. Quel che non capisco e' come fanno .
    La questione è un po' ampia, nel senso che bisogna vedere ovviamente come è stata fatta la classe, quali campi possiede e di che tipo.
    Se tutti i campi di istanza sono "privati", è già un buon punto di partenza. Se i campi sono solo di tipo primitivo, String, le classi "wrapper" dei primitivi (Integer, Short, Long ecc..) NON ci sono problemi a restituire direttamente questi valori. String e le classi "wrapper" dei primitivi sono IMMUTABILI. Se anche un "client" estrae dalla classe questi oggetti, non può modificarne lo stato.

    Se invece la classe contiene array o altre strutture dati complesse .... dipende, bisogna vedere cosa fare o comunque cosa è richiesto/accettabile. Se esponi all'esterno direttamente un array, chiunque può modificare gli elementi (gli elementi dell'array ... NON necessariamente lo stato degli oggetti contenuti). È un bene o un male?? Dipende dallo scenario d'uso.
    Se vuoi esporre all'esterno un array ma vuoi che NON venga toccato quello nella classe, la soluzione semplice/veloce è: restituire un array "clonato".
  • Re: Come capire se il proprio oggetto non rispetta l'information hiding?

    andbin ha scritto:


    liquidlurker ha scritto:


    Mettiamo il caso che all'interno dell'oggetto (studenti) creo un metodo public che mi fa vedere (ad esempio) tutti gli elementi di un ipotetico array studenti(definito in precedenza come variabile istanza ) (privato) , e quindi ritorno come valore l' indirizzo di quell'array (ad esempio: this.studenti).
    La mia professoressa ha detto che cosi' facendo tutti possono modificare l'elenco di quell'array. Quel che non capisco e' come fanno .
    La questione è un po' ampia, nel senso che bisogna vedere ovviamente come è stata fatta la classe, quali campi possiede e di che tipo.
    Se tutti i campi di istanza sono "privati", è già un buon punto di partenza. Se i campi sono solo di tipo primitivo, String, le classi "wrapper" dei primitivi (Integer, Short, Long ecc..) NON ci sono problemi a restituire direttamente questi valori. String e le classi "wrapper" dei primitivi sono IMMUTABILI. Se anche un "client" estrae dalla classe questi oggetti, non può modificarne lo stato.

    Se invece la classe contiene array o altre strutture dati complesse .... dipende, bisogna vedere cosa fare o comunque cosa è richiesto/accettabile. Se esponi all'esterno direttamente un array, chiunque può modificare gli elementi (gli elementi dell'array ... NON necessariamente lo stato degli oggetti contenuti). È un bene o un male?? Dipende dallo scenario d'uso.
    Se vuoi esporre all'esterno un array ma vuoi che NON venga toccato quello nella classe, la soluzione semplice/veloce è: restituire un array "clonato".
    (non so cosa vuol dire wrapper, ma comunque ho afferrato il concetto).
    Allora mettiamo il caso che non voglio che nessuno mi modifichi gli elementi dell'array e sono stato cosi' "stupido" da restituire direttamente l'indirizzo alla zona di memoria dove e' presente quello "originale". La mia domanda e' come fa un utente esterno a modificare gli elementi al suo interno?(in pratica intendo)
    E come faccio quindi a creare un "clone" di quell' array senza che l' utente mi modifichi anche quest'ultimo?
    Scusa per le domande stupide. Sono alle prime armi
  • Re: Come capire se il proprio oggetto non rispetta l'information hiding?

    liquidlurker ha scritto:


    (non so cosa vuol dire wrapper, ma comunque ho afferrato il concetto).
    In generale un wrapper è qualcosa che "incapsula" qualcos'altro. In questo caso java.lang.Integer incapsula un int, java.lang.Long incapsula un long, ecc... Oggetti Integer, Long ecc.. banalmente contengono un campo del rispettivo valore primitivo.

    liquidlurker ha scritto:


    come fa un utente esterno a modificare gli elementi al suo interno?
    int[] arr = unOggetto.getNumeri();
    arr[2] = nuovo valore .....

    liquidlurker ha scritto:


    E come faccio quindi a creare un "clone" di quell' array senza che l' utente mi modifichi anche quest'ultimo?
    public class UnaClasse {
        private int[] numeri;
    
        // ...... altro
    
        public int[] getNumeri() {
            return numeri.clone();
        }
    }
    Ovviamente il campo numeri non deve essere null per il getNumeri() sopra. Se il campo è anche lecito che sia null, va usato es.

    return numeri != null ? numeri.clone() : null;

    In alternativa si possono usare i copyOf (da Java 6) della classe java.util.Arrays

    return Arrays.copyOf(numeri, numeri.length);
  • Re: Come capire se il proprio oggetto non rispetta l'information hiding?

    andbin ha scritto:


    liquidlurker ha scritto:


    (non so cosa vuol dire wrapper, ma comunque ho afferrato il concetto).
    In generale un wrapper è qualcosa che "incapsula" qualcos'altro. In questo caso java.lang.Integer incapsula un int, java.lang.Long incapsula un long, ecc... Oggetti Integer, Long ecc.. banalmente contengono un campo del rispettivo valore primitivo.

    liquidlurker ha scritto:


    come fa un utente esterno a modificare gli elementi al suo interno?
    int[] arr = unOggetto.getNumeri();
    arr[2] = nuovo valore .....

    liquidlurker ha scritto:


    E come faccio quindi a creare un "clone" di quell' array senza che l' utente mi modifichi anche quest'ultimo?
    public class UnaClasse {
        private int[] numeri;
    
        // ...... altro
    
        public int[] getNumeri() {
            return numeri.clone();
        }
    }
    Ovviamente il campo numeri non deve essere null per il getNumeri() sopra. Se il campo è anche lecito che sia null, va usato es.

    return numeri != null ? numeri.clone() : null;

    In alternativa si possono usare i copyOf (da Java 6) della classe java.util.Arrays

    return Arrays.copyOf(numeri, numeri.length);
    Sei un mito! Grazie davvero
Devi accedere o registrarti per scrivere nel forum
4 risposte