Использование фиксированного префикса поможет «скрыть» метод от внешнего мира, но не предотвратит случайное переопределение метода. Например. Однажды я расширил класс и создал метод:
- (void)private_close
{
// ...
}
В результате поведение класса изменилось ужасным образом. Но почему? Оказалось, у суперкласса также было имя метода private_close
и . Я случайно переопределил его, не вызывая super ! Как я должен знать? Нет предупреждения компилятора!
Неважно, является ли ваш префикс _
или __
, или p
, или private_
, если он всегда один и тот же, у вас будут проблемы, подобные этой.
Таким образом, я префикс частных методов (и свойств!) С префиксом, который напоминает имя класса. Поэтому я беру заглавные буквы имени класса, чтобы сформировать «частный префикс»:
ComplexFileParser
-> CFP
URLDownloadTask
-> URLDT
SessionController
-> SC
Это все еще не совсем безопасно, но очень маловероятно, что подкласс с другим именем имеет тот же самый тот же самый частный префикс.
Также, когда вы создаете фреймворки, вы должны ставить перед всеми классами и другими символами префикс фреймворка (как Apple делает с NS...
, CF...
, CA...
, SC...
, UI...
и т. Д.) И таким образом, этот префикс класса является частью частного префикса, а также делает коллизии еще менее вероятными:
- Framework
DecodingUtils.framework
-> DU
- Класс
ComplexFileDecoder
в каркасе -> DUComplexFileDecoder
- Частный префикс ->
DUCFD
- Закрытый метод close ->
- (void)DUCFD_close
В качестве альтернативы добавьте префикс в конце имени аргумента первого метода, чтобы улучшить автозаполнение:
- (void)doSomethingWith:(Type1)var1 parameters:(Type2)var2
станет
- (void)doSomethingWith_DUCFD:(Type1)var1 parameters:(Type2)var2
или всегда добавлять его только к последнему имени параметра:
- (void)doSomethingWith:(Type1)var1 parameters_DUCFD:(Type2)var2
или (теперь это становится действительно сумасшедшим) - добавьте фиктивный фиктивный параметр только для именования:
- (void)doSomethingWith:(Type1)var1 parameters:(Type2)var2 DUCFD:(id)x
, где x
фактически никогда не используется в методе, и вы передаете nil
для него:
[self doSomethingWith:var1 parameters:var2 DUCFD:nil];
и в конце всегда будет одинаковым, используйте макрос препроцессора:
#define priv DUCFD:nil
#define PRIVATE DUCFD:nil
// ...
[self doSomethingWith:var1 parameters:var2 priv];
[self doSomethingWith:var1 parameters:var2 PRIVATE];
Префикс и суффикс работают также со свойствами (и, следовательно, с их методами ivar, getter / setter), трюк препроцессора выше, конечно, не будет.