#define или const string * - PullRequest
       6

#define или const string *

8 голосов
/ 07 ноября 2011

Я знаю, что этот вопрос задавался несколько раз, но мой немного отличается. Прежде чем закрыть это как дубликат, пожалуйста, прочитайте его полностью. Есть много сообщений о переполнении стека, которые говорят: «Лично я ненавижу MACROS, не используйте это дерьмо». Я прочитал все это, и мой случай отличается. Я пытаюсь определить URL-адреса, используемые в программном обеспечении (приложении iOS), с помощью #define macros.

Я согласен, что использование константных строк лучше, чем макросы #define. Но в мире API, основанном на REST, который принимает параметры запроса как часть URL, как вы все еще можете использовать строки const для представления изменяющегося URL?

Вместо http://api.myblog.com/posts?entryid=%@ Сервер API, который следовал бы принципам REST http://api.blog.com/posts/entries/[entryid]

В первом типе URL является http://api.myblog.com/posts для всех записей, и они не изменяются. Возможна константная строка.

В последнем типе URL меняется с каждой записью, и я использую макрос, который расширяется до полного URL, как это.

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__];

Есть ли в моем методе недостатки дизайна? Хотелось бы узнать ваши входные данные.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 07 ноября 2011

С точки зрения компилятора, #define - это директива препроцессора (см. Определение в c, http://en.wikipedia.org/wiki/C_preprocessor).

В этом случае компилятор может выполнить полную замену текста перед компиляцией ваших кодов.

например: если вы определите:

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__];

это может заменить все вхождения GET_ENTRY_URL (x) на [NSString ..., x] в ваших кодах. Потенциально, экземпляры могут создаваться везде, где мы используем макрос, если за этим следует реализация target-c.

статическая константа / переменная кажется лучшим способом.

2 голосов
/ 07 ноября 2011

В моем приложении я определил const для базового пути и const для каждого конкретного пути с кодами формата замены внутри пути, когда это необходимо.

NSString const *APIBasePath        = @"http://api.mydomain.com";
NSString const *APIEntryPath       = @"/entries/%d";
NSString const *APIUpdateEntryPath = @"/entries/%d/update";

Затем я создаю URL во время выполнения для каждого API следующим образом:

- (void)updateEntryNumber:(NSUInteger)entryNumber
{
  NSString *updateEntryPath = [NSString stringWithFormat:APIUpdateEntryPath, entryNumber];
  NSString *APIPath = [APIBasePath stringByAppendingPathComponent:updateEntryPath];
  // do something
}
...