Виправлення орфографічної помилки в назві методу


73

Один із методів, які я зазвичай використовую в нашій кодовій базі, є неправильним написанням (і це передувало мені).

Це насправді дратує мене не просто тому, що воно введено в оману, але що ще важливіше, це змушує мене ВИНАГИ помилятися з ім'ям при першому введенні його (і тоді я повинен пам'ятати "О, так, це слід ввести в цю помилку ...")

Я вношу кілька змін навколо оригінального методу. Чи варто скористатися можливістю просто перейменувати метод відродження?


12
Чи можете ви перейменувати його? Якщо він використовується за кодом, який ви не контролюєте, вам потрібно виправдати зворотній розрив сумісності.

16
* неправильно написані. І вам доведеться міняти це скрізь, коли метод буде викликаний.
JohnP

2
* неправильне написання ... чи, можливо, інший правопис?
HorusKol

2
@JohnP Було три, зараз одна виправлена, а дві ще неправильні. Випадково цілком підходить ім'я ОП. :)
Розчарований

3
Ми повинні дозволити, щоб нічого неправильно не було розміщено!
Маг

Відповіді:


136

Чи варто скористатися можливістю просто перейменувати метод відродження?

Абсолютно.

Однак, якщо ваш код був випущений як API, ви також повинні залишити метод неправильної написання та передати його правильно названому методу (маркування його застарілим, якщо ваша мова підтримує такі речі).


33
Ідея "вперед до правильно названого методу" проста і геніальна. Цікаве посилання і на теорію розбитих вікон.
dev_feed

2
Зауважте, що якщо це частина загальнодоступного API, це може бути не зворотно сумісною зміною (залежно від мови). Це не так вже й малоймовірно, як це може здатися. Якби мені довелося успадковувати існуючий API з неправильним назвою, я б точно це виправив.
Voo

10
@voo - так? Яка мова зробить додавання нового методу (і змінити реалізацію такої самої точної поведінки) не бути сумісною назад?
Теластин

3
@Telastyn іноді може бути складним додати методи, щоб сказати веб-сервіси. Деякі клієнти розмовляють, змінюючи, наприклад, WSDL, раптово відмовляються спілкуватися з сервером. Це проблема впровадження у клієнта, але якщо клієнт є важливим, ви не хочете засмучуватись, він може дуже запобігти зміні інтерфейсу.
jwenting

17
@Telastyn Якщо ім'я методу неправильного написання знаходиться в інтерфейсі (як у типі інтерфейсу, який використовується у Delphi / Java / C #), додавання правильно написаної версії імені, ймовірно, порушить усі існуючі реалізації зазначеного інтерфейсу.
Розчарований

52

Є випадки, коли вам слід уникати таких рефакторинга:

  1. Якщо метод використовується в загальнодоступному інтерфейсі. Канонічний приклад - неправильне написання реферала в HTTP- реферері , неправильне написання зберігається, оскільки зміна правопису зараз матиме занадто багато наслідків.

  2. Якщо база коду не покрита жодними тестами. Будь-яке рефакторинг повинно проводитися на тестованому коді, щоб мати можливість тестувати регресію. Рефакторинг бази коду, який не проходить тести, є особливо ризикованим. Якщо у вас багато часу, почніть з додавання тестів; якщо ви працюєте під тимчасовим тиском, ризикувати введення тонких помилок - це не найкраще, що потрібно зробити, якщо ви хочете відправити вчасно.

  3. Якщо метод можна використовувати незвичним чином , що робить його використання практично неможливими (через Ctrl + F або за допомогою автоматизованого інструменту рефакторингу). Наприклад, у C # метод можна викликати через Reflection, що робить діалогове вікно Rename Visual Studio неефективним. У JavaScript також eval()важко знайти функцію, яку називають всередині . У PHP змінні змінні можуть викликати проблеми.

  4. Якщо розмір проекту величезний і метод може бути використаний іншими командами. Це схоже на перший пункт, тобто інтерфейс, який ви надаєте іншим командам, можна вважати загальнодоступним інтерфейсом.

  5. Якщо ви маєте справу з критично важливим для життя проектом. Швидше за все, помилка написання не надто важлива для виправдання декількох місяців оформлення документів для того, щоб змінити назву методу і переконатися, що він не спричинить жодного пацієнта в десять разів більше дозволеного опромінення або будь-якого шатлу, щоб прорахувати його швидкість.

У будь-якій іншій ситуації сміливо перейменуйте метод.


1
+1 за коментар, в якому згадується Роздум, мене це покусало не раз.
DaveShaw

33
Якщо ваш життєво важливий проект є досить крихким, що найменший рефакторинг, можливо, когось вб'є, він досить крихкий, що ніхто не повинен довіряти цьому своєму життю. Як ви коли-небудь будете впевнені, що ваша нова функція чи спрощений інтерфейс користувача не ввели небезпечні для життя помилки, якщо ви навіть не можете перейменувати метод?
user2357112

2
Аналогічно, якщо одна змінена назва методу спричиняє кілька зайвих місяців оформлення документів (а не, скажімо, в основному опікуються паперовими документами за всі інші речі, що змінюються одночасно), тоді баланс програмування та оформлення паперу перекошений на декілька порядків, і неможливо зробити якісь значні покращення без зміни системи.
user2357112

8
@ user2357112: Я ніколи не говорив, що найменший рефакторинг, можливо, когось вб'є. Йдеться не про те, щоб когось убити, а про те, щоб зробити все можливе для пом’якшення решти 0,001% ризику виникнення помилки. Для цього потрібен офіційний проф. Для цього потрібно кілька шарів тестування. Для цього потрібен формалізм. Це забороняє "Я хочу швидко перейменувати цей метод, сподіваюся, він спрацює!" поведінка. У життєво важливих проектах використовуються методи, які можна вважати повною тратою часу та грошей на будь-який бізнес-додаток. Ось чому вони такі надійні (і дорогі).
Арсеній Муренко

5
@ user2357112: як зазначав MainMa, мова не йде про випадкові бізнес-додатки. Йдеться про особливий вид програмного забезпечення, яке проходить випробування та перевірку. Що робити, якщо метод десь викликається відображенням? Що робити, якщо якийсь інструмент для компіляції перед / після публікації щось робить із цим? Що з документацією? А як щодо інших команд, які його використовують? Вони використовують рефлексію? Що робити, якщо ... Реальне життя іноді може бути досить складним. І іноді краще залишити назву методу недоторканою, а не перевіряти, чи є якісь наслідки бездоганним способом.
dagnelies

30

Я робив це кілька місяців тому (з різних причин). Кроки, які я зробив (мова була Perl):

  1. Перейменуйте метод. Псевдонім старого імені до нового імені (це не повинно порушувати жодного коду, оскільки метод може бути викликаний будь-яким ім'ям).
  2. Повідомте решту розробників про зміну імені та чому, сказавши їм використовувати нове ім'я відтепер.
  3. Обріжте базу коду за старим іменем, виправте будь-які події.
  4. Увійдіть до будь-якого використання старого імені (використання старого імені все ще має працювати зараз). Виправте ці випадки.
  5. Зачекайте (виконуючи 4), поки в журналі не з’являться більше записів.
  6. Розбийте псевдонім. Створіть метод, використовуючи стару назву, яка кидає фатальний виняток із повідомленням про зміну імені.
  7. Через деякий час видаліть метод зі старою назвою.

    Звичайно, ваш пробіг буде відрізнятися.


Одне вдосконалення - не покладайтеся на grep, щоб знайти користувачів старого імені, а також увійдіть всередину експедитора.
Бен Войгт

@BenVoigt Це не те, що робить №4?
Боб

6

Хороший спосіб не зламати будь-який існуючий код - це ланцюжок нового імені методу до старого в такому, як

private void MyNewMethodName()
{
    TheOldMethodName();
}

а потім позначте старий метод як застарілий (якщо ваша мова це підтримує). Таким чином, будь-який існуючий код все одно буде працювати, і ви можете поступово виводити всю стару орфографічну помилку зі своєї кодової бази. Згодом ви навіть можете скопіювати / вставити тіло методу в новий метод і видалити старий.

/ Редагувати Як говорив ivo у коментарі: Ще кращою справою було б переміщення коду з TheOldMethodNameу MyNewMethodNameта виклик нового методу зі старого. Цей також має перевагу, щоб допомогти розробнику обернутися головою, куди належить код.


2
Я згоден з вашим методом; Я б робив те саме. Це найбільш розумний, зрозумілий і безпечний метод рефакторингу. Що також може бути приємним способом - перемістити код зі старого методу в новий метод і змусити старий використовувати новий метод. Якщо база даних коду є декількома ітераціями вниз за часовою шкалою, потрібно лише видалити старий застарілий метод.
Іво Ліммен

1
@IvoLimmen Це дійсно гарна пропозиція. Таким чином люди отримують ще більше голову, використовуючи новий метод, і це видалить попередження від застарілого виклику до старого методу зсередини нового. Я додам це до своєї відповіді.
Ремі

1

Перейменування методу:

  • Зробіть це за допомогою рефакторингу, щоб у вас було більше роботи, ніж ви хочете
  • Якщо ваш IDE підтримує автоматичне завершення, використовуйте його при посиланні на цей метод

Це два варіанти, на які можна піти. Я вважаю за краще автоматичне завершення (наприклад, ID Eclipse IDE) і не потрібно вводити назву методу. Ідеш на перейменування; просто переконайтеся, що ви дізнаєтесь, що викликає цей метод, і змініть прямі посилання в кожному місці. Рефакторинг стане вашим другом для цього, але будьте обережніші при цьому.


0

Як правило, рекомендую так, перейменуйте його.

Інші відповіді тут перераховують вагомі причини, чому ви, можливо, не хочете перейменовувати його, тому, якщо ви опинитесь в одній такій ситуації, ви можете створити новий метод з відповідним ім'ям та реалізацією та змінити старий метод, щоб викликати новий метод . Потім позначте старий як застарілий, якщо ваша мова підтримує його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.