#define或const string *

时间:2011-11-07 04:52:19

标签: ios rest coding-style naming-conventions

我知道这个问题已被问过几次,但我的情况略有不同。在将其作为副本关闭之前,请完整阅读。 堆栈溢出上有很多帖子说:“就个人而言,我讨厌MACROS,不要使用那个狗屎”。我读过所有这些,我的情况有所不同。我正在尝试使用#define宏来定义软件(iOS应用程序)中使用的URL。

我同意使用const字符串比#define宏更好。但是,在越来越多基于REST的API世界中,接受查询参数作为URL的一部分,您如何仍然使用const字符串来表示更改的URL?

而不是http://api.myblog.com/posts?entryid=%@ 遵循REST原则的API服务器 http://api.blog.com/posts/entries/[entryid]

在前一种类型中,所有条目的URL均为http://api.myblog.com/posts,并且它们不会更改。可以使用const字符串。

在后一种类型中,URL随每个条目而变化,我使用宏扩展为这样的完整URL。

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

我的方法有任何设计缺陷吗? 想知道你的意见。

感谢。

2 个答案:

答案 0 :(得分:4)

从编译器的角度来看,#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__];

它可能会在代码中用[NSString ...,x]替换每次出现的GET_ENTRY_URL(x)。如果objective-c的实现遵循此目的,我们可能会在我们使用宏的任何地方创建实例。

static const / variable似乎是一种更好的方法。

答案 1 :(得分:2)

我在我的应用程序中所做的是为基本路径定义一个const,为每个特定路径定义一个const,必要时在路径内部使用替换格式代码。

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

然后我在运行时为每个API构建URL,如下所示:

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