1

我有一个 Objective-C 库,其中有许多类继承了一个公共基类,而它们不使用基类的任何功能。(或者具体一点,除了接口定义之外,它们都没有应用程序代码。)

然而,在基类中,我大量使用反射,它将根据我可以从子类中提取的任何接口信息执行其子类中缺少的方法实现的任务。这实际上将其子类的源文件转换为配置文件,这些文件可以使用 Objective-C 编译器进行编译并链接到二进制文件中。

而且空类的库是我们团队里一个不懂Objective-C的人写的。

所以我在想,这段代码有味道吗?或者它是一个出色的设计?

编辑

子类本质上是空的,只有接口声明,没有真正的代码。同时,基类利用运行时获取信息来做一些事情,包括:

  • 基于 Objective-C 属性自省和 KVC 将子类序列化为 JSON 数据并从其反序列化。子类可能包含确保所有内容都正确键入的提示。
  • 基于子类上调用的方法与服务器通信,具有自动序列化和反序列化。

例如:

@interface CGIDemoRequest : CGIRemoteObject
@property NSString *name;
- (id)hello
@end // This is it. Implementation of this class is empty.

当你使用时:

{
    // ...
    [[CGIRemoteConnection defaultConnection] setAddressPattern:@"http://www.example.com/api/%@.cgi"];
    // ...
    CGIDemoRequest *req = [CGIDemoRequest new];
    req.name = @"John Doe";
    id resp = [req hello];
    // ...
}

[req hello]调用将导致基类将req对象序列化为 JSON: {"name": "John Doe"},POST 到远程地址http://www.example.com/api/Hello.cgi,获取响应,并将响应反序列化回对象,返回它进入resp.

4

1 回答 1

1

代码气味。一种出色的,出色的,有点代码气味。

具体来说,闻起来就像您在现有的运行时和基类 (NSObject) 之上发明了自己的运行时 + 基类。

如果它有效(并且运作良好,不会比传统实现花费更多的时间,等等),然后运行它。风险在于它最终会减慢开发速度和/或极难重构以利用系统 API 或随着应用程序的总体功能集的发展。

口头禅: 性能最好的应用程序通常是最先发布的应用程序。

请注意,系统 API 中有一个不同的实例。Core Data 的 NSManagedObject 正是一个类,它提供了一组基本功能,然后通过存储在托管对象模型中的配置信息来配置子类。

最后,这样的练习对于学习 Objective-C 和 OO 设计模式的精妙之处非常有价值。

于 2013-06-05T15:13:12.707 回答