Dopo aver assegnato un parametro a un campo, utilizzare il parametro o il campo?

4

Se ho un metodo che riceve un valore come parametro e lo memorizza in un campo per un utilizzo successivo, ma poi continua a usare quel valore - perché dovrei usare il parametro invece del campo?

private RailState _railState;

public void UseParameter(RailState railState)
{
    _railState = railState;
    railState.SetActive();
}

public void UseField(RailState railState)
{
    _railState = railState;
    _railState.SetActive();
}

Per quanto posso vedere, un argomento per l'utilizzo di un parametro è che se la classe verrà modificata in seguito e il valore verrà utilizzato solo in quel metodo, un IDE decente mi informerà che il campo non viene mai letto e quindi inutile.

Un argomento per l'utilizzo del campo è che l'utilizzo del parametro non funzionerà per i tipi di valore. Mentre questo è ovvio e intuitivo per i tipi di base come i numeri, potrebbe portare a sorprese con strutture inaspettate.

Tuttavia, ci sono altri argomenti - in un modo o nell'altro - che mi manca?

    
posta R. Schmitz 21.02.2017 - 14:34
fonte

1 risposta

2

Come hai sottolineato, l'approccio sul campo funziona bene in tutti i casi (valore e riferimento). Questo dovrebbe essere l'approccio preferito.

Un altro motivo che parla a favore del campo è il refactoring: se il tuo metodo diventa molto complesso, puoi facilmente suddividerlo in metodi più semplici quando usi l'approccio sul campo.

Il parametro potrebbe comunque essere un approccio migliore quando si gestiscono operazioni univoche relative all'inizializzazione, specialmente in un'applicazione multithread, in cui il campo potrebbe essere modificato da un altro metodo richiamato in un altro thread.

Esempio ipotetico:

 _railstate = railstate; 
 railstate.incrementUseCount(1); // because use count of parameter is to be increased
 _railstate.activate(); // may be another thread already changed the field and decrementer use count of former field ?

Quindi, piuttosto che il dogmatismo, consiglierei di pensare veramente alla semantica: vogliamo affrontare il parametro indipendentemente dallo stato dell'oggetto? O intendiamo indirizzare l'oggetto corrispondente allo stato dell'oggetto (ad esempio, rinominato dal campo)?

    
risposta data 21.02.2017 - 15:57
fonte

Leggi altre domande sui tag