Найти в Дзене

Интерфейс функции

Такое словосочетание в литературе по программированию встречается не так уж и часто. Но встречается. Поэтому я счёл возможным вынести его в заголовок.

Интерфейс функции представляет собой краткое изложение того, как её использовать: какие параметры, что делает функция, что представляет собой возвращаемое значение.

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

Но сегодня поговорим об интерфейсе в общем смысле, не погружаясь в подробности и особенности разных языков программирования, считая, что интерфейс - это просто объявление имени функции с набором параметров. И здесь тоже есть пища для размышления: сколько этих параметров должно быть, надо ли какие-то вычисления выделять в отдельные функции (хотя к интерфейсу это уже не имеет отношения, но в нашем мире всё взаимосвязано) и т.п. Для примера используем функции в Python.

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

def Площадь(Длина, Ширина):
return Длина * Ширина
print(Площадь(2, 2))

Однако квадрат имеет равные стороны. Поэтому передавать два параметра в эту функцию совершенно неразумно. Это только загромождает интерфейс. Поэтому такую функцию лучше доработать:

def ПлощадьКвадрата(Сторона):
return Сторона * Сторона
print(ПлощадьКвадрата(2))

Здесь и название функции будет более понятным (мы видим, что это именно площадь квадрата, а не чего бы то ни было), и лишних параметров нет.

Конечно, этот пример притянут за уши. Для вычисления площади квадрата или прямоугольника вообще нет особого смысла создавать функцию. Но суть, я надеюсь, вы поняли.

Есть ещё один момент, о котором можно спорить, но я не являюсь ярым сторонником того, чтобы передавать в функцию как можно меньше параметров или чтобы каждая функция выполняла только одно действие (хотя это правило вполне обосновано). Я считаю, что надо исходить из обстоятельств - если есть возможность передавать в функцию как можно меньше параметров, вычисляя какие-то значения внутри функции, то так и надо делать (даже если это не будет соответствовать правилу “одно действие - одна функция”).

В спорных случаях я всегда помню о том, что:

  1. Надо стремиться к золотой середине, а не впадать в крайности.
  2. В целях сокращения сроков или экономии средств можно и нарушить какие-то правила. В конце концов, рефакторинг никто не отменял. Если очень хочется, то можно вернуться потом к программе и сделать “по правилам”, а пока надо чтобы программа заработала прямо сейчас, и тут уж не до правил хорошего тона.

Пример:

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

Сократить количество параметров можно (и нужно) в тех случаях, когда один параметр зависит от другого. Давайте “притянем за уши” ещё один пример и представим, что нам надо вычислить суммарный объём двух кубов, один из которых ровно в два раза больше второго по размерам. В этом случае передавать размер второго куба не нужно. Его можно просто вычислить в функции:

-2

Да, пример тоже далёк от практики (ну не идут что-то сегодня в голову интересные примеры))). Но для меня главное - передать суть. Если какое-то значение можно вычислить внутри функции, то его лучше не передавать через параметры. С другой стороны, если эти вычисления слишком сложные или могут пригодиться где-то ещё в программе, то желательно выделить их в отдельную функцию.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.