Префікс "member" - це така собі деталь реалізації. Це відволікає вашу увагу від проблемної області до домену технічного рішення, яка упереджує ваш розум, коли думаєте про можливі рефактори. - мене
ви можете пояснити далі? Твоя - єдина причина, з якої я бачив, чому не використовувати префікс, і я його не розумію ... (під чим я маю на увазі, інші речі, про які говорять люди, - це причини, чому я не повинен його використовувати, що не те саме, чому я не повинен) - Бетті Кроккер
Моя думка полягає у поширенні відповідей @CandiedOrange та @Ewan.
Префікси ускладнюють рефакторинг
У міру того, як ваш код розвивається, змінні та методи можуть змінювати сферу їх застосування. Напр. ви можете створити приватний метод і пізніше з’ясувати, що він повинен бути доступний і для інших (нових) класів. Подібне може статися з параметрами методу та локальними змінними.
Скажімо, ви створюєте калькулятор податку. Відповідно до принципу видимості видимості оренди для змінних, ви починаєте з методу, який приймає як параметри і ставку податку, і базову величину :
(приклад може виглядати на Java-ish ...)
class TaxCalculator{
double Calculate(double p_TaxRateInpercent, double p_BaseValue){
return (100+p_TaxRateInpercent)/100 * p_BaseValue;
}
}
далі ви повинні виконати операцію зворотного зв'язку, і згідно TDD, ви робите це з найменшими зусиллями:
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);
}
}
Далі TDD бажає, щоб ви перефактурували код, щоб стати чистішим, що полягає у зменшенні списку параметрів обох методів.
(Так, ви спершу отримаєте подвоєний розрахунок, але дозвольте мені зрозуміти свою думку ...)
Очевидним рішенням є зміна податкової ставки в змінну члена, передаючи її як параметр конструктора.
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);
}
}
Як ви бачите, нам довелося змінити всі рядки існуючих методів (будь-яку лінію, яку ми використовувалиp_TaxRateInpercent
щоб бути точним.
Проблема полягає в тому, що у вас немає підтримки від IDE для перейменування протягом усього класу. Єдина допомога в пошуку / заміні, яка також змінить конструктор або будь-яку частину, яка випадково містить рядок p_TaxRateInpercent
.
Ви IDE можуть запропонувати зміни на ... рефакторинг для невизначених імен змінних, але це може бути обмежено сферою застосування методу
Без префікса змінилися б лише підписи методу. Перейменування взагалі не знадобилося б.
Префікси захаращують історію SCM при зміні
Також SCM фіксує зміну префікса як зміни в логіці, хоча логіка не змінювалася! Історія СКМ переповнена цими технічними змінами, приховуючи важливе значення та підвищуючи ризик конфліктів із (реальною логікою) іншими змінами.
this
ключового слова? Ви не можете звернутися до членів, які використовуютьthis
, наприкладthis.count
?