Бесплатный курс по PHP. Зарегистрируйтесь для отслеживания прогресса →

PHP: Детерминированность

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

Что такое детерминированность

Детерминированность — это одно из фундаментальных свойств функций. Функция будет детерминированной, когда для одних и тех же входных аргументов она возвращает один и тот же результат. Например, функция, которая переворачивает строку, — детерминированная:

<?php

strrev('cat'); // tac
strrev('cat'); // tac

Сколько бы раз мы ее не вызывали и не передавали туда значение 'cat', она всегда вернет 'tac'.

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

Даже если хотя бы один из миллиона вызовов вернет что-то другое, эта функция автоматически считается недетерминированной:

<?php

rand(); // 827606195
rand(); // 635369726

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

Что такое побочные эффекты

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

print_r() выводит что-то на экран, но это не возврат значения. Это действие, которое выполняет функция. Вывод на экран и возврат значения из функции — разные и независимые операции.

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

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

Побочные эффекты — один из основных источников проблем и ошибок в программных системах. Код с побочными эффектами сложен в тестировании и ненадежен. При этом без побочных эффектов программирование не имеет смысла. Без них было бы невозможно получить результат работы программы, например, записать в базу, вывести на экран, отправить по сети и так далее.

Важно понимать принципы работы с побочными эффектами. Это влияет на стиль программирования и способность строить качественные программы. Эта тема полностью раскроется в курсе о функциях.

Что такое чистые функции

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

  • Проще читать, отлаживать и тестировать
  • Не зависят от порядка, в котором они вызываются
  • Просто запустить параллельно

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

Вопрос для самопроверки. Можно ли определить наличие побочных эффектов внутри функции, опираясь только на ее возврат?

Задание

Выведите на экран случайное число от 1 до 6. Для реализации вам потребуется функция rand(), которая может принимать два числа: начальное и конечное

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

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

Мой код отличается от решения учителя 🤔

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

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

Полезное


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе