Хорошие аналогии указателя функции? - PullRequest
5 голосов
/ 24 мая 2009

Лучшее, что я придумал на данный момент, это то, что в карточном каталоге содержатся инструкции о том, как приготовить различные виды пищи. Он не содержит информацию о том, как готовить пищу, а также инструкции по приготовлению самой еды, но он может указать вам соответствующие инструкции, которые находятся в другом месте. Это хорошая аналогия, потому что она демонстрирует гибкость в способности готовить различные виды пищи (мексиканская, вегетарианская, индийская и т. Д.), Но понятие карточного каталога быстро заменяется компьютеризированным поиском. Меня спросили страшные "Что такое карточный каталог?" Использование Google в качестве примера поиска инструкций по приготовлению пищи - это нормально, но нет четкого различия в том, чтобы идти в физическое место, находить инструкции и «выполнять их». У кого-нибудь есть какие-нибудь аналогии, которые работали на них?

Ответы [ 11 ]

15 голосов
/ 24 мая 2009

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

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

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

5 голосов
/ 24 мая 2009

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

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

2 голосов
/ 24 мая 2009

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

Представьте, что вы пишете программу, которая берет растровое изображение и превращает его в файл изображения. Существуют различные виды форматов для растровых изображений (черный и белый, настоящий цвет, настоящий цвет с альфа-каналом и т. Д.). И есть различные форматы файлов изображений (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

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

1 голос
/ 24 мая 2009

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

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

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

1 голос
/ 24 мая 2009

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

0 голосов
/ 11 марта 2010

Этот клип описывает CDS (кредитные дефолтные свопы). Это именно то, как указатели влияют на вашу систему.

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

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

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

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

0 голосов
/ 24 мая 2009

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

0 голосов
/ 24 мая 2009

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

0 голосов
/ 24 мая 2009

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

0 голосов
/ 24 мая 2009

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

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

...