Domanda

A seguito di una domanda per quanto riguarda utilizzando le proprietà della classe.

Sono stato con proprietà pubbliche, invece di esporre pubblicamente variabili membro. Maggioranza consiglio che questo approccio aiuta incapsulamento. Tuttavia, non capisco il vantaggio di incapsulamento rendendolo una proprietà.

molte persone donot sapere la vera ragione per l'utilizzo di proprietà. Hanno appena fanno come parte di standard di codifica.

qualcuno può spiegare chiaramente come una proprietà è meglio di variabili membro pubblico e come si migliora l'incapsulamento?

È stato utile?

Soluzione

L'incapsulamento aiuta isolando classi chiamata dai cambiamenti.

Immaginiamo di avere una semplice classe che modella un motore di automobile (causa tutti esempi OO dovrebbero coinvolgere un'analogia auto :)). Si può avere un campo semplice come questo:

private bool engineRunning;

semplicemente facendo questo campo pubblico o fornire un getter IsEngineRunning () non sembra essere diverso.

Ora supponiamo che si effettua la classe più sofisticata, che si desidera rimuovere quel campo e sostituirlo con:

private bool ignitionOn;
private bool starterWasActivated;

Ora, se avete un sacco di classi di accesso vecchio campo engineRunning devi andare e cambiare tutti (brutti momenti).

Se invece si fosse iniziato con:

public bool IsEngineRunning()
{
    return this.engineRunning;
}

si potrebbe ora cambiare a:

public bool IsEngineRunning()
{
    return ignitionOn && starterWasActivated;
}

e l'interfaccia della classe rimane la stessa (bei tempi).

Altri suggerimenti

Il suo meglio per presentare le proprietà invece di variabili membro, in quanto che consentirebbe di fare tutti i tipi di controllo quando si imposta o di ottenere il valore della variabile membro.

supporre u avere una variabile membro:

private int id;

e si dispone di una proprietà pubblica:

public int ID
{
    get 
    { 
       // do something before returning
    }
    set 
    {
      // do some checking here may be limits or other kind of checking
    }
}

ce la farò breve. Proprietà = flessibilità

1 Proprietà sono utili per creare i membri che non si vuole tenere in una classe tutto il tempo o che sono aggregazioni / funzioni dei membri esistenti.

Eg. età può essere emesso sulla base di data di nascita, canSwim può essere generato da hasLimbs && carri

2 L'esposizione membri come proprietà può essere utile quando si tratta di modifiche impreviste [Qualcuno ha mai prevedere tutte le richieste del cliente?] In sistemi con un database esistente.

Eg. isAllowed è vero quando l'utente è finito 18yr e viene memorizzata nella cache per le prestazioni. Cliente vuole eseguire il servizio negli Stati Uniti e si può restituire false se falso è chached e l'età di controllo solo quando la cache è vero

Alcuni pensieri:

  • È possibile modificare la rappresentazione interna dei dati senza compromettere le classi di chiamata.

    es. (prima)

    public boolean isActive() {
        return this.is_active;
    }
    

    (dopo)

    public boolean isActive() {
        return this.is_active && this.approved && this.beforeDeadline;
    }
    

    Ciò è particolarmente importante se il codice viene utilizzato da altri (cioè il codice è 3rd-party ). In una certa misura l'interfaccia / API deve rimanere stabile. Piccoli cambiamenti non dovrebbero influenzare il codice di altro codice che l'utilizza.

  • È possibile avere operazioni più complesse. Si consideri un is_active variabile. Forse cambiando il valore di questa variabile effetti che anche altre proprietà dell'oggetto. Se si incapsulare l'accesso in un metodo, si può prendere cura di questo all'interno di questo metodo e il chiamante non ha bisogno di cura.

    per es.

    public void setActive(boolean active) {
        this.is_active = active;
        this.startTimeout();
        this.updateOtherInformation();
    }
    

    Si impone quindi una certa serie di azioni. È non hanno fare affidamento sul fatto che il chiamante esegue queste azioni in modo corretto. Il vostro oggetto sarà sempre in uno stato corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top