Які переваги префіксації імен параметрів функції за допомогою p *?


22

Я часто бачу проекти (в проектах Java та команди, що використовують Eclipse), з якими встановлюються параметри функцій префікса p.

Наприклад

public void filter (Result pResult) ...

Я особисто не бачу в цьому ніякої користі, але хотів би знати, що таке міркування. Найкраще пояснення, про яке я чув, - це розрізнити назву однакових названих полів. У мене є проблеми з цим поясненням, але я можу зрозуміти суть.

Відповіді:


34

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


10
Система угорських позначень - жахлива практика, якої слід уникати. З іншого боку, деякі угорські нотації про додатки можуть бути корисними (наприклад, для запобігання неправильному введенню небезпечних даних користувачів).
Кейсі Кубалл

7
@Darthfett: Навіть така угорська нотація, схоже, намагається реалізувати спеціальну систему ручного введення безпосередньо у назвах змінних. Просто використовуйте гарну статичну мову і автоматично відстежуйте такі системи, як ця для вас!
Тихон Єлвіс

1
@WyattBarnett Systems Угорська не дає програмісту корисної інформації із сучасними IDE. Угорські програми можуть зменшити головні болі в оглядах кодів при правильному застосуванні.
Кейсі Кубалл

2
@TikhonJelvis Не всі мови підтримують типові налаштування типу (наприклад, C ++ typedefs ). Щодо мов, які це підтримують, ви абсолютно праві.
Кейсі Кубалл

4
@Darthfett: У C / C ++ ви можете просто загорнути його в struct/ unionз одним елементом.
Maciej Piechotka

9

Як ви підозрюєте, це уникати зіткнень імен між назвою параметра та іменами члена або локальної змінної. Змінні учасники іноді отримують префікс з тієї ж причини (наприклад, m_result). Особисто я вважаю за краще використовувати thisпрефікс для змінних членів, якщо є зіткнення імені. Він вбудований у мову, і всі вже знають, що це означає.


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

5

Я використовую префікс параметра лише тоді, коли параметр призначений для присвоєння змінної члена, наприклад конструктору або сеттеру.

Paint (newColor) {
  color = newColor;
}

Для мене я вважаю, що використання іншого імені змінної є сліпуче очевидним, ніж використання префікса "цей".

В інших ситуаціях я уникаю використання параметра, який можна легко сплутати зі змінною члена.

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


Особисто я вважаю за краще скоротити ім'я параметра в такому випадку (наприклад, Paint (clr) { color = clr; }). ... Як правило , багатозначності багато, хоча, color -> clrзокрема, може бути виняток.
Час Джастіна - Відновіть Моніку

1

Якщо ви робите стандарт, щоб використовувати "p" як префікс з кожним іменем параметра параметра, ви можете легко розпізнати параметри методу в решті тіла методу.

Це економить ваш час на пошук параметрів методу. Ви можете легко налагодити свій код.


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

1

Короткий - ця практика ускладнює читання коду.

Довго - я стверджую, що це погана практика, яка використовується лише для підтримки інших поганих практик. Розглянемо кілька причин, чому використання таких префіксів може вважатися корисним:

  • Уникнення зіткнень у змінних імен

    • Чи імена ваших параметрів виражають саме такі параметри? Якщо у вас є параметр і поле класу, які "абсолютно однакові", вам параметр не потрібен.
    • У цьому випадку має сенс використовувати лише префікси для конструкторів класів, як новий префікс *, описаний у відповіді Аарона. Це також може бути корисним для методів встановлення, наприклад

    public void setHeight(int newHeight) { this.height = newHeight; }

  • Методи беруть багато параметрів, оголошують багато змінних, і ми можемо легко забути, який з них є параметром.

    • Як описано вище - проблема полягає в кількості змінних.
    • Програма, мабуть, недостатньо структурована. Перевірте, чи всі змінні є "незалежними" - можливо, вони повинні бути організовані в структурах або класах. Можливо, весь обчислення чи процес слід загорнути в окремий клас, щоб оперувати такою кількістю змінних.
    • Навіть якщо вам потрібна була така кількість змінних - вони повинні використовувати значущі імена, а префікс стоїть між вами та змістовною частиною.
  • Методи дуже довгі, і вам потрібно використовувати префікси, щоб відслідковувати, що таке параметр.
    • Проблема полягає в тривалості методів. Якщо програма написана добре, ви завжди повинні бачити заголовок методу та його тіло на одному екрані.
    • Спробуйте розділити метод на менші блоки.

За винятком деяких конкретних випадків, додавання префіксів параметрів допомагає лише при симптомах і не вирішує фактичних проблем.


0

Я фанат iParam для in, а oParam для параметрів. Я б сказав, cParam для змін, але це не прийнятно


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