The "member" prefix is kind of an implementation detail. It distracts your attention from the problem domain to the technical solution domain which biases your mind when thinking of possible refactorings. – me
puoi spiegare ulteriormente? La tua è l'unica ragione per cui ho visto il perché non usare il prefisso e non lo capisco ... (con il quale intendo, le altre cose che le persone dicono sono le ragioni per cui non devo usarlo, che non è lo stesso del perché non dovrei) - Betty Crokker
Il mio punto è estendere le risposte di @CandiedOrange e @Ewan.
I prefissi rendono più difficile il refactoring
Man mano che il codice si evolve, le variabili e i metodi possono cambiare il loro ambito. Per esempio. puoi creare un metodo privato e successivamente scoprire che dovrebbe essere disponibile anche ad altre (nuove) classi. Simile può accadere ai parametri del metodo e alle variabili locali.
Supponiamo che tu crei un calcolatore delle tasse. In base al principio di scope lease visibility per le variabili, inizi con un metodo che accetta sia come parametro tax rate che base value come parametri:
(esempio potrebbe sembrare Java-ish ...)
class TaxCalculator{
double Calculate(double p_TaxRateInpercent, double p_BaseValue){
return (100+p_TaxRateInpercent)/100 * p_BaseValue;
}
}
Successivamente devi implementare l'operazione inversa e in base a TDD lo fai con il minimo sforzo:
class TaxCalculator{
double Calculate(double p_TaxRateInpercent, double p_BaseValue){
return (100+p_TaxRateInpercent)/100 * p_BaseValue;
}
double CalculateBase(double p_TaxRateInpercent, double p_TaxedValue){
return p_TaxedValue/((100+p_TaxRateInpercent)/100);
}
}
Il prossimo TDD vuole che tu ridigiga il codice per diventare più pulito e che è quello di ridurre l'elenco dei parametri di entrambi i metodi.
(Sì, dovresti prima estrarre il calcolo raddoppiato, ma lasciami capire il mio punto .. .)
La soluzione ovvia è di cambiare tax rate in una variabile membro passandola come parametro costruttore.
class TaxCalculator{
double m_TaxRateInpercent;
TaxCalculator(double p_TaxRateInpercent){
m_TaxRateInpercent = p_TaxRateInpercent;
}
double Calculate(double p_BaseValue){
return (100+m_TaxRateInpercent)/100 * p_BaseValue;
}
double CalculateBase(double p_TaxedValue){
return p_TaxedValue/((100+m_TaxRateInpercent)/100);
}
}
Come puoi vedere, abbiamo dovuto modificare tutte le linee dei nostri metodi esistenti (qualsiasi riga che abbiamo usato p_TaxRateInpercent
per essere esatti.
Il problema è che hai nessun supporto dal tuo IDE per eseguire il cambio di nome in tutta la classe. L'unico aiuto è search / replace che cambierà anche il costruttore o qualsiasi parte che contiene accidentalmente la stringa p_TaxRateInpercent
.
L'IDE potrebbe offrire una modifica a .. . refactoring per nomi di variabili non definiti, ma questo può essere limitato allo scopo del metodo
Senza il prefisso solo le firme del metodo sarebbero cambiate. Nessuna modifica sarebbe stata necessaria.
I prefissi ingombrano la cronologia SCM quando vengono modificati
Anche SCM registra la modifica del prefisso come modifiche nella logica sebbene la logica non sia cambiata! La storia delle SCM è ingombra di questo cambiamento tecnico che nasconde ciò che è importante e aumenta il rischio di conflitti con i cambiamenti (reali logici) degli altri.