9

我正在构建一个我可能会考虑开源的项目。我有一个 UIView 类别,它为我提供了简单的访问器来设置 x、y 坐标或宽度并直接留给 UIView,而无需处理框架。我的问题是,如果我打算开源,我应该在我的项目中使用这些类别吗?

很多项目都会有类似的类别,其中包含 UIView 的方法,例如

- (void)setLeft:(CGFloat)left;

或者

- (void)setX:(CGFloat)x;

我的理解是,如果 2 个类别创建一个方法,您将无法保证将调用哪个。

所以我该怎么做?根本不使用类别并在我的开源项目中处理这个烦人的代码?使用类别并可能在方法名称前面加上前缀?

谢谢!

4

2 回答 2

11

不要费心添加这些方法。

它们节省了很少的输入,您真正应该添加的前缀会很丑陋,并且它们几乎没有增加任何真正的便利,同时使针对添加的 API 编写的代码不再可移植到缺少它的项目中。

同样,拥有一堆方便的方法会使子类化变得更加困难。您必须覆盖哪些方法?KVO 的行为是什么?是否有一种原始方法可以将所有内容都集中起来,还是您真的必须覆盖所有内容?

框架通常不会添加这种便利的 API,因为它会为 API 增加很多额外的“重量”,同时会引发上述所有问题。所有这些额外的方法只是开发人员在向项目介绍新人时必须了解、记住和向他人解释的更多数据点。

一个例外是类集群类;NSString、NSArray 等……它们有一组核心的原始方法,提供实现其余 API 所需的所有功能。抽象类的其余方法完全根据这些原始方法实现。子类化时,您只需要实现原语,所有其他行为都将“正常工作”。但是,子类可以自由地覆盖任何非基元以进行优化或定制(不过,小心,您确实应该保留这种行为)。

一般的经验法则是,如果一个便利的 API 不能定期保存超过几行代码,那就不值得了。

于 2013-06-15T22:41:06.583 回答
5

由于Objective C 不支持命名空间,因此如果您打算共享它,那么确保您的代码是唯一的一种常用方法是在您的方法前面加上一些与您的项目特别相关的字母。

如果您将 setLeft 和 setX 重命名为 LMSetLeft 和 LMSetX,您应该会显着减少发生冲突的机会。

只要您使用 IDE 的重构工具,这也应该是一个非常容易的更改。

于 2013-06-15T20:56:49.967 回答