Domanda

Ho avuto una discussione sull'uso della parola " accessor " (il contesto è la programmazione Java). Tendo a pensare agli accessori come implicitamente "accessori di proprietà" - cioè, il termine implica che è più o meno lì per fornire accesso diretto allo stato interno dell'oggetto. L'altra parte insiste sul fatto che qualsiasi metodo che tocchi in qualche modo lo stato dell'oggetto è un accessor.

So che voi ragazzi non potete vincere l'argomento per me, ma sono curioso di sapere come definirebbe il termine. :)

È stato utile?

Soluzione

Per gli accessori, tendo a pensare a getter e setter.

Insistendo sul fatto che tutti i metodi che toccano lo stato interno dell'oggetto sono accessori, sembra che qualsiasi metodo di istanza che utilizza effettivamente lo stato dell'oggetto sia un accedente, e ciò non sembra giusto. Quale tipo di metodo di istanza non utilizzerà lo stato dell'oggetto? In altre parole, un metodo di istanza che non utilizza lo stato dell'oggetto in qualche modo non dovrebbe essere un metodo di istanza per iniziare - dovrebbe essere un metodo di classe .

Ad esempio, se BigDecimal.add può essere considerato un accedente? È un metodo che leggerà il valore dell'istanza su cui è stato chiamato il metodo aggiungi , quindi restituirà il risultato dopo aver aggiunto il valore di un altro BigInteger . Sembra abbastanza chiaro che il metodo di istanza add non è un getter né un setter.

Altri suggerimenti

Un metodo accessor fa esattamente quello che dice sulla teglia: accede a uno stato dal tipo senza effetti collaterali (a parte un'istanza pigra, forse, che non è qualcosa che il chiamante normalmente dovrebbe conoscere).

private int _age;

public int getAge()
{
    return _age;
}

I metodi che modificano lo stato sono più utilmente considerati (a mio avviso) come mutatori.

Oltre a googling e wikipedia, la Java Language Specification mostra questo come esempio di un metodo di accesso:

private static int N;
public static int getN() { return N; }

Quindi, sì, direi che ottiene solo il valore di un campo. Il compilatore potrebbe incorporarlo, convertendolo in una lettura semplice, quindi qualcosa di più probabilmente non è un accessor.

Metodi di accesso & nbsp ;: getRed, getGreen e getBlue

Questi metodi di solito accedono a un valore.

Metodi mutatore & nbsp ;: setRed, setGreen, setBlue

Un mutatore muterà un valore

Sono sempre passato alla prima definizione. Quindi, generalmente questo vale solo per getter e setter. Se seguiamo il secondo metodo, allora è una distinzione molto meno utile, poiché copre quasi tutti i metodi.

I metodi di accesso vengono utilizzati per accedere ai campi di un oggetto. Quindi getter e setter sono entrambi metodi di accesso. Metodo osservatore è il termine giusto per un metodo che effettua un'osservazione più generale su un oggetto, senza causare effetti collaterali osservabili esternamente. Un metodo il cui scopo principale è causare effetti collaterali è un metodo mutatore . Pertanto, i setter sono un esempio di un metodo mutatore. Per una buona pratica ingegneristica, i setter pubblici dovrebbero essere evitati perché rendono impossibile per una classe imporre agli invarianti i propri dati: violano la barriera di astrazione che una classe dovrebbe normalmente applicare.

È bene essere in grado di differenziare getter e setter nella conversazione tecnica. I metodi Accessor sono partner dei metodi modificatore . Accessor legge lo stato di un oggetto ( getA () ), mentre modificatore s scrive lo stato ( setA (Object) ).

Un metodo che fornisce l'accesso (può essere "accesso in lettura" o "accesso in scrittura") all'interno di un oggetto è un "metodo accessor".

Gli autori qui certamente lo usano in questo modo:

  1. http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html

  2. http://c2.com/cgi/wiki?AccessorsAreEvil

Penso che il termine possa provenire da Common Lisp (non tutto?) - con setf usato per modificare il valore degli slot degli accessor.

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