Хороший программист старается делать свои функции чистыми. Если знать, что это такое, можно сойти за своего, а заодно написать читаемый код.
Что такое функция
Функция — это мини-программа внутри вашей основной программы, которая делает какую-то одну понятную вещь. Вы однажды описываете, что это за вещь, а потом ссылаетесь на это описание в тех частях программы, где это нужно.
Например, вы пишете игру. Каждый раз, когда игрок попадает в цель, убивает врага, делает комбо, заканчивает уровень или падает в лаву, вам нужно добавить или убавить ему очков. Это делается двумя действиями: к старым очкам добавляются новые, на экран выводится новая сумма очков. Допустим, эти действия занимают 8 строк кода.
Допустим, в игре есть 100 ситуаций, когда нужно добавить или убавить очки — для каждого типа врага, преграды, уровня и т. д. Чтобы в каждой из ста ситуаций не писать одни и те же восемь строк кода, вы упаковываете эти восемь строк в функцию. И теперь в ста местах вы пишете одну строку: например, changeScore(10) или changeScore(-10). В первом случае прибавится 10 очков, во втором — столько же отнимется, но функция используется одна.
36 Зачем нужны функции в программировании Python
Если теперь изменить, что происходит в функции changeScore(), то изменения отразятся как бы во всех ста местах, где эта функция вызывается.
Зачем нужны функции
Функции нужны, чтобы заметно упрощать и сокращать код, адаптировать его для разных платформ, делать более отказоустойчивым, легко отлаживать. И вообще порядок в функциях — порядок в голове.
Возьмём тот же пример с подсчётом очков. Что если при добавлении очков нужно не только выводить их на экран, но и записывать в файл? Просто добавляете в определении функции дополнительные команды, связанные с файлами, и они теперь будут исполняться каждый раз, когда функцию снова вызовут в основной программе. Не нужно ползать по всему коду, искать места с добавлением очков и дописывать там про файлы. Меньше ручного труда, меньше опечаток, меньше незакрытых скобок.
А что если нужно не только писать очки в файл, но и следить за рекордом? Пишем новую функцию getHighScore(), которая достаёт откуда-то рекорд по игре, и две другие — setHighScore() и celebrateHighScore() — одна будет перезаписывать рекорд, если мы его побили, а вторая — как-то поздравлять пользователя с рекордом.
Теперь при каждом срабатывании changeScore() будет вызывать все остальные функции. И сколько бы раз мы ни вызвали в коде changeScore(), она потянет за собой всё хозяйство автоматически.
Сила ещё в том, что при разборе этой функции нам неважно, как реализованы getHighScore(), setHighScore() и celebrateHighScore(). Они задаются где-то в другом месте кода и в данный момент нас не волнуют. Они могут брать данные с жёсткого диска, писать их в базу данных, издавать звуки, взламывать Пентагон — для нас сейчас это неважно.
Без функций трудно повесить действия на какие-либо кнопки в интерфейсе. Например, у вас на сайте есть форма, и при клике на кнопку «Отправить» вы хотите проверять, что данные в форме правильно введены. Вы спокойно описываете где-то в коде функцию validateForm() и вешаете её на нажатие кнопки. Кнопку нажали — функция вызвалась. Не нужно вписывать в кнопку полный текст программы.
01. Что такое функция в математике
А без функции пришлось бы писать огромную программу-валидатор прямо внутри кнопки. Это исполнимо, но код выглядел бы страшно громоздким. Что если у вас на странице три формы, и каждую нужно валидировать?
Хорошо написанные функции резко повышают читаемость кода. Мы можем читать чужую программу, увидеть там функцию getExamScore(username) и знать, что последняя каким-то образом выясняет результаты экзамена по такому-то юзернейму. Как она там устроена внутри, куда обращается и что использует — вам неважно. Для нас это как бы одна простая понятная команда.
На разработку малозначительных функций можно посадить джуниоров, пока главный мастер-программист будет создавать основную логику программы. Если вы главный мастер, вы просто говорите в коде doNormalno(), а как это будет реализовано — уже не ваша забота. Пусть потеют джуниоры.
Можно написать кучу вспомогательных функций, держать их в отдельном файле и подключать к проекту как библиотеку. Например, вы написали один раз все функции для обработки логики и физики игры и потом подключаете эти функции во все свои игры. В одной — роботы, в другой — пираты, но в обеих один и тот же подсчёт очков, физика, движения, главное меню и управление.
Можно подключить чужие функции — например, найти в интернете библиотеку, которая умеет работать с гугл-документами, подключить её, вызвать таблицу функцией loadGoogleTable() и не думать, как там внутри реализован этот вызов.
В общем, функции — это бесконечная радость. На этом наш экскурс в функции закончен, переходим к чистоте.
Что такое чистые функции
Есть понятие чистых функций. Это значит, что если функции два раза дать на обработку одно и то же значение, она всегда выдаст один и тот же результат и в программе не изменит ничего, что не относится непосредственно к этой функции. То есть у чистой функции предсказуемый результат и нет побочных эффектов.
Один и тот же результат
Допустим, мы придумали функцию, которая считает площадь круга по его радиусу: getCircleArea(). Для наших целей мы берём число пи, равное 3,1415, и вписываем в функцию:
Теперь этой функции надо скормить число, и она выдаст площадь круга:
getCircleArea(2) всегда выдаст результат 12,6060
getCircleArea(4) всегда выдаст 50,2640
Разработчик может быть уверен, что эта функция всегда выдаст нужную для его задачи площадь круга и не будет зависеть от каких-либо других вещей в его программе. Эта функция с предсказуемым результатом.
Другой пример. Мы пишем программу-таймер, которая должна издать звук, например, за 10 секунд до конца отведённого ей времени. Чтобы узнать, сколько осталось секунд, нам нужна функция: она выясняет количество секунд между двумя отметками времени. Мы даём ей два времени в каком-то формате, а функция сама неким образом высчитывает, сколько между ними секунд.
Как именно она это считает, сейчас неважно. Важно, что она это делает одинаково. Это тоже функция с предсказуемым результатом:
getInterval(’09:00:00′, ’09:00:12′) всегда выдаст 12
getInterval(’09:00:00′, ’21:00:00′) всегда выдаст 43 200
А теперь пример похожей функции: она определяет время от текущего до какого-то другого времени. При исполнении эта функция запрашивает текущее время в компьютере, сравнивает с целевым и делает нужные вычисления. При запуске одной и той же функции с разницей в несколько секунд она даст разные результаты:
getSecondsTo(’23:59:59′) в один момент даст 43 293 секунды,
а спустя 2 минуты эта же функция getSecondsTo(’23:59:59′) даст 43 173 секунды.
Это функция с непредсказуемым результатом. У неё есть непредсказуемая зависимость, которая может повлиять на работу программы. Что если во время исполнения у пользователя обнулились часы? Или он сменил часовой пояс? Или при запросе текущего времени происходит ошибка?
Или его компьютер не поддерживает отдачу времени?
С точки зрения чистых функций, правильнее будет сначала отдельными функциями получить все внешние зависимости, проверить их и убедиться, что они подходят для нашей работы. И потом уже вызвать функцию с подсчётом интервалов. Что-то вроде такого:
var now = getCurrentTime();
var interval = getInterval(now, ’23:59:59′);
Тогда в функции getCurrentTime() можно будет прописать всё хозяйство, связанное с получением нужного времени и его проверкой, а в getInterval() оставить только алгоритм, который считает разницу во времени.
Побочные эффекты
Современные языки программирования позволяют функциям работать не только внутри себя, но и влиять на окружение. Например, функция может вывести что-то на экран, записать на диск, изменить какую-то глобальную переменную. Взломать Пентагон, опять же. Всё это называется побочными эффектами. Хорошие программисты смотрят на них крайне настороженно.
Что такое функция в программировании на примере JavaScript
В этой статье мы разберём что такое функция в программировании, на примере языка программирования JavaScript, думаю будет интересно новичкам.
Также можете посмотреть статью «Jest тестирование в JavaScript», думаю эта статья будет полезна многим начинающим JS разработчикам.
Что такое функция в программировании:
Функции — одна из основных частей компьютерных программ.
Они широко используются и являются одними из основных строительных блоков JavaScript.
В этой статье мы рассмотрим определение функций и объясним, почему они так важны. Я также покажу вам, как начать писать функции на JavaScript.
Что такое функция в программировании на JavaScript:
Функция — это блок кода, который инкапсулирует одно изолированное, автономное поведение, которое должен выполнять компьютер.
Функции — это набор организованных инструкций, которые соответствуют определенной задаче или конкретным функциям, которые пользователь хочет реализовать в своей программе для достижения единственного желаемого результата.
Код внутри функции работает только тогда , когда это необходимо, то есть только тогда , когда оно называется .
Функции — важная и полезная часть программирования, поскольку они создают повторно используемый код.
Вместо того, чтобы копировать, вставлять и повторять один и тот же код в разных частях вашей программы, вы можете написать этот код только в одном месте, используя функцию. Тогда вы можете использовать его снова и снова, когда вам нужно.
Это также помогает, когда вы хотите внести изменения в свою программу или отладить и попытаться исправить ошибку.
Вместо того, чтобы искать разные части, где мог бы находиться ваш код, вам нужно взглянуть только на одно конкретное место, которое сделает ваш код более читабельным.
Как объявлять функции в JavaScript:
Общий синтаксис для создания функции в JavaScript выглядит так:
Источник: prognote.ru
Что такое функция и зачем она нужна в программе
Если вы хотите инициализировать ученика, вы можете сделать что-то вроде этого:
Purity » от xkcd распространяется под лицензией CC BY-NC 2.5.» />
Когда у вас есть такие маленькие, «чистые» функции, то использовать их повторно намного проще, чем вашу традиционную объектно-ориентированную программу. Это спорный подход (если вы посмотрите «повторное использование в функциональном программировании», вы найдете много дискуссий и подкастов на эту тему), так что, я думаю, вы согласитесь со мной в том, что когда вы хотите повторно использовать класс в ООП и добавить функцию, вы добавляете условия и параметры, и ваши функции становятся больше. Ваши абстрактные классы и интерфейсы становятся довольно надежными. Вы должны уделять пристальное внимание более крупной архитектуре приложения из-за побочных эффектов и других факторов, которые повлияют на вашу программу (как мы говорили ранее).
В функциональном программировании все наоборот: ваши функции становятся меньше и гораздо более подходят для того, что вы хотите получить. Каждая функция делает что-то одно, и всякий раз, когда вы захотите сделать что-то одно, вы будете использовать конкретную функцию.
Конечно, в каждой системе есть исключения, но обычно это то, что вы видите в различных базах исходного кода во всем мире!
Ладно, ладно, я заинтригован. Как начать?
Если вы уже хорошо разбираетесь в JavaScript или Python, вы можете сразу приступить к изучению концепций функционального программирования, о которых мы говорили здесь. Если вы хотите больше узнать о «чистых» языках, предназначенных для функционального программирования, вы можете попробовать семейство Lisp (включая Common Lisp, Scheme и Clojure), семейство ML (включая OCaml и F#), Erlang, Elixir, Elm или Haskell.
Функциональное программирование может немного сбивать с толку, пока вы не привыкнете к нему. Но если вы дадите ему шанс и попробуете, ваше программное обеспечение будет надежным, его будет легче отлаживать, и вы будете наслаждаться гарантиями, которые дает прочная основа функционального программирования!
Материалы по теме
- Функциональное программирование: рефакторинг, замыкания и функции высшего порядка
- Функциональное программирование и его применение в JavaScript
Источники
Источник: proglib.io