Чи рекомендується використання однобуквенних змінних? [зачинено]


13

Чи рекомендується використання Java-змінних в Java? У фрагментах коду чи навчальних посібниках ви часто їх бачите. Я не можу уявити, що їх використання рекомендується, оскільки це робить код порівняно важчим для читання, і я ніколи не бачу їх використання в інших мовах програмування!


3
Так і ні. Повністю залежить від ситуації.
Захід




1
Не завжди код важче читати. Наприклад, коли ви реалізуєте код на основі математичних рівнянь, зазвичай має сенс використовувати ті ж назви змінних, що й у рівняннях. (Коментарі вказують на папір / текст, де можна знайти оригінальні рівняння, або якщо ви такі, як я, іноді ви включаєте для них код LaTeX.)
jamesqf

Відповіді:


32

Правильно називати речі важко. Дуже тяжко. Якщо ви дивитесь на це іншим способом, ви також можете вважати, що важливі правильно названі речі. (Інакше навіщо б ти витратив зусилля на його назва?)

Але іноді назви речей просто не важливі. Ось чому у нас є такі речі, як анонімні функції ("лямбда"), наприклад: адже іноді просто не варто цього називати.

Є чимало прикладів, коли одноіменні (або дуже короткі) назви змінних підходять:

  • i, j, k, lДля індексів циклу
  • kі vдля ключа та значення на карті
  • nдля числа (наприклад, в Math.abs(n))
  • a, b, cДля об'єктів довільної (наприклад , в max(a, b))
  • eдля елемента в загальному for eachциклі
  • f для функції у функції вищого порядку
  • p для функції предиката у фільтрі
  • T, T1, T2, ... для змінних типу
  • E для змінних типів, що представляють тип елемента колекції
  • R для змінної типу, що представляє тип результату функції
  • exза винятком у catchпункті
  • op для операції на карті чи в складку
  • додаючи лист sдля позначення множини, тобто колекції (наприклад, nsдля колекції чисел, xsі ysдля двох довільних колекцій родових об'єктів)

Я ніколи не бачу їх використання в інших мовах програмування!

Вони дуже поширені майже в усіх мовах, які я знаю (і, можливо, і в тих, кого я не знаю.) Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle, D, Go, C ++, C, ти його називаєш.


5
-1 Використання імен 1-літерних змінних - це ліниве програмування. Іноді це добре , щоб бути ледачими, але якщо ви отримуєте до kі lіндексів циклу, це занадто далеко (ви не повинні мати , що багато вкладених циклів , щоб почати с; витяг їх функції) . Особисто я ніколи не використовую більше однієї змінної 1 літери на функцію, але знімаю по 0.
BlueRaja - Danny Pflughoeft

Також lабо lenвикористовується для довжини та arrдля масиву (наприклад:) for(var i=0; l=arr.length; i<l; i++). Крім того, він fnможе використовуватися замість f, коли ви посилаєтесь на функцію.
Ісмаїл Мігель

4
@ BlueRaja-DannyPflughoeft Я вважаю за краще це як ефективне програмування. Jorg міг би розширитись, коли одні букви підходять, не лише де, але якщо чесно, я думаю, що більшість програмістів малюють лінію по-різному. Що стосується циклівних індексів, я можу стверджувати, що будь-який код, де індекси не потребують імен з семантичним значенням, є досить простим, щоб виправдати багаторівневе введення через непотрібне вилучення. Вони також можуть бути використані в окремих петлях, щоб уникнути можливих проблем із визначенням масштабів, які виникає Нельсон .
Ліліенталь

2
@Lilienthal: Код повинен бути ефективним для читання, а не ефективним для запису. Зазвичай вони однакові, але не завжди, як у цьому випадку.
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft Не у всіх програмах немає, але я не бачу нічого поганого в пропозиціях Йорга. Як заявив Кілліан : "Що-небудь більше не може зробити семантику більш очевидною, але для читання потрібно набагато більше часу". Але це, мабуть, багато в чому питання особистих уподобань та стилю.
Ліліенталь

20

Якщо ваш цикл не робить нічого, крім використання змінної для підрахунку

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

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

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

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

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

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


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

13
@Michael: На мою думку, програмування жаргону - це його власна мова, це не англійська мова. І в цій мові i- це власне слово з точно визначеним значенням, а саме "індекс, про який вам не потрібно занадто хвилюватися". Але я думаю, це питання знайомства. Якщо ви читали багато Haskell, ви звикли читати , mяк монади , в fякості функтора , xв якому - то об'єкті , xsа список xз і так далі.
Йорг W Міттаг

2
Просто справді величезний застереження. Імена змінних для однієї літери в порядку, лише якщо мова має правильне масштабування змінної. Ви, очевидно, запитаєте "Яка мова не має належного масштабування?". Ну, мені знадобилося три години, щоб зрозуміти, що JavaScript не охоплює змінні в циклі FOR. Спробуйте його за допомогою циклу for для циклу всередині для циклу, використовуючи те саме ім’я змінної. Це підірве ваш розум.
Нельсон

@Nelson: Це питання, і ця відповідь, стосуються Java. Очевидно, що різні мови можуть мати дещо різні міркування. (JavaScript не є такою ж мовою, як Java.)
ruakh

Я всі за однобуквенні імена змінних, коли вони мають найбільше значення, але я не згоден, що iце "найкраще ім'я, яке ви могли використовувати" для циклу, який використовує змінну лише для підрахунку. У цьому випадку я вважаю за краще countвикористовувати назва змінної: миттєво зрозуміле. for (int count = 0; count < 10; count++)або while (count--).
Тодд Леман

4

Читаючи код у відповіді Кіліана, я не думаю, що "є цикл, і є змінна, і вона має тип int, і вона має ім'я, і ​​ім'я i, і воно ініціалізовано на 0,. .. ". Я просто думаю "петля ...", де три крапки означають неважливі деталі, про які я навіть не думаю. На думку мого програміста, ця змінна насправді не існує, це лише артефакт, який я маю набрати, як for (;;) {}, що робить це циклом.

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


Я повинен додати, що в такому вигляді конструкції мене часто спокушає використовувати навіть не для i, але _для очевидно безглуздої змінної. Але не всі знайомі з Prolog, і це, мабуть, викликало б більше уваги, ніж прибирає.
Кіліан Фот

Вам також потрібно врахувати, як використовується змінна всередині циклу, а не лише в for (...)заголовку.

@KilianFoth: я вважаю, що він також використовується таким чином у Haskell, ML, F # та Scala, я вважаю. І в Ruby, незважаючи на те _, що це юридичний ідентифікатор, як і будь-який інший, нещодавно було змінено, що невикористані локальні змінні, названі _(або починаючи з _), не генерують попередження про "невикористану локальну змінну", хоча Ruby зазвичай попереджає про них.
Йорг W Міттаг

-1

Якщо ви посилаєтесь на букви i, j, k як індекси в циклі, це звичайна практика в Java та інших мовах програмування. Хоча там, ймовірно, краще використовувати цикл для кожного стилю, наприклад

for(User user: users) {
  doSomethingWithTheUser(user);
}

замість

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

У Java цей стиль циклічного введення був представлений лише нещодавно. Це може бути причиною того, що ви більше помічаєте це для Java, оскільки перегляд індексів, який раніше був найпоширенішим способом циклічного перегляду масиву чи списку.

Є кілька інших випадків, коли одна буква може бути доречною, наприклад, при здійсненні математичної функції, коли окремі букви, такі як n, x або y, вже можуть бути загальними. Але взагалі ні, назвіть свої змінні чимось значущим.


5
"У Java такий стиль циклічного введення був представлений лише нещодавно" ... як і десятиліття тому? ( Java 5 вийшов у 2004 році )
meriton

1
Так, це зовсім недавно. Ні, я не старий. Заткнися. Чортові діти сходять з моєї галявини. Є ще багато застарілих Java-програм із попереднього Java 5. А ще більше Java-програмістів, які вивчили мову на Java 1.4 і відмовляються оновити, як вони роблять справи. І ще більше зразків коду в Інтернеті, які відносяться до початку 2000-х (так, у нас тоді був Інтернет; ми просто називали його Web 2.0).
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.