2011-01-22 23 views

risposta

7

I settici di getter sono generalmente utilizzati da classi esterne dall'interno direttamente ai campi. Il vantaggio principale/scopo è incapsulamento di setter getter,

Se i getter setter ha un codice logico quindi utilizzarlo.

ad esempio:

public void setValue(int val){ 
    if(val > 100) 
    this.val = 0; 
    else 
    this.val = val; 
    } 

vedere anche

+0

Link altro articolo spiega questo molto buono. – Knubo

+0

hint int type non funziona in PHP. – GolezTrol

+0

@Geolez Non vedo tag PHP da OP, il concetto di OOP qui descritto non è specifico per qualsiasi lingua –

5

Sì, getter e setter sono utili. Poiché PHP non supporta l'hint di tipo per tipi semplici come int o string, non è possibile forzare un valore per il tipo giusto.

Utilizzando un setter, è sempre possibile verificare il valore impostato. Quando un valore impostato su una proprietà int non è un int, puoi scegliere di convertirlo o di generare un errore, invece di accettare semplicemente il valore errato.

Ciò renderà il debug e la manutenzione della vostra applicazione molto più semplice. Quindi è una buona idea usare getter e setter, anche se non contengono molta logica oltre a questi controlli.

+0

+ 1. Questo è utile grazie e org.life ha ragione.Io intensionalmente non ho aggiunto un tag specifico per la lingua –

0

Si suppone che si usino getter e setter quasi ovunque, anche all'interno della classe. Se non lo fai, allora stai potenzialmente rompendo l'incapsulamento e, peggio ancora, potresti invalidare i tuoi invarianti.

Come semplice esempio in C++:

class BankAccount 
{ 
public: 
    void withdraw(int amount) 
    { 
     m_balance -= amount; 
     m_withdrawals++; 
    } 

    void transfer(BankAcount& other, int amount) 
    { 
     m_balance -= amount; 
     other.m_balance += amount; 
    } 

private: 
    int m_balance; 
    int m_withdrawals; 
}; 

Vedere il bug? transfer ritira denaro, ma non incrementa m_withdrawals. Ciò avrebbe potuto essere evitato se fosse chiamato semplicemente withdraw invece di decrementare manualmente il saldo.

Lo stesso vale per getter e setter. Ad esempio, è abbastanza comune avere getter che inizializzano pigramente i loro valori. Se un'altra funzione membro tenta di accedere direttamente al membro non inizializzato, si otterrà un dereferenziamento del puntatore nullo.

In sostanza, si dovrebbe sempre cercare di utilizzare i getter e setter ogni volta che forniscono la funzionalità che vogliono. Più cose di basso livello fai, più bug di basso livello avrai. Non ha senso scrivere getter e setter se non li userai.

+1

Penso che tu abbia descritto un esempio non per getter/setter ma piuttosto incapsulamento –

+0

Getter e setter * sono * incapsulamento - questo è il loro intero scopo. –

+0

"I getter ei setter sono incapsulamento" no :) i getter ei setter rompono l'incapsulamento. Encapsulation == object non fornisce i suoi dati (proprietà) all'esterno. – smentek

1

@GolezTrol

Non c'è cartellini PHP sul soggetto e si sono sbagliati. Quello che stai descrivendo non ha niente a che fare con i setter. Puoi forzare il tipo sul parametro (in PHP) usando qualsiasi metodo non solo un setter.

Si può scrivere:

setX(X $x){ ...} 
setY(Y $y){ ...} 

o semplicemente:

iAmMethodNotASetter(X $x, Y $y){ 

    //20lines of code here end then: 

    $this->x = $x; 
    $this->y = $y; 
    } 

Come si vede non ho avuto bisogno di far rispettare setter tipo di proprietà dell'oggetto.

E l'errore di lancio nel setter dopo aver controllato il tipo variabile è comunque una cattiva idea. È un errore comune dei programmatori che passano dalla lingua tipizzata staticamente al linguaggio di tipo dinamico.

Gli incastonatori ed i ricevitori sono CONVENTION e non impongono nulla! Oggi li usiamo solitamente per la creazione di Plain Old Java Objects. (POJO - in php word POPO) Quindi è solo una convetion (standard) per la creazione di un oggetto che può essere utilizzata tra librerie o progetti.

È possibile combinare i setter con il controllo del tipo o altro, ma non li rende più somiglianti di quello che sono.

A proposito di incapsulamento:

@ org.life.java - Jigar Joshi

"Il vantaggio principale/scopo è incapsulamento di setter getter,"

@Peter Alexander

"Dovresti usare i getter e setter quasi ovunque, compreso all'interno "della classe. Se non lo fai, allora siete potenzialmente rottura incapsulamento" 'getter e setter sono incapsulamento'

Sbagliato, sbagliato, sbagliato. incapsulamento non ha nulla a che fare con getter e setter ed è è un errore molto comune, so che ci sono molti articoli ripetuti più e più volte sottosopra ...
I getter ei setter non aiutano l'incapsulamento ancora peggio, possono spezzare l'incapsulamento. Lo fanno quando li usi per ottenere un po 'di incapsulamento. dati dall'oggetto invece di chiedere all'oggetto di fare qualcosa per te con i propri dati.

Incapsulamento == l'oggetto si assume la piena responsabilità dei propri dati e non fornisce i dati delle sue righe. E getter sulla proprietà privata non è altro che rendere pubblica la proprietà in modo complicato == incapsulamento dei freni.

Chceck paragrafo incapsulamento: http://en.wikipedia.org/wiki/C%2B%2B o http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 Neanche una parola sul setter o getter ...

+0

Da wiki: "[Encapsulation is] Un costrutto linguistico che facilita il raggruppamento di dati con i metodi (o altre funzioni) che operano su tali dati." Getter e setter sono i metodi che sono raggruppati in una classe per operare sui suoi dati. Ad ogni modo, ti ho dato un -1 perché non hai risposto alla domanda e hai postato solo per molestare gli altri rispondenti. Usa commenti per questo. –

+0

Potete darmi qualunque cosa vogliate, per favore leggete il libro ... – smentek

+0

+ 1.Anche se siete un po 'spigolosi, state presentando un punto di vista interessante. Devo fare un po' più di lettura su questo.Grazie –