Делегаты - что они ДЕЙСТВИТЕЛЬНО? - PullRequest
7 голосов
/ 27 мая 2011

Может ли кто-нибудь объяснить им, используя аналогии с какими-то реальными процессами - такими как управление бейсбольной командой, или кафе, или магазин автомехаников - что-нибудь, что СДЕЛАНО?Например, давайте даже не будем говорить о CODE, SYNTAX или программировании - я видел много таких постов, и ни один из них не сделал этого для меня - можем ли мы сначала просто поговорить о концепциях?

Как будто я даже не говорюпонять, ПОЧЕМУ они у нас есть, как они выгодны и т. д.

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

Тогда мы можем закодировать это.

(И, к вашему сведению, мой особый интерес связан с реализацией разработки приложений для Objective-C / iPhone - но я действительно считаю, что сначала важно понять это концептуально.)

заранее спасибо!

Ответы [ 6 ]

8 голосов
/ 27 мая 2011

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

Перво-наперво, фактическое определение глагола для делегирования (из Оксфордского словаря):

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

Делегаты - это объекты, которым делегированы полномочия, потому что с точки зрения дизайна не имеет смысла, чтобы один класс выполнял всю работу.

Допустим, у вас есть класс таблицы пользовательского интерфейса. Вы хотите сделать его многоразовым для отображения многих видов данных: по большей части это означает, что вы не можете привязать его к самой модели. Например, если вы создали свою таблицу пользовательского интерфейса специально для отображения объектов альбома (с именем, исполнителем и т. Д.), То вы не сможете повторно использовать ее для отображения, скажем, объектов файлов (с владельцем, типом документа). и т. д.): вам нужно отредактировать класс, чтобы он подходил. Это скопирует много кода, поэтому вы должны найти другой механизм. Это приводит к проблеме: как он может отображать любые данные, если ему не разрешено связываться с классами данных?

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

Это означает, что у вас будет другой класс, который будет реагировать на определенное количество методов, которые объект таблицы будет использовать, как если бы он был частью его основного поведения (например, метод в делегате для получения имени столбцы, другой для получения определенной строки и т. д.). В качестве конкретного примера вы можете найти справочную информацию по протоколу NSTableViewDelegate: это методы, которые NSTableView может вызывать для своего делегата для получения информации о различных вещах или настраиваемом поведении. (Аргумент tableView:, в основном, у каждого метода есть табличное представление, вызывающее метод. Он часто игнорируется, поскольку существует много классов делегатов табличного представления, поддерживающих одно табличное представление.)

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

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

Другими словами, делегаты - это один из немногих способов расширения поведения класса без его изменения или подкласса.

5 голосов
/ 27 мая 2011

Что они ДЕЙСТВИТЕЛЬНО?

специалисты


Заказчик: Привет - вы починили мою машину?

Сотрудник: Я оцениваючто у нас будет возможность взглянуть на это менее чем за час.Я позвоню вам, когда он будет готов.

Заказчик: Я уже ждал 30 минут, и я действительно спешу!

Сотрудник: В настоящее время мы очень занятыгода.

Клиент: Вы не кажетесь занятым;Вы все время были на стойке регистрации!

Сотрудник: Я не механик.Я менеджер.Вы все еще хотите, чтобы я исправил ваши тормоза?


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

Одна из наиболее распространенных причин, по которым делегирование используется, - это избегать подклассов (это было быотправка менеджера в школу, чтобы он стал механиком - аналогия, которая очень похожа на множественное наследование).Когда подклассы могут использоваться для специализации, часто может использоваться делегирование.Делегирование - более слабая связь, когда (в хорошем дизайне) один объект выполняет все или большинство обязанностей, но оставляет часто специализированные части своих обязанностей другим реализациям (делегатам).

2 голосов
/ 27 мая 2011

В двух словах, делегат - это специалист по определенной задаче.

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

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

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

Теперь замените бегуна пекарни на UITableView, патиссера на id <UITableViewDelegate> и бухгалтера на id <UITableViewDataSource>, и мы вернемся к разговорному коду.

2 голосов
/ 27 мая 2011

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

2 голосов
/ 27 мая 2011

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

Одним из типичных примеров делегирования является решение о том, должно ли окно быть закрыто или нет. Когда пользователь нажимает кнопку закрытия, делегат окна получает -windowShouldClose:, и он может либо возвратить ДА, если окно не содержит каких-либо правок, которые могут быть сохранены, либо НЕТ, если вы хотите дать пользователю возможность сохранить документ перед закрытием его окна.

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

1 голос
/ 27 мая 2011

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

Любой человек (супер класс?;)) Может ответить на телефонное объявление и записаться на прием. Но каждый человек, как вы или я, делает это по-своему. Это означает, что у меня настроение anwserPhoneWithMood: (HumanMood *); функция, отличная от вашей.

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

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

В этом случае, очевидно, секретарь является делегатом.

Надеюсь, это прояснит для вас.

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