Найти в Дзене

Фу! Откуда это в программировании?

Оглавление

Многие новички в программировании очень удивляются, когда встречают в примерах кода на разных сайтах какие-то foo, bar, baz и прочие одни и те же названия для переменных. Что это? Откуда это? Давайте разбираться.

Фу, ну и бар

Представим ситуацию: новичку интересно узнать, как сделать так, чтобы программа взяла две переменные, точнее, их значения, и записала минимальное из этих двух значений в первую переменную. Он находит такой пример:

if (foo > bar){
foo = bar;
}

Или, в случае Python, так:

if foo > bar:
foo = bar

Вот две переменные, foo и bar. В foo по условиям задачи должно записываться меньшее из двух значений. Если значение в bar меньше, чем в foo, то оно минимальное, записываем его в foo. А если значение в foo меньше, чем в bar, то и делать ничего не надо.

Но почему переменные названы не number1 и number2, например, а именно foo и bar? Чтобы стало понятнее, я заменю эти имена на другие, и потом ещё раз объясню, что это всё значит.

Заменим, чтобы стало понятно

-2

Заменим загадочные имена на другие, вроде этого:

if (someVariable > someOtheVariable){
someVariable= someOtherVariable;
}

или, в случае Python, так:

if some_variable > some_other_variable:
some_variable = some_other_variable

Кто знает английский, тот уже может понять, но давайте я выкручу это на максимум и напишу так:

if (kakayaToPeremennaya> kakayaToDrugayaPeremennaya){
kakayaToPeremennaya = kakayaToDrugayaPeremennaya;
}

или, в случае Python, так:

if kakaya_to_peremennaya> kakaya-to-drugaya-peremennaya:
kakaya_to_peremennaya= kakayaToDrugayaPeremennaya

Итак, теперь я назвал обе переменные «какая-то переменная» и «какая-то другая переменная». Ведь то, о чём я пишу, это какой-то абстрактный пример, не привязанный ни к какому конкретному случаю. Так что имена переменных могут быть вообще какие угодно, вот я и назвал их «какая-то переменная» и «какая-то другая переменная».

Но это очень длинные, громоздкие имена. Код будет раздуваться в ширину из-за такого, три переменных в одной строке и всё. Лучше бы переменные называть как-то покороче. И как раз издавна в американских вузах и организациях пошла традиция называть такие переменные не «какаяТоПеременная1», «какаяТоПеременная2» и т.д., а foo, bar, baz. Если нужно больше переменных трёх, то есть разные варианты, например, такие:

qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud, wibble, wobble, wubble, flob.

Что общего у всех этих слов? А то, что сами по себе они абсолютно ничего не значат. Исключение составляет слово bar, у которого в английском много значений, но именно в связке с foo это слово тоже не значит ничего.

Вот и получается, что переменные, функции, файлы, пользователей и многое другое в оторванных от практики примерах называют foo, bar и т.д., если подразумеваются, что на их месте могут стоять любые переменные, функции и т.д. Эти вот слова-заменители для чего угодно и называются метапеременными.

В промышленной, уже конкретной разработке есть ещё одно значение у метапеременных: очень часто этими словами, или начинающимися с них, называют что-то, от чего можно спокойно избавиться. Например, файл, который можно спокойно удалить.

Почему именно foo и bar?

Были и другие варианты, но так получилось, что вариант foobar стал наиболее распространённым — так сложилось. А вот откуда вообще взялись эти два слова, это отдельный не очень приличный момент.

-3

На сто процентов никто не может утверждать происхождения этих двух слов, но очень популярна теория, что foobar происходит от FUBAR. Это первые буквы фразы из 5 слов, популярной у некоторых американских военных во Второй Мировой войне. Я не буду приводить эту фразу, но приличным образом она переводится, как «разбито в хлам». Другой смысл той же фразы — «тотально облажался/облажались» (перевод примерный).

Звучит всё это логично, так как инженеры и айтишники любят порой иронично пошутить о том, что всё сломано, работает как попало, держится на соплях и т.д. и из-за этого тотально ломается. Но вообще смысла в поиске происхождения нет, так как как раз концепция метапеременных, ещё раз — в том, что эти слова не значат ничего.

Критика использования бессмысленных имён

-4

Некоторые профессионалы критикуют использование ничего не значащих слов вроде foo и bar для обозначения переменных, функций, файлов и т.д. По их мнению, лучше даже в таких абстрактных примерах, давать такие имена, которые содержат максимальную. Например, если речь о каких-то двух числах, то называть их number1 и number2 или хотя бы num1 и num2. Если целое число, то называть переменную для него intNum/int_num. Если нужно назвать файл — file, file1, myFile и т.д.

Правы ли они или лучше использовать foobar — это зависит от контекста и вашего мнения.

Подводим итоги:

foo, bar, baz и другие подобные имена ничего не значат, в программировании означают «какая-то переменная 1», «какая-то переменная 2» и т.д. Их используют в абстрактных примерах кода, для обозначения переменных, функций, файлов и т.д., которые могут быть в принципе любыми. Такие слова-заменители называются метапеременными.