Многие новички в программировании очень удивляются, когда встречают в примерах кода на разных сайтах какие-то 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? Чтобы стало понятнее, я заменю эти имена на другие, и потом ещё раз объясню, что это всё значит.
Заменим, чтобы стало понятно
Заменим загадочные имена на другие, вроде этого:
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 стал наиболее распространённым — так сложилось. А вот откуда вообще взялись эти два слова, это отдельный не очень приличный момент.
На сто процентов никто не может утверждать происхождения этих двух слов, но очень популярна теория, что foobar происходит от FUBAR. Это первые буквы фразы из 5 слов, популярной у некоторых американских военных во Второй Мировой войне. Я не буду приводить эту фразу, но приличным образом она переводится, как «разбито в хлам». Другой смысл той же фразы — «тотально облажался/облажались» (перевод примерный).
Звучит всё это логично, так как инженеры и айтишники любят порой иронично пошутить о том, что всё сломано, работает как попало, держится на соплях и т.д. и из-за этого тотально ломается. Но вообще смысла в поиске происхождения нет, так как как раз концепция метапеременных, ещё раз — в том, что эти слова не значат ничего.
Критика использования бессмысленных имён
Некоторые профессионалы критикуют использование ничего не значащих слов вроде foo и bar для обозначения переменных, функций, файлов и т.д. По их мнению, лучше даже в таких абстрактных примерах, давать такие имена, которые содержат максимальную. Например, если речь о каких-то двух числах, то называть их number1 и number2 или хотя бы num1 и num2. Если целое число, то называть переменную для него intNum/int_num. Если нужно назвать файл — file, file1, myFile и т.д.
Правы ли они или лучше использовать foobar — это зависит от контекста и вашего мнения.
Подводим итоги:
foo, bar, baz и другие подобные имена ничего не значат, в программировании означают «какая-то переменная 1», «какая-то переменная 2» и т.д. Их используют в абстрактных примерах кода, для обозначения переменных, функций, файлов и т.д., которые могут быть в принципе любыми. Такие слова-заменители называются метапеременными.