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

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

Как упоминалось в разделе 3.8, подпрограммы в Java могут быть как статическими, так и нестатическими. В этой главе рассматриваются только статические подпрограммы. Нестатические подпрограммы, которые используются в истинном объектно-ориентированном программировании, будут рассмотрены в следующей главе.

Черные ящики

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

Подпрограмму иногда называют «черным ящиком», потому что вы не можете видеть, что находится «внутри» ее (или, если быть более точным, вы обычно не хотите заглядывать внутрь нее, потому что тогда вам придется иметь дело с всю сложность, которую подпрограмма призвана скрыть). Конечно, черный ящик, не имеющий возможности взаимодействовать с остальным миром, был бы совершенно бесполезен. Черный ящик нуждается в каком-то интерфейсе с остальным миром, который позволяет взаимодействовать между тем, что находится внутри ящика, и тем, что снаружи. Физический черный ящик может иметь кнопки снаружи, которые вы можете нажимать, циферблаты, которые вы можете устанавливать, и слоты, которые можно использовать для передачи информации туда и обратно. Поскольку мы пытаемся скрыть сложность, а не создать ее, у нас есть первое правило черных ящиков:

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

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

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

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

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

Конечно, чтобы иметь черный ящик, кто-то должен спроектировать и построить реализацию. Идея черного ящика работает в интересах как разработчика, так и пользователя черного ящика. Ведь черный ящик можно использовать в неограниченном количестве различных ситуаций. Разработчику «черного ящика» не нужно ничего об этом знать. Разработчику просто нужно убедиться, что коробка выполняет возложенную на нее задачу и правильно взаимодействует с остальным миром. Это третье правило черных ящиков:

Разработчику черного ящика не нужно ничего знать о более крупных системах, в которых он будет использоваться.

В каком-то смысле черный ящик делит мир на две части: внутреннюю (реализация) и внешнюю. Интерфейс находится на границе, соединяющей эти две части.

Посетите дополнительную информацию: https://www.wikiod.com/w/Category:Java_Language