Для больших программ стандартным способом оценки сложности является разделение программного кода на маленькие объекты. Большинство существующих языков программирования предлагают эту функциональность через классы, как и 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, который будет очень похож на тип соединения делегат / сигнал + слот, а не на «дать первому объекту полный указатель на второй объект, чтобы он мог передать ему сообщение». Соединения уровня метода для меня более предпочтительны, чем соединения уровня объекта ^ _ ^.