Oggi ho avuto una discussione con un collega.
Tendo a credere che un valore in una proprietà dovrebbe essere una parte significativa dello stato di un oggetto in un dato momento. Questo automaticamente rende quasi sempre il costruttore pienamente responsabile dell'assegnazione iniziale di tutte le proprietà di una classe. Altri metodi possono successivamente modificare lo stato in un altro stato valido, ma di solito non è compito loro inizializzare i valori sulle proprietà della classe.
Il mio collega crede che le proprietà di classe possano anche essere utili per aumentare la leggibilità diminuendo il conteggio dei parametri delle funzioni private interne. Le proprietà di classe vengono quindi utilizzate come variabili temporanee, potenzialmente utilizzate da più funzioni private.
A modo mio (esempio di codice php - Ho omesso le dichiarazioni del metodo privato):
class Example {
private $valueFromConstructor;
public function __construct($valueFromConstructor) {
$this->valueFromConstructor = $valueFromConstructor;
}
public function doSomething() {
$value1 = $this->computeValue1();
$value2 = $this->computeValue2();
$value3 = $this->computeValue3WithValue1AndValue2($value1, $value2);
$value4 = $this->computeValue4WithValue1AndValue3($value1, $value3);
return $this->doSomethingWithValue4($value4);
}
}
Modo di un collega
class Example {
private $valueFromConstructor;
private $value1;
private $value2;
private $value3;
private $value4;
public function __construct($valueFromConstructor) {
$this->valueFromConstructor = $valueFromConstructor;
}
public function doSomething() {
$this->computeValue1();
$this->computeValue2();
$this->computeValue3WithValue1AndValue2();
$this->computeValue4WithValue1AndValue3();
$this->doSomethingWithValue4();
return $this->value4;
}
}
Per me, c'è una distinzione abbastanza chiara su quando si dovrebbe assegnare un valore a una proprietà di classe e quando i valori dovrebbero essere parametrizzati. Non li vedo come alternative immediate l'una all'altra. Mi confonde vedere le variabili che vivono più a lungo dell'esecuzione del metodo a cui appartengono. La necessità che queste variabili esistano come proprietà di classe quando vengono utilizzate in metodi privati sembra creare un accoppiamento temporale.
Esistono delle linee guida su questo argomento? O è una questione di stile? E importa se l'oggetto non vive molto a lungo e ha solo pochi metodi pubblici? Per chiarire: visto dall'esterno, la classe funziona correttamente.