Чи погана практика називати невикористану змінну одним підкресленням?


44

Часто, коли синтаксис мови вимагає, щоб я назвав змінну, яка ніколи не використовується, я буду називати її _.

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

Поширений приклад того, як я це роблю, - іменування підзапитів у SQL.

SELECT *
FROM
(
    SELECT *
    FROM TableA
    JOIN TableB
        ON TableA.ColumnB = TableB.ColumnB
    WHERE [ColumnA] > 10
) _ --This name is required, but never used here
ORDER BY ColumnC

Інший приклад - це змінна петля, яка не використовується.

array = [[] for _ in range(n)] # Defines a list of n empty lists in Python

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

Мої колеги не згодні. Вони кажуть, що навіть мати єдине (алфавітне) ім'я символів краще, ніж _.

Я помиляюся? Чи погано це робити?


4
Я думаю, що імена змінних повинні слідувати теорії інформації, тобто довжина - це взаємна ймовірність журналу їх використання (загальні змінні мають короткі назви). Єдине алфавітне письмо здається невірним шляхом.
dan_waterworth

2
@dan_waterworth Використання одиночних або подвійних символів як псевдонімів таблиці - досить поширена практика в сценаріях SQL. Оскільки вам зазвичай доводиться писати багато [table].[column]ідентифікаторів, це допомагає легко читати просто використовувати [T].[column]. Це залежить від сценарію, звичайно. Невеликий вибір, як це, ідеально, але якщо сценарій був дуже великим, я можу використати більш описові назви.
CodexArcanum

5
Я вважаю за краще ви використовували "манекен". Це кричить мені, що вони там є, тому що мова вимагає змінної, яка не має семантичного контексту поза цими кількома рядками. _ не читає людині добре. (одна з причин, що я ненавиджу PERL - я не можу це ввести чи прочитати)
Кріс Кадмор

1
Побічна примітка: те, що ви називаєте, є похідною таблицею , а не підпитом.
Нік Чаммас

2
Ключове слово var в c # не має цього значення, це лише звичайне оголошення змінної, де виводиться тип.
Франческо Де Вітторі

Відповіді:


60

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


13
+1. dummyбуло б добре, joined_abбуло б краще.
Blrfl

5
+1, Є умова, де я працюю над використанням '_' для невикористаних змінних. Я думаю, що це гарна конвенція, але я згоден з цією відповіддю для справи ОП. В ідеалі кодові бази повинні виглядати так, ніби їх написала одна людина.
dan_waterworth

20
"_" - добре відомий стандарт з Python.
Ніл Г

2
Якщо ваша компанія використовує будь-який Perl, з іншого боку, використання $ _ може викликати іноді дивовижну поведінку.
Plutor

2
У пролозі підкреслення вказує на те, що змінна буде анонімною і не використовується.
Іван

44

Я б сказав, що це прийнятна практика. Це рідкісний випадок, коли я вважаю, що більшість є помилковими та потребують оновлення своїх знань про останні ідеї програмування. У багатьох мовах, зокрема функціональних мовах на основі ML, таких як Haskell і OCaml, надзвичайно часто використовувати _як "невикористовувану" змінну. Навіть Lua, який не пропонує явної мовної підтримки для неї, заохочує використання _як заповнювача за умовами.

Кілька мов (Haskell, Lua та DI придумують верхню частину моєї голови) також пропонують умову, коли змінні, що призводять до підкреслення, не генерують попередження компілятора про "невикористану локальну змінну", що робить _найкоротше невикористане ім'я змінної. Ви можете використати щось на кшталт, _unusedале я згоден з вами, що це просто захаращує.


У конкретному випадку SQL я вважав це, і його колеги можуть бути тут правильними. Я дуже часто використовую одну велику літеру для псевдонімів таблиці (і часто R (esults) для підселектів). Я думаю, що використання *у selects дуже погана річ, тому що якщо таблиця змінить, ваш набір результатів змінюється і несподівано. Тому зазвичай мені потрібен псевдонім одного символу, щоб ідентифікувати вибрані стовпці. Якщо ви перестаєте використовувати *, ви перестанете потребувати "невикористаного" імені.
CodexArcanum

11
Строго кажучи, принаймні в Haskell _- це модель, а не змінна. Це тонка різниця, але це означає, що ви можете використовувати її кілька разів у чомусь подібному (x, _, _) = ..., тоді як спроба зв’язати одну і ту ж змінну кілька разів буде помилкою.
Хаммар

12

У Python _, безумовно, прийнятний. Однак він може конфліктувати з gettextпсевдонімом _().

Інші загальні конвенції є dummy, unused; поодинці або як префікс.

Деякі інструменти аналізу коду відомі цим умовам і не видають невикористаних попереджень змінних:

  • PyLint для _абоdummy
  • PyDev для будь-якої змінної , починаючи з _, unusedабоdummy

2
Також використання _для фіктивних змінних у python зіткнеться з _останнім повернутим значенням. Наприклад, в перекладачі, якщо ви робите це 5*5по рядку 1; то в другому рядку _буде значення 25. Однак якщо потім встановити x,_ = (3,'not used'), ви побачите, що _зараз not usedзамість останнього повернутого значення до вас del _. Напевно, ви не повинні використовувати _останнє повернене значення в реальному коді; але це часто зручно в перекладачі при спробах нових речей.
dr Jimbob

4
Ну, _як останнє повернене значення працює лише в інтерактивній оболонці.
vartec

Те саме стосується і Луа. Використання _ є стандартною практикою
sylvanaar

11

Залежно від екосистеми, в якій цей код буде жити. Якщо _прийнятим стандартом для позначення "фіктивної змінної" / "невикористаного виводу", то, будь-ласка, дотримуйтесь цього. Якщо це не так, з’ясуйте, що є, і використовуйте це.

Деякі мови програмування (наприклад, Haskell) навіть мають цей "спеціальний" ідентифікатор, вбудований у їх синтаксис саме для тих цілей, які ви згадуєте.


5

Обережно, _ вже має внутрішнє значення в деяких мовах

На Python:

9.6. Приватні змінні та місцеві класи

введіть опис посилання сюди "Приватні" змінні екземпляра, до яких не можна отримати доступ, за винятком усередині об'єкта, не існує в Python. Однак існує умова, за яким дотримується більшість кодів Python: ім'я з префіксом підкреслення (наприклад, _spam) слід трактувати як непублічну частину API (будь то функція, метод чи член даних) . Це слід розглянути деталі реалізації та підлягати змінам без попереднього повідомлення.

Також є ще одна згадка в PEP 8 (Посібник зі стилю для Python Code):

Описово: називання стилів

_single_leading_underscore: слабкий показник "внутрішнього використання". Напр. З M import * не імпортує об'єкти, ім'я яких починається з підкреслення.

В C #:

Зазвичай використовується для позначення приватних змінних, які мають загальнодоступні / внутрішні властивості. Але ця практика, як правило, дивиться в ці дні .

У JavaScript:

Існує бібліотека під назвою underscore.js, яка використовує підкреслення як префікс для нестандартних розширень прототипу.

Приклад:

var object = { some:'stuff' };
var newObject = _.clone(object);

Що призводить мене до моєї точки зору. Що не так з класичними умовами змінної заповнювача.

var i, j, k, l; // iterator placeholders
var x, y, z, xx, yy, zz // value placeholders
var foo, bar, bas, fixx, buzz, qux, etc... // demonstration placeholders

Навіщо використовувати власну конвенцію, яку деякі можуть неправильно трактувати, коли вже існує маса загальних конвенцій?


У Scala: це символ підстановки / заповнювача, але як заповнювач можна згадати його лише один раз .
Рекс Керр

@RexKerr Цікаво. Сміливо відредагуйте це у відповідь, якщо хочете. Я б, але я не знайомий зі шкалою.
Еван Плейс

Коментар повинен робити. Усі, хто використовує Scala, знають, і той, хто не використовує Scala, мабуть, не мав би сумісності Scala у верхній частині свого списку причин / не робити щось.
Рекс Керр

Я думаю, що використання однієї з таких заповнювачів "конвенції" для невикористаних змінних було б поганою практикою, тому що спочатку я змусив би подумати, "чому, чорт, цей хлопець не назвав цю річ кращою ??" і через деякий час я б тоді виявив, що змінна не використовується.
igorsantos07

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

2

Я використовую "манекен" для подібних речей. Або "лайно", якщо я просто щось тестую :) Назвіть свої змінні, щоб описати, що вони є. Якщо вони манекени, невикористані змінні, назвіть їх як таких.


0

Я вважаю це поганою практикою, оскільки

  • у вашому коді не повинно бути невидимої змінної. Якщо ви вважаєте, що слід, можливо, обговорити причину.

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

(Я не знаю Python: чи потрібна ця конструкція?)


2
Якщо ви використовуєте його для фільтрації декількох повернень, то це також може використовувати його для аргументів фіктивних функцій. Насправді різниці між ними не так багато: у функціональних мовах, що відповідають шаблону, ви можете писати let (a,b,_) = f(x,y,z)так само добре let f(x,y,_) = (g(x),h(x),g(y)), або будь-що інше. - І, так, часто корисно мати параметри манекена: не як єдине визначення функції, а для поліморфної функції або тієї, що має альтернативні визначення шаблону, що часто робиться природно.
близько

1
Ваш другий пункт суперечить вашому головному моменту: в Go, це по суті означає те саме, що "я не маю користі для цього значення".
Кейсі Кубалл

0

Це може бути синтаксично дійсним, і воно може бути нормальним як частина стандарту.

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


0

Я думаю, що це неправильно, оскільки:

1) Це важче помітити, оскільки не так багато пікселів.

2) Якщо їх більше _, як ви знаєте, хто з них? - чи новий розробник "дотримувався правил" і зберігав їх використання вкрай локальним за обсягом?

3) Це не корисна практика. Використання одноіменних імен змінних настільки стара школа (тобто моя початкова освіта!). Я побачу їх ... а потім додаю коментарі, щоб сказати, що робить код, і це погана практика в сучасному світі. Я максимально використовую довгі імена змінних, тому кожен, незалежно від рівня програмування чи знайомства з кодом, може просто "прочитати" майже як англійська мова. Використання 1 літерних імен є надзвичайно поширеною практикою як для старшого коду, так і для старших програмістів (знову ж, включає мене), але це не робить його нормальним.


9
"як ти знаєш, який з них" ти не робиш : саме в цьому справа, ти не використовуєш змінну. Тому також не має значення, чи _використовується вже у зовнішній області; це може бути тіньовим (або будь-яка ваша мова в таких випадках), але жодна з них насправді не використовується.
близько

0

Щоб уникнути зіткнень у просторі імен та дозволити налагодження, у випадку, якщо назва змінної є вашою єдиною підказкою, можливо, буде краще назвати її "joined_ab_unused".

Натхненний Бірфлом.


0

Так, це погана практика з двох причин:

  1. Префіксація невикористаної змінної за допомогою підкреслення не є загальноприйнятим стандартом. Ймовірно, "ініційовані" будуть ігноровані.
  2. Я бачив, як деякі люди вказують змінні приватних членів із підкресленням, і ваш стандарт сильно заплутає таких людей.

0

Те, що ви намагаєтеся зробити, - це кодувати в приємнішій версії SQL, яка не має проблеми змусити вигадувати ім'я для чогось марного.

Підкреслення майже непомітне, тому схоже, що ви на цій мові. Якби тільки ідентифікатор пробілів міг використовуватись як ідентифікатор, це було б ідеально, правда?

Але ви не з іншої мови, і те, що ви робите, не є чистим способом зробити розширення мови.


0

Це залежить від мови. У Java , так, це погано, і це може бути небезпечною тенденцією додавати до свого коду, значною мірою тому, що інструменти, які використовують відображення, не дуже добре підкреслюють підкреслення, оскільки вони знаходяться поза умовами імен змінної Java. У python це теж погано, але не так вже й погано. У clojure - це 100% нормально, а насправді його ідіоматично використовувати _ в якості місць, що займають місця, у висловленні let.

Пам’ятайте, що кожна мова має власний синтаксис і набір ідіом, тому ви повинні оцінювати добро / погано за цими ідіомами, а не за абсолютними значеннями.


5
Я не погоджуюся, що це погана практика в python. Це широко зрозуміла конвенція
Даніят

0

Це буде погано в perl, який використовує $ _ (а іноді і _) як спеціальну змінну.

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


0

Я б уникну підкреслення на початку вар, якщо ви не впевнені, що вони не схильні вказувати щось інше на певній мові чи рамці для важкого використання. Наприклад, у Python подвійне підкреслення має тенденцію вказувати на магічний var. У бібліотеках JQuery та інших JS єдине підкреслення має тенденцію вказувати на резервну змінну перезаписів простору імен. Це також популярна угода про іменування файлів, що включають файли, які, в свою чергу, мають тенденцію переходити до коду, який обробляє, включає форму var.

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