Хорошие аналогии указателя функции?

Свойства startPoint и endPoint для CAGradientLayer определены в «единичной системе координат». В системе единиц измерения:

  • (0,0) соответствуют наименьшим координатам прямоугольника границ слоя, который в iOS является его верхним левым углом, если слой не был преобразован;
  • (1,1) соответствует наибольшим координатам прямоугольника границ слоя, который в iOS является его правым нижним углом, если слой не был преобразован.

Таким образом, расположение градиента должно быть таким простым:

gradient.startPoint = CGPoint.zero
gradient.endPoint = CGPoint(x: 1, y: 1)
5
задан ojblass 26 August 2013 в 17:27
поделиться

11 ответов

Каталог карт в любом случае кажется немного странным. Исходя из вашей темы, лучшей аналогией для указателей функций IMO было бы то, что они являются записью в указателе кулинарной книги. «Cajun ...... 39», вы переходите на страницу 39, где есть инструкции по приготовлению Cajun.

0
ответ дан 18 December 2019 в 06:36
поделиться

Я не думаю, что стоит пытаться научить очень техническая концепция через нетехнические аналогии - по-видимому, люди, которых вы обучаете, НЕ нуждаются в расплывчатом понимании «управленческого резюме», им в конечном итоге нужно будет применить концепцию конкретно, так зачем такой обходной путь?

Почему бы не объяснить это на простом примере программирования? Возможно, лучшим из них был бы общий алгоритм сортировки (предположительно, студенты уже узнали о сортировке).

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

15
ответ дан 18 December 2019 в 06:36
поделиться

Я предлагаю рассказать вашим ученикам, что такое для , а не то, что . Позже они спросят себя: «Каков правильный инструмент для решения этой проблемы?» вместо «как называется моя проблема?»

Представьте, что вы пишете программу, которая берет растровое изображение и превращает его в файл изображения. Существуют различные форматы растровых изображений (черно-белый, истинный цвет, истинный цвет с альфа-каналом и т. Д.). И есть различные форматы файлов изображений (JPEG, PNG, GIF). Если вы попытаетесь написать это без указателей на функции, вы получите N * M алгоритмов: N для количества входных растровых изображений и M для количества поддерживаемых форматов вывода. В этом базовом примере это будет 9 (3 * 3). Завтра к вам придет ваш начальник и тоже захочет получить поддержку TIFF. Это будет означать 12 (3 * 4) алгоритмов. Небольшое изменение характеристик требует много работы. Тупик.

Но вы можете определить три указателя на функции: getWidth (bitmap) , getHeight (bitmap) , getPixel (bitmap, x, y)

Теперь вам нужно только N алгоритмов, реализующих эти три FP. Каждый алгоритм работает с каждым видом растрового изображения и умеет его читать. Алгоритмы вывода больше не заботятся о том, как выглядит входное изображение, они просто используют три FP для доступа к данным теперь абстрактного изображения. Таким образом, вы получаете 6 (3 + 3) алгоритмов, и когда ваш босс приходит с TIFF, вам нужно добавить только один алгоритм: 7 вместо 12.

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

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

    lea.l someFunction,a0  # Load address of someFunction
    jsr.l a0               # Jump to subroutine

Указатель функции:

    lea.l  functionPointer,a0  # Load address of functionPointer
    move.l (a0),a0             # Load what is stored at functionPointer into a0
    jsr.l  a0                  # Jump to subroutine

Как видите, разница всего в одной инструкции.

2
ответ дан 18 December 2019 в 06:36
поделиться

Указатель функции похож на кредитную карту. :)

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

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

1
ответ дан 18 December 2019 в 06:36
поделиться

.NET называет их делегатами , может быть, это полезно для аналогий.

Можно просто сказать, что указатель на функцию - это адрес кого-то (работника, компании ), которому вы делегируете свою работу.

0
ответ дан 18 December 2019 в 06:36
поделиться

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

1
ответ дан 18 December 2019 в 06:36
поделиться

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

не аналогия , но, вероятно, проще.

0
ответ дан 18 December 2019 в 06:36
поделиться

Эта аналогия кажется слишком сложной.

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

5
ответ дан 18 December 2019 в 06:36
поделиться

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

0
ответ дан 18 December 2019 в 06:36
поделиться

Я думаю, что «указатель» можно назвать «идентификатором» (что разумно, потому что «адрес памяти» экземпляра является его 'идентичность'). Таким образом, "указатель на функцию" просто "

0
ответ дан 18 December 2019 в 06:36
поделиться

В этом ролике описываются CDS (кредитные свопы по умолчанию). Именно так указатели влияют на вашу систему.

http://www.youtube.com/watch?v=KPNdYtrlgaU#t=120s

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

Мои уши говорят мне: «Не создавайте зависимости, которые создадут длинные цепочки аварийных систем».

Итак, если они знают, что такое CDS. Тогда будет легко. :)

0
ответ дан 18 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: