Nota: prima sono state poste domande con titolo simile, ma per favore leggi il testo completo prima di rivendicare che si tratta di un duplicato.
Dato che tutti in OOP usano i termini getter e setter , mi aspetterei che avere un significato ben definito. Ma quello che ho trovato sono fondamentalmente due affermazioni sono in qualche modo contraddittori:
(A) Forniscono accesso in lettura o scrittura a un attributo specifico.
Questo è ciò che praticamente tutti i getter e setter che ho visto nel codice di produzione. Un getter restituisce il valore di un attributo e un setter imposta il valore di un attributo.
D'altra parte:
(B) Permettono di nascondere la rappresentazione interna dei dati all'interno di una classe mentre sono ancora in grado di accedervi e modificarla.
Un esempio in Java:
private double x, y;
public double getX() { return x; }
public double getY() { return y; }
Questo ovviamente è conforme a (A). Ora secondo (B) potremmo cambiare la rappresentazione dei dati:
private double angle, distance;
public double getX() { return distance * Math.cos(angle); }
public double getY() { return distance * Math.sin(angle); }
Questo non è più conforme a (A) perché non ci sono più attributi denominati X e Y ei valori di ritorno sono il risultato di un calcolo. Ma li chiamerei ancora getter.
Altri esempi:
-
Questo è ovviamente un setter:
private double length; public void setLength(double newLength) { length = newLength; }
-
La maggior parte delle definizioni consente al setter di effettuare alcuni controlli:
private double length; public void setLength(double newLength) { length = (newLength > 0) ? newLength : 0; }
-
Non sono sicuro di questo. Nota che potrebbero esserci più setter per un attributo:
private double length; public void setLengthInInches(double newLength) { length = 25.4 * newLength; }
-
Questo imposta due attributi:
private double length; private UnitType lengthUnit; public void setLengthInInches(double newLength) { length = newLength; lengthUnit = UNIT_INCH; }
-
Simile a 4 ma con due argomenti:
private double length; private UnitType lengthUnit; public void setLength(double newLength, UnitType newLengthUnit) { length = newLength; lengthUnit = newLengthUnit; }
-
Un'altra variante:
private double length; private UnitType lengthUnit; public void setLength(LengthType newLength) { length = newLength.getValue(); lengthUnit = newLength.getUnit(); }
-
Qui l'attributo non esiste ma può essere calcolato:
private double start; private double end; public void setLength(double newLength) { end = start + newLength; }
-
Che dire di questo:
private int productId; private Price price; public void setLength(double newLength) { productId = getProductIdByLength(newLength); price = BASE_PRICE + PRICE_PER_LENGTH_UNIT * newLength; }
-
E questo:
private double length; public void setLength(SomeInput input) { length = input.doSomeComplicatedStuffToCalculateLength(); }
Quali di questi sono setter e quali no?