Ответ 1
Передача NULL
аргументам, вызывающим NSError**
, чистым леним.
Каковы эти плохие привычки, которые вы разработали с тех пор, как вы начали кодирование в Cocoa?
Я думаю, создавая список плохих привычек и активно добавляя к нему, и, что более важно, нарушение этих привычек - хорошая техника для создания вашего качества кода. Так что начните сейчас, получите свои плохие привычки со своей груди. Возможно, другие люди разделяют ваши плохие привычки.
Передача NULL
аргументам, вызывающим NSError**
, чистым леним.
Не достаточно тестирования устройства. Это действительно сложно очистить и код рефакторинга, если у вас нет модульных тестов. И без постоянного рефакторинга и очистки кодовая гниль начинает устанавливать и распространять.
Использование шаблона singleton для совместного использования объектов, например + [MyObject defaultObject]. Это, по сути, глобальная переменная, которая делает некоторые приятные скрытые зависимости и связь. Это, в свою очередь, затрудняет проверку кода.
(И другие непредвиденные обстоятельства.)
Так как использование исключений приведено здесь в другом ответе, а documentation, о котором говорится в комментариях, не особо подчеркивает этот момент, следует подчеркнуть, что исключения не должны использоваться для нормального потока управления (как это обычно бывает в некоторых других средах). Исключения в Cocoa сравнительно дороги. Если вы хотите сообщить об ошибке, используйте объект NSError
и архитектура обработки ошибок, предоставленную Cocoa. Не бросайте исключения.
Вот некоторые из моих:
Бросание исключений без каких-либо попыток поймать их. Я начал все больше полагаться на NSError, чтобы помешать NSExceptions летать примерно как пули в фильме John Woo, но у меня все еще есть много исключительного кода.
Написание быстрого класса для выполнения X, Y и Z, а затем забывание очистить в dealloc. Утечки ahoy!
Использование строк непосредственно в разных местах (KVO) вместо определения константы и использования этого (см. Dave Dribin превосходное сообщение в блоге о KVO для более )
Я лгаю об использовании аксессуаров внутри классов. Обычно самая большая проблема заключается в том, что я не могу легко рассказать об объеме этой переменной с быстрым взглядом. Затем я провел несколько часов на прошлой неделе, отлаживая проблемы с повреждением памяти, которые были связаны с использованием
self.displayName = name
в некоторых местах и
displayName = name
в других. Я был счастлив, когда нашел его, и мое приложение перестало рушиться. Я не был так счастлив, что потратил несколько часов на поиски такой предотвратимой ошибки.
Я чаще использую #define, где я должен использовать объявления const.
Кроме того, я, вероятно, слишком плодовитый в NSNotifications, которые я бросаю; развязать бег amok!
Плохая привычка: сохранение моего мышления.
Мой Java-фон заставляет меня одержимо проверить нуль, даже подумав о том, чтобы что-то делать с переменной, когда я мог использовать возможность Objective-C отправлять сообщение в nil. (См.: Отправка сообщения в нуль?)
Вместо того, чтобы пытаться улавливать ноль, я должен напомнить себе, что Objective-C позволяет мне просто писать код, который изящно работает с возвращаемыми значениями 0 или nil.
Ты имеешь в виду, кроме самодовольства, когда я умею делать в десяти строках, что берет MFC-кодер 300? Я полагаю, что моя самая большая проблема в моем собственном коде - взрыв аксессуаров; следующая работа над проектом Я делаю, я поставил перед собой задачу использовать наименьшее количество свойств.
Неправильные привязки для привязки свойств объекта модели друг к другу. Это использование Bindings приводит к тому, что трудно понять, трудно отлаживать и трудно тестировать. Используйте привязки только для привязки интерфейса к контроллеру. Если вам нужны развязанные модели, используйте NSNotification вместо привязок. По крайней мере, это немного более явный, чем KVO.
Строки жесткого кодирования, такие как кнопки/заголовки. Чистый ленивый. Теперь нужно вытащить все, чтобы поддерживать локализацию: (
Я научился ненавидеть интерфейс @# $% - er назад, когда он был намного менее полезен и более глючен, чем сейчас, и поэтому имеет тенденцию создавать весь мой пользовательский интерфейс в коде, стойко все же избегая IB. Это глупо, поскольку я знаю, что это снижает мою производительность на тонну, но мне просто не кажется, что мне надоело проводить дневное обучение, как подключать вещи к IB. (Да, я знаю, как делать простые вещи, но я всегда раздражаюсь, когда есть некоторые вещи, которые не очень простые, а IB, похоже, работает против меня.)
Хорошо, ты убедил меня - я собираюсь сломать ЭТО плохую привычку в эти выходные.
Спасибо!:)
Это несколько общий и необязательный cocoa специфический, но:
Недостаточно рефакторинга, потому что лень обновлять файлы .m и .h.
XCode 3 упрощает некоторые виды рефакторинга, такие как переименования, но я обнаружил, что рефакторинг реже реже, чем на Java или С#, и что плохая привычка я пытаюсь сломать.
1) При использовании частных глобальных переменных запустите их с символами подчеркивания и поместите их в часть интерфейса .m файла так:
@interface MyViewController (){
NSArray *_tableData;
NSNumberFormatter *_numberFormat;
}
2) Используйте только @properties для глобальных общедоступных переменных и/или элементов интерфейса.
3) Синтезировать глобальную публику и называть их по имени.
4) Вызовите элементы интерфейса с помощью self.labelTitle NOT _labelTitle.
Основная причина, по которой я использую эти соглашения об именах переменных, заключается в том, что я могу легко просматривать переменную и знать, для чего она используется, и ее область действия, но в основном это работа для ошибки в XCode, где вы пытаетесь и рефакторинг → переименовывать переменная в проекте, и она не работает в определенных обстоятельствах вне этого соглашения.
Я реорганизую свои имена переменных LOT, и эта система облегчила мне много проблем.
Другие быстрые советы:
Это просто у меня на голове. Конечно, некоторые люди могут не согласиться с тем, что я написал, но эти привычки работали для меня, когда я начинал.
Мне часто приходится забывать вводить return self;
часть моих конструкторов. К счастью, я начал нарушать эту особую привычку.