Это не вопрос стиля. Его больше касается правильного использования самого языка. Я новичок в программировании, и я совершенно не знаком с Objective-C и Cocoa, но после прочтения языка и просмотра кода примера некоторые шаблоны использования продолжают всплывать, что не имеет смысла для меня. Вернее, они кажутся мне не оптимальными. Я надеюсь, что вы все можете помочь обучить меня правильному использованию некоторых из этих языковых конструкций.
интерфейсы и протоколы
Я понимаю понятия интерфейсов и реализации, поскольку они относятся к абстракции. Однако доминирующий шаблон, который я вижу в примере кода Objective-C, следующий...
@interface Foo : NSObject
{
some ivars decls
}
some methods decls
@end
код >
И затем код клиента в форме...
Foo* f = [[Foo alloc] init];
код >
Мне кажется странным. Foo кажется реализацией в моем сознании (независимо от неудачного наименования ключевого слова @interface). Интерфейсы, на мой взгляд, не выставляют переменные экземпляра. Клиент этого класса не должен быть ознакомлен с деталями моей реализации.
Objective-C имеет ключевое слово @protocol, которое, на мой взгляд, больше похоже на интерфейс, чем ключевое слово @interface. Это позволяет вам определять методы и/или свойства и что они. Никакой реализации. Нет переменных экземпляра. Просто интерфейс.
@protocol Foo <NSObject>
some methods
maybe some properties
@end
@interface FooProvider : NSObject
+ (FooProvider*) sharedProvider;
- (id<Foo>) fooWithBlahBlah;
@end
код >
Таким образом, код клиента будет иметь форму...
id<Foo> f = [[FooProvider sharedProvider] fooWithBlahBlah];
[f whatever];
код >
Это кажется (по крайней мере для меня) более абстрактным использованием языка и изолирует клиентов от деталей реализации, от которых они не должны зависеть. Мой вопрос заключается в том, к чему я должен стремиться следовать. Я понимаю, что могут быть ситуации, когда один предпочтительнее другого, но в общих чертах должен быть нормой и быть исключением?
Некоторые рекомендации будут оценены.
Спасибо, Roman