我正在构建一个我可能会考虑开源的项目。我有一个 UIView 类别,它使我可以轻松访问设置 x、y 坐标或宽度,并直接留给 UIView,而无需处理框架。
我的问题是,如果我打算开源它,我应该在我的项目中使用这些类别吗?
很多项目都会有类似的类别,比如 UIView 的方法
- (void)setLeft:(CGFloat)left;
或
- (void)setX:(CGFloat)x;
我的理解是,如果 2 个类别创建一个方法,您将无法保证将调用哪个类别。
那么……我该怎么办?根本不使用类别并在我的开源项目中处理这些恼人的代码?使用类别并可能在方法名称前加上前缀?
谢谢!
不要费心添加这些方法。
它们节省了很少的输入,你真正应该添加的前缀会很丑陋,而且它们几乎没有增加真正的便利,同时使针对添加的 API 编写的代码不再可移植到缺少它的项目。
同样,拥有一堆方便的方法使得子类化变得更加困难。您必须覆盖哪些方法? KVO 的行为是什么?是否有一种原始方法可以让所有内容都通过,或者您真的必须覆盖所有内容吗?
框架通常不会添加这种方便的 API,因为它会在引发上述所有问题的同时给 API 带来很多额外的“重量”。所有这些额外的方法只是开发人员在向项目介绍新人时必须了解、记住并向他人解释的更多数据点。
一个异常(exception)是类簇类; NSString、NSArray 等……它们有一组核心的原始方法,提供实现其余 API 所需的所有功能。抽象类的其余方法完全根据这些原始方法实现。子类化时,您只需实现原语,所有其他行为将“正常工作”。但是,子类可以出于优化或自定义目的自由覆盖任何非基元(尽管要小心,您确实应该保留这种行为)。
一般的经验法则是,如果便利的 API 不能定期保存多于几行代码,那么它就不值得。