Причина скрыта, но результат известен.

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

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

Человеку, использующему программу, не нужно знать подробности того, как написана программа. Например, представьте, насколько неточно было бы, если бы вам нужно было знать и помнить код используемого вами компилятора. У программы есть работа, например, компиляция вашей программы или проверка правописания слов в вашей статье. Вам нужно знать, в чем заключается работа программы, чтобы вы могли ее использовать, но вам не нужно (или, по крайней мере, не нужно) знать, как программа выполняет свою работу. Функция похожа на небольшую программу и должна использоваться аналогичным образом. Программисту, использующему функцию в программе, необходимо знать, что делает эта функция (например, вычислять квадратный корень или преобразовывать температуру из градусов Фаренгейта в градусы Цельсия), но ему не нужно знать, как функция выполняет свою задачу. Это часто называют обращением с функцией как с черным ящиком. Называть что-либо черным ящиком — это фигура речи, предназначенная для получения образа физического устройства, которым вы знаете, как пользоваться, но метод работы которого остается загадкой, поскольку оно заключено в черный ящик, и вы не можете заглянуть внутрь ящика. Если функция хорошо спроектирована, программист может использовать ее, как если бы она была черным ящиком. Все, что нужно знать программисту, это то, что если он или она поместит соответствующие аргументы в черный ящик, то из черного ящика будет получено соответствующее возвращаемое значение. Проектирование функции таким образом, чтобы ее можно было использовать в качестве черного ящика, иногда называют сокрытием информации, чтобы подчеркнуть, что программист действует так, как если бы тело функции было скрыто от глаз.

Написание и использование функций, как если бы они были черными ящиками, также называется процедурной абстракцией. При программировании более разумно называть это функциональной абстракцией. Однако процедура — более общий термин, чем функция. Ученые-компьютерщики используют термин «процедура» для всех «подобных функциям» наборов инструкций, поэтому они используют термин процедурная абстракция. Термин абстракция призван передать идею о том, что, когда вы используете функцию как черный ящик, вы абстрагируете детали кода, содержащегося в теле функции. Вы можете назвать эту технику принципом черного ящика или принципом процедурной абстракции или сокрытия информации. Эти три термина означают одно и то же. Как бы вы ни называли этот принцип, важно то, что вы должны использовать его при разработке и написании определений функций.

«Программирование — это не то, что вы знаете; это о том, что вы можете понять ».

Крис Пайн

Процедурная абстракция

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

  1. Комментарий к объявлению функции должен сообщать программисту обо всех условиях, которые требуются для аргументов функции, и должен описывать значение, возвращаемое функцией при вызове с этими аргументами.
  2. Все переменные, используемые в теле функции, должны быть объявлены в теле функции. (Формальные параметры не нужно объявлять, поскольку они перечислены в объявлении функции.)

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

Ссылки: Решение проблем с помощью C++, 7-е издание. Уолтер Сэвич, Калифорнийский университет, Сан-Диего.