Зарегистрируйтесь, чтобы продолжить обучение

Абстракция с помощью функций PHP: Функции

Главная причина создавать функции — это повышение уровня абстракции, а не сокращение дублирования кода, как вы могли бы подумать. Второе — это следствие первого. Вместо того чтобы реализовывать сортировку самостоятельно, можно воспользоваться функцией sort. Она прячет реализацию внутри себя и позволяет программисту не отвлекаться на вид сортировки, код для ее выполнения и другие ненужные детали.

Abstraction

В этом заключается суть абстракции. Мы игнорируем несущественные стороны, свойства и связи рассматриваемого объекта или процесса, чтобы представить сложную концепцию в простой форме. Умение абстрагировать — одно из важнейших свойств нашего мозга. Маленькие дети очень быстро учатся классифицировать предметы окружающего мира. Без особого труда они понимают, что дерево — это дерево, даже если конкретный вид дерева они видят впервые. Так же легко они узнают зайчика в двух разведенных пальцах, которые обозначают уши.

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

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

Huge Java Call Stack

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

Но не забывайте, что абстракции почти всегда текут.

Пример дырявой абстракции

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

Первое решение выглядит примерно так:

<?php

function check($number)
{
  $result = $number % 2 === 0 ? 'yes' : 'no';
  echo $result;
}

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

<?php

function isEven($number)
{
    return $number % 2 === 0 ? 'yes' : 'no';
}

function check($number)
{
  $result = isEven($number);
  echo $result;
}

Посмотрите на код выше внимательно. Все ли с ним нормально?

На самом деле, этот код даже хуже, чем первая версия, потому что здесь создана неверная абстракция. Понятие четности числа никак не связано ни с выводом на экран, ни со строчками yes или no. Оно существует в вакууме как математическая концепция и не знает о том, как ее собираются использовать. И это мы даже не говорим о том, что имя isEven начинается с is, то есть эта функция-предикат. Такие функции могут возвращать только логическое значение и никак иначе (исключений не существует!). Правильный вариант выглядит так:

<?php

function isEven($number)
{
    return $number % 2 === 0;
}

function check($number)
{
  $result = isEven($number) ? 'yes' : 'no';
  echo $result;
}

Это самый примитивный вариант создания абстракций. В реальном коде обычно все значительно сложнее.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»