2010-01-21 1 views
4

Существует встроенный ярлык NSApp, есть ли причина, по которой я не должен добавлять один для NSFileManager?Есть ли причина, по которой я не должен просто определять #define NSFM [NSFileManager defaultManager] вместо того, чтобы писать каждый раз?

#define NSFM [NSFileManager defaultManager] 

Я думаю, что опущено это сделает мой код понятнее, и я не вижу никакой пользы для поддержания его. (Я планирую делать это во всех моих проектах с этого момента, так что не будет скрывать .)

NSFileManager *fm = [NSFileManager defaultManager] 
+2

NSFM - небезопасно для Microsoft? –

+0

В свете немного большего опыта, определение похоже на плохой стиль. Но в моей защите тонны моих методов использовали NSFileManager, поэтому это казалось хорошей идеей. – zekel

ответ

5

Почему бы вам просто не использовать локальную переменную?

NSFileManager *fm = [NSFileManager defaultManager]; 
// use fm... 

или еще лучше, впрыснуть файловый менеджер, как аргумент метода:

- (void)myMethod { 
    //using [NSFileManager defaultManager] 
} 

становится

- (void)myMethodWithFileManager:(NSFileManager*)fm { 
//usin fm 
} 

Поскольку defaultManager одноэлементно (фактически глобальный), что делает тестирование действительно трудно. Инъекция зависимостей экономит ваше печатание (как вам угодно) внутри метода и упрощает модульное тестирование - вы можете вводить тестовый двойной вместо стандартногоManager.

И, наконец, Cocoa и Objective-C обычно опускаются на привилегированный явный код по короткому коду. Философия в основном заключается в том, что использование более подробных имен делает код более легким для чтения (и, следовательно, для поддержания). Эта философия полностью подходит к селекторному стилю Objective-C с чередующимися именованными аргументами. Если вы не действительно не может обрабатывать дополнительную типизацию (и завершение кода Xcode не будет работать для вас), придерживайтесь существующих имен. Когда в Риме и все это ...

+2

+1 Угол измерения единицы измерения является очень важным моментом.Позор мне не упоминать. –

3

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

Я бы предположил несколько более описательное название: NSFileMgr. Для большинства разработчиков Cocoa это значительно облегчило бы назначение переменной без необходимости искать ее.

UPDATE: Смотрите Barry Wark's answer для некоторых очень хороших точек в отношении тестирования.

+3

Мех. Сокращения. Тьфу. Если вы собираетесь это сделать, по крайней мере используйте что-то вроде * DefaultFileManager * или * DEFAULT_FILE_MANAGER *. Однако, если вы действительно используете файловый менеджер *, *, я бы предложил кэшировать возвращаемое значение в локальной или переменной экземпляра. – bbum

+1

@bbum локальная переменная на самом деле звучит как гораздо лучшая идея: 'NSFileManager * fileManager = [NSFileManager defaultManager];' хотя я не против использования глобальной ссылки для чего-то, что для всех целей и целей является глобальной переменной , –

1

Я буду использовать локальную переменную каждый раз, потому что использование defaultManager не является потокобезопасным. Если в какой-то момент вы начнете использовать потоки в своем приложении, вы можете столкнуться с трудностями поиска ошибок и не знать, почему, пока вы не запустите this bit of documentation.

Смежные вопросы