Я вырос, обучая себя «Super Extended Basic» на первом в мире широкодоступном домашнем компьютере «Ti-994a». для тех из вас, у кого нет лет, чтобы помнить это, у него было 32 КБ оперативной памяти и ТВ-выход, и я думал, что держу золото, когда получил блок расширения с дисководом для гибких дисков 5,25 и платой расширения памяти на 128 КБ. Я был убежден, что смогу запрограммировать следующее поколение 3D-игр!

Разве наивность не полна надежд и воображения? Я быстро узнал об ограничениях этого устройства, когда заполнил первые 28 КБ доступной оперативной памяти, не смог получить доступ к более чем 32 КБ карты расширения и едва начал создавать интерфейс и базовые объектные переменные для моего нового виртуального мира!

Первое преобразование простого куба, и я знал, что никогда не заставлю эту штуку рендерить 320x200 пикселей виртуального рендеринга 30 кадров в секунду. У меня просто не было вычислительной мощности, а позже я узнал, что S.E.B. была песочница, и это просто убило ее. Мне пришлось бы использовать его в качестве печатного редактора и принтера для домашних заданий, поскольку он никогда не поддерживал бы 3,5-дюймовые дискеты, используемые в школе, а мой ленточный накопитель данных был несовместим с интерфейсами ПК на базе 80386.

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

Некоторые ограничения можно преодолеть с помощью обучения, другие — с помощью обновления, а третьи (некоторые аппаратные средства) никогда не смогут делать то, что мы ожидаем или хотим.

У Javascript было так много обещаний, когда он был впервые выпущен. Я помню, когда я закончил среднюю школу в 1996 году, я только что узнал, что C++ заменит Turbo Pascal, а Java может просто заменить C++ еще до того, как он начнет работать.

Изучая Java, я нахожу функции, переменные и возвращаемые значения довольно знакомыми, но обратные вызовы? ну, это было что-то новое. Мой первый мысленный рендеринг этого странного маленького зверя был нарисован как вложенная функция, но о, как катастрофически это было в Turbo Pascal! Простая компиляция объектно-ориентированной программы с вложенными функциями вполне может вызвать ошибки переполнения стека компилятором, поэтому забудьте о сложных вычислениях. Ограничения должны были быть установлены, чтобы компилятор не «взорвал память стека».

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

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

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

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

Пример:

function getOrbitalPeriodsSum(data)
{ 
 return data.asteroids
   .reduce(function (acc, val)
     {  return acc + val.orbitalPeriod;
     }, 0);
}

Это очень похоже на O.O.P. в Турбо-Паскале. Все функции привязаны к Объектам и выполняют работу над одними и теми же Объектами. Обратите внимание, что функция «reduce» присоединена к переменной «data.asteroids» с помощью «.» этот разделитель/ссылка на переменную, разрешает вызовы функций для этой структуры даты и позволяет передавать возврат в возврат родительской функции и, следовательно, в вызов родительской функции! Красивый! Это единственная логическая линия, которая произвела бы революцию в S.E.B.! Но увы, это время прошло!

Теперь у нас есть Java, и мир кодирования стал немного проще.

Также обратите внимание, что внутри функции reduce есть общая функция, которая позволяет обрабатывать каждый объект в массиве переменных без записи код для цикла for-to-do или цикла while, поскольку они по-прежнему полезны, для большинства операций обработки данных требуется только одна индексная переменная, и этот славный метод, значительно упрощает работу кодера.

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

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

Удачного кодирования, и пусть ваше путешествие увенчается успехом и удовлетворением.