Это какой-то механизм слабой связи в Objective-C + Какао, такой как делегаты C # или C ++ сигналы Qt + слоты? - PullRequest
4 голосов
/ 20 мая 2010

Для больших программ стандартным способом оценки сложности является разделение программного кода на маленькие объекты. Большинство существующих языков программирования предлагают эту функциональность через классы, как и Objective-C. Но после того, как исходный код разделен на небольшой объект, вторая задача состоит в том, чтобы как-то связать их с каждым объектом. Стандартными подходами, поддерживаемыми большинством языков, являются compositon (один объект является полем члена другого), наследование, шаблоны (generics) и обратные вызовы. Более загадочные методы включают в себя делагаты на уровне метода (C #) и сигналы + слоты (C ++ Qt). Мне нравится идея делегатов / сигналов, так как при соединении двух объектов я могу соединять отдельные методы с каждым, без объектов, знающих что-либо о каждом из них. Для C # это будет выглядеть так:

var object1 = new CObject1();
var object2 = new CObject2();
object1.SomethingHappened += object2.HandleSomething;

В этом коде is object1 вызывает его SomethingHappened делегата (как при обычном вызове метода) будет вызван метод HandleSomething из object2.

Для C ++ Qt это будет выглядеть так:

var object1 = new CObject1();
var object2 = new CObject2();
connect( object1, SIGNAL(SomethingHappened()), object2, SLOT(HandleSomething()) );

Результат будет точно таким же. У этой техники есть некоторые преимущества и недостатки, но в целом она мне нравится больше, чем интерфейсы, поскольку, если база кода программы растет, я могу менять соединения и добавлять новые, не создавая тонны интерфейсов. После изучения Objective-C я не нашел способа использовать эту технику, которая мне нравится :(. Кажется, Objective-C отлично поддерживает передачу сообщений, но для object1 требуется указатель на object2 в чтобы передать ему сообщение. Если какой-либо объект должен быть связан с множеством других объектов, в Objective-C я буду вынужден указывать ему каждый из объектов, с которыми он должен быть связан.

Итак, вопрос :). Это какой-то подход в программировании на Objective-C, который будет очень похож на тип соединения делегат / сигнал + слот, а не на «дать первому объекту полный указатель на второй объект, чтобы он мог передать ему сообщение». Соединения уровня метода для меня более предпочтительны, чем соединения уровня объекта ^ _ ^.

1 Ответ

4 голосов
/ 20 мая 2010

Я дам вам пару советов для исследования:

  • NSNotification
  • Наблюдение значения ключа
  • NSInvocation
  • категории

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

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