iOS 中的类别与效用 类

categories vs utility classes in iOS

为什么实用程序 类 在 iOS 中被认为是不好的做法?和类别用作替代而不是助手 classes/utility 类。我们从实用程序 类 得不到的类别中得到什么特别的好处?

实用程序在 iOS 中并不是一个坏习惯。有时,如果您需要一个中央集线器来处理具有特定共同目标的有用功能(即:用于解析 objective-c 中的双精度或整数的 MathUtils class),那么让它们在身边是有意义的。

话虽如此,按照惯例,类别/扩展被认为更好,因为它们允许您直接对对象本身进行操作,而无需分配内存/实例化其他对象。例如,您可以在 NSNumber 对象上创建一个类别以轻松除以数字,从而使您拥有易于遵循的语言语法:即:

在swift中:

number.divideBy(2) 

或 objective-c

[number divideBy:2]

相对于:

let utility = UtilityClass()
utility.divideNumber(number, by:2)

希望这有助于说服您开始使用类别,它们是您最好的朋友!

不应该说效用 classes 一点都不差。这取决于任务。

也许该声明的原因是来自不同编程语言的开发人员不知道类别,而只是使用实用程序 classes,即使是类别也会做得更好。这特别。适用于实用程序 classes,其唯一目的是将现有父级 class 拆分为更轻量级的部分。这有点不好,因为它没有反映 class 的含义:如果代码被正确地放入 class 语义中,您不应该出于管理原因破坏语义。它是class的一部分,让它成为class的一部分。

有一个简单的测试:如果你发现自己经常输入 self.master(因为 master 是原来的 class)(特别是这是唯一的用法self)很明显,实用程序 class 没有单独的用途,完全适用于原始 class。

但是,当然,如果您有一个单独的功能,并由一组单独的 ivar 支持,那么为它们提供额外的 classes 可能是正确的。 (它们仍然实用 classes 吗?也许你应该问你的问题更具体。)

类别有特定的用途。出于某种原因,它们在 class 外部的代码中扩展了 class 的功能(您没有原始来源,您希望该类别具有不同的可见性,...)。

当您说 "helper" class 时,这听起来像是委托而不是类别...或者只是简单的组合。

实际效用 classes -- 没有实例或状态的那些 -- 确实存在于需要的地方。