Что такое имя функции
Перейти к содержимому

Что такое имя функции

Имена методов и функций

Изучая всякого рода системы, я обнаружил, что у многих наблюдаются проблемы с именованием методов. Это побудило меня написать статью.

странный кусок кода

Что побудило меня написать статью?

После того, как я в тысячный раз полез в мануал, чтобы узнать порядок аргументов в PHP-функции str_replace, стало ясно, что проблема весьма актуальна. Ведь имя функции «str_replace» говорит нам только о том, что она делает, но ничего не говорит об аргументах. Чем это чревато? Ладно, можно запомнить число и порядок аргументов во встроенной библиотеке, но в собственной разработке запоминать аргументы не так-то и просто. Да, есть среды разработки, которые нам подсказывают, но они не срабатывают при наведении глаза на функцию, поэтому читать такой код сложно. А ведь важно, чтобы код легко читался и понимался без комментариев. Это признак качественного кода.

В качестве примера многочисленных ошибок, приведу PHP. Сразу могу назвать несколько ошибок:

1. Имена некоторых функций неочевидно передают назначение. Например, basename.

2. Имена функций составлены не по одному принципу. Например, строковые функции начинаются с str_, но не все (например, strstr, strpos). С файлами та же проблема: filesize vs file_exists.

3. Неочевидность аргументов и их порядка в функциях. Например, искомая строка в функции str_replace идет на последнем месте, а в функции strpos — на первом (str_replace($search, $replace, $subject[, $&count]) vs strpos($haystack, $needle[, $offset])). Если бы искомая строка, например, всегда занимала первую позицию — было бы более удобно.
Да, таково наследство Си (и не только), но неважно: проблема есть проблема.

Значит, надо придумывать имена методов/функций так, чтобы:

1. Имя функции/метода четко передавало его назначение.

2. Имена функций/методов составлены по одному принципу/стандарту.

3. Порядок и список аргументов в функциях/методах были составлены по одному принципу и сочетались с именем.

4. Методы оставались методами.

Поясню 4ый пункт. Нередко я встречаю строки вида object.Pi(): такой метод не имеет отношения к объекту. Это скорее функция (или константа).

Примеры и не только

1. Нам нужна замена подстроки в строке. Самым очевидным вариантом будет такой: string.replace(from, to). Жаль, что в PHP он не осуществим.

2. Намекаем на аргументы и смысл: groups.getByName(name). Ничего лишнего. Не надо писать getGroupByName, ведь контекст ясен благодаря groups. Точно так же и другие методы: groups.remove(group) либо group.delete(). Ага! И тут интересный момент 🙂 Если мы удаляем из коллекции, то коллекция.remove(элемент). А если элемент сам удаляет себя, то элемент.delete(). И это важно: наш код должен быть валидным в плане английского языка.

3. Антонимы в именах функций/методов. Да, всегда надо использовать верные антонимы при именовании. Добавляем и удаляем элементы в коллекции: add/remove. Создаем и удаляем объекты: create/delete. Начинаем и завершаем процесс: begin/end, start/finish (но никак не begin/finish и start/end).

Функция

Чем каждый раз писать одно и то же, проще один раз создать функцию.

Время чтения: 6 мин

  1. Кратко
  2. Как пишется
  3. Как это понять
    1. Имя функции
    2. Контекст функции
    3. Параметры
    4. Именованные и анонимные функции
    5. Обычные и стрелочные функции
    1. Дока Дог

    Обновлено 2 мая 2022

    Кратко

    Функция — это блок из различных команд. Функции служат для упорядочивания и структурирования кода программы.

    Примеры простейших встроенных функций — это alert ( message ) и prompt ( message , default ) , но можно создавать и свои ����

    Как пишется

    Базовый вариант создания функции:

    Как это понять

    В начале идёт ключевое слово function, после него имя функции, затем список параметров в скобках (в примере выше параметр один, но может быть и больше) и тело функции — код, который выполняется при её вызове.

    Имя функции

    Функцию стоит называть так, чтобы было ясно, что она делает. Если внутри функции попытаться вызвать эту же функцию — ошибки не произойдёт.

    Рекурсией называется такая конструкция, при которой функция вызывает саму себя. Достаточно часто такое применяется в математических операциях, но не ограничивается ими.

    Тело функции может содержать любые команды, в том числе и вызов других функций.

    Переменные внутри функции существуют только внутри этой функции.

    Что это значит? Каждый раз, когда происходит выполнение функции, список доступных для использования переменных меняется. Хотя переменная и называется sum , в каждой функции эта переменная сама по себе, и поэтому изменение переменной в функции sumOne не влияет на глобальную sum и не влияет на локальные (в других функциях) переменные с именем sum .

    Почему так происходит? Из-за контекста выполнения функции ��

    Контекст функции

    У кода в момент выполнения его интерпретатором есть «окружение». Это функция, которая сейчас отрабатывает, это содержащиеся в ней переменные, это глобальные переменные. Всё это и есть контекст.

    Существует 3 типа кода:

    • код функции — код, выполняющийся в теле функции;
    • глобальный код — код, выполняющийся вне рамок какой-либо функции.
    • eval-код — код, выполняющийся внутри функции eval ( ) (использование этой функции — редкость).

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

    Параметры

    При вызове функции ей можно передать данные, которые та использует по своему усмотрению.

    Например, этот код выводит сообщения:

    Название функции — showMessage.

    Она принимает 2 параметра под названиями user и message . Когда описываешь свою функцию — можно называть эти параметры по-своему.

    Внутри showMessage идёт вызов встроенной функции alert .

    Вызов alert происходит со строкой, состоящей из трёх частей:

    • переменная user ;
    • текст: двоеточие и пробел;
    • переменная message .

    �� Иногда внутри функции требуется поменять значение параметра. Например, добавить форматирование. Пока параметр является примитивом — с этим нет проблем, потому что примитив копируется по значению.

    Но в случае не примитивов (например, объектов или массивов) происходит копирование по ссылке. Изменяя параметр, переданный по ссылке, мы изменяем его не только в функции, но и вовне.

    �� В примерах выше было слово «return». Что это такое и для чего нужно — более подробно раскрыто в отдельной статье про return ��

    Именованные и анонимные функции

    В JavaScript есть несколько типов функций, которые некоторым образом отличаются друг от друга. Первый тип — именованные.

    Это именованная функция, потому что у неё есть имя.

    Противоположность именованным функциям — анонимные. У таких имени нет:

    Функция без имени — анонимная.

    Они работают одинаково, но по-разному ведут себя в консоли и стеке вызовов. Допустим, мы написали программу, в которой есть ошибка. Если наши функции были именованными, то стек вызовов покажет, какая функция вызвала какую, и что привело к ошибке:

    Здесь видно, какие функции вызывали какие, и что привело к ошибке, вплоть до номера строки и символа.

    Если же наши функции были анонимными, то стек вызовов будет не так полезен:

    Да, тут есть номера строк, но это не так удобно, как название функции, по которому можно искать.

    Особенно это может быть важно в колбэках — когда мы вызываем какую-то функцию в ответ на событие.

    Анонимная функция будет менее полезна при отладке:

    В отличие от именованной:

    Обычные и стрелочные функции

    Отличие стрелочных функций от обычных в том, что у них нет this . Также стрелочные функции в силу своего синтаксиса анонимны, если не присвоить их переменной.

    Стрелочная функция записывается намного короче, чем обычная. Ключевое слово function не требуется, так как сама нотация ( ) = > подразумевает функцию.

    Если функция ничему не присвоена, то она анонимна:

    Так как у них нет this , то внутри нельзя получить доступ к arguments :

    Также из-за отсутствия this их нельзя использовать с new .

    Стрелочные функции не могут быть функциями-конструкторами.

    С обычной функцией — порядок:

    На практике

    Дока Дог

    �� При написании функции указываются параметры — те переменные, с которыми работает функция. Но возможны случаи, когда не все параметры заданы. Это может быть сделано как специально, например, для использования варианта по умолчанию, так и произойти случайно — ошибка при использовании или неожиданные входные данные.

    �� Давайте функциям имена, чтобы отладку проводить было проще.

    Анонимную функцию будет сложнее отлаживать, потому что в стеке вызовов не будет её имени.

    В отличие от именованной:

    �� У стрелочных функций можно использовать быстрый (implicit) return.

    Также можно возвращать любые структуры и типы данных:

    Чтобы вернуть объект, его необходимо обернуть в скобки. Только так JS поймёт, что мы не открываем тело функции, а возвращаем результат:

    Как называть переменные и функции, чтобы вас уважали бывалые программисты

    Если вы опытный разработчик, покажите эту статью начинающим.

    Зачем как-то по-особому называть переменные и функции

    Вам по-любому придётся как-то назвать переменные и функции. С точки зрения языков программирования, переменные могут быть почти любыми: хоть a, b и c, хоть SuperImportantVariable3000. То же с функциями: они могут быть суперкороткими типа yo(), а могут быть невероятно замороченными вроде getNewPageNumberAndNavigateToThatPage(). Как скажете — так и будет. Тем более что современные текстовые редакторы делают автоподстановку всех названий, так что вам даже не придётся их запоминать.

    Но есть три момента:

    • Через две недели вы уже забудете, как был устроен ваш код. Если вы написали программу сегодня и вернулись к ней через 14–21 день, вы уже не сможете на ходу вспомнить, за что отвечают разные куски кода. И если по переменной или функции будет понятно, что она делает, то вы себе очень упростите задачу.
    • С вашим кодом обязательно будет работать кто-то другой. Вы сделали классную программу, она функционирует, и вы приглашаете кого-нибудь тоже поработать над ней. Он откроет ваш код и должен будет в нём разобраться. Если переменные и функции названы хорошо, ему будет легко всё понять и он быстро вам поможет.
    • Это влияет на приём на работу. Если решите связать свою жизнь с программированием, по названиям ваших переменных и функций будут судить о ваших качествах как специалиста. Программа может, конечно, работать и без красивого названия переменных, а вот вас в компанию могут и не позвать.

    Как называть переменные

    Когда начинаешь писать код, у тебя простые программы, к которым нужны простые переменные: screen, score, text и так далее. Потом проекты становятся сложнее, и переменные нужны всё более сложные: totalScore, totalScoreBefore, totalScoreAfter, totalScoreMaxProgressiveLimit и тому подобные. Тут надо остановиться и подумать вот о чём.

    Чем длиннее название переменной, тем тяжелее её набрать без ошибок. Спасает автоподстановка, но если её нет — почти наверняка ваш код не полетит из-за опечатки.

    Если вы пишете на JavaScript, то будет ещё хуже: так как он генерирует переменные на ходу, ошибка в переменной totalScoreMaxProgresLimit у него не вызовет подозрений. Он создаст новый элемент с этим названием, и у вас будут две переменные — одна правильная, другая неправильная. Программа запустится, но работать будет непредсказуемо.

    Поэтому стремитесь выбирать короткие названия переменных, которые при этом понятны без глубокого вникания. Например, totalScore — итоговый счёт в игре, maxWidth — максимальная ширина. Если есть необходимость хранить много переменных на разных полочках, в группах или еще какими-то пачками, изучите понятия объектов и классов в JavaScript — это то, что вам нужно.

    Как называть функции

    Функция — это подпрограмма внутри вашей программы, которую вы часто используете. Например, можно написать функцию getNumber(), которая будет выдавать случайное число в нужном вам диапазоне. Или сказать setTimer() — и где-то внутри программы установится таймер, который выполнит то, что необходимо, по завершении отсчёта времени.

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

    У функций тоже могут быть какие угодно названия. Но обычно они будут примерно такими:

    • shuffle() — скорее всего, перемешает элементы массива;
    • saveScore() — сохранит куда-то счёт игры;
    • kill() — убьёт что-то;
      spawn() — создаст что-то;
    • loadDatabase() — загрузит какую-то базу данных в память;
    • makeBackup() — сделает резервную копию каких-то данных и, скорее всего, сохранит её куда следует;
    • getSpeed() — выяснить, с какой скоростью что-то движется. Функция вернёт скорость;
    • getUserName() — что-то произойдёт, и функция вернёт имя пользователя;
    • getSessionId() — вернёт номер сессии;
    • setTimeout() — задать задержку, после которой произойдёт какое-то действие;
    • setSpeed() — задать чему-то скорость.

    Вы заметите, что из названия функции можно понять, что она сделает и сообщит ли какой-то результат. Например, getScore() вернёт счёт игры, setScore() задаст счёт игры и ничего не вернёт, а clearScore() обнулит счёт игры и тоже ничего не вернёт.

    А что с заглавными буквами?

    В программировании есть два подхода к оформлению функций и переменных: camelCase и snake_case.

    В camelCase переменные из нескольких слов соединяются без пробела, все новые слова пишутся с заглавной: getMoney, renderToFrame, removeFromBase и т. д. Этот подход рекомендуется в JavaScript. Обратите внимание: названия переменных и функций в JavaScript чувствительны к заглавным, то есть переменные getmoney и getMoney — это разные переменные.

    Snake_case — это когда слова склеиваются нижним подчеркиванием. Это чаще используют в классах CSS. Примеры: header_marginal, form_success.

    Выбирайте тот подход, который характерен для выбранного вами языка. Помните, что потом ваш код будут читать другие люди, и видеть необычно названные функции и переменные им будет тяжеловато.

    Как не надо называть ни переменные, ни функции

    Программисты не советуют называть переменные и функции креативно, например crazyUnicorn или wonderfulWorld(). Из названий этих функций непонятно, что они делают, возвращают ли они что-то и вообще зачем нужны.

    Но, например, unicornCount — нормальная переменная с количеством единорогов. А initWorld() — функция, которая создаёт мир компьютерной игры.

    Не называйте функции и переменные словами function или variable. MyVar и superFunction() — плохие варианты, потому что вы сами же через две недели забудете, что эти штуки делают.

    Лучше не называть функции и переменные по-русски типа solnce или KYCb() — забудете потом, как они правильно пишутся. А когда ваша программа станет международно признанной, разработчики поблагодарят вас. При этом: если ваша функция делает «кусь», чтобы это ни значило, ее можно назвать bite() или getPiece().

    Не делайте названия слишком секретными: переменные p, m, t, z или функция hm() — это слишком коротко. Исключение — когда вы пишете циклы: там используются переменные типа i, n, p — с их помощью считают, сколько раз цикл уже отработал. Но эти переменные создались, исполнили свою роль и уничтожились сразу после закрытия цикла, больше к ним не обращаются.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *