我有一个 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
.