iOS-SOLID原则第2页-开放/封闭原则
打开/关闭原理指出模块应该打开以进行扩展,而关闭则可以进行修改。
从本质上讲,在iOS中,这意味着应该通过扩展打开模块,无论是通过快速扩展(或Obj-C类别),子类还是通过依赖项注入(或可以提供的其他任何扩展模块)。
使用扩展模块的任何其他模块仍应能够使用它。 这与SRP原理非常吻合,因为您无需使用该模块更改其他模块中的任何内容。
我将演示第一个示例—在第一部分的ImageStorage类示例中进行子类化。
假设我们要添加一个新的ImageStorage类,它所做的只是保存带有黑色效果的图像。
我们要做的就是子类化ImageStorage并覆盖它的saveImage函数:
如你看到的
我们仍然可以像以前一样使用ImageStorage 。 它没有任何改变,因为我们以对扩展开放的方式编写了ImageStorage 。 它应保持关闭状态以进行修改,因为任何修改都可能使其他模块以我们不希望或期望的方式运行。
对于此示例,我们将修改ImageStorage类的工作方式。 我们将为其添加文件访问器。 从现在开始,所有文件I / O将成为访问者的工作。 (这也将给我们带来更高级别的职责分离。SRP FTW!)
首先,由于我们使用依赖注入,因此ImageStorage现在不能使用静态函数。
接下来,我们需要声明文件访问器协议:
现在,我们需要更改ImageStorage类。
我们将通过init()注入FilesAccessor,从现在开始,加载和保存功能将与FilesAccessor一起使用:
现在,我们可以实现我们的DocumentDirectoryFileAccessor:
最后,我们需要修改ProfilePicManager以使其与具有特定FilesAccessor的特定ImageStorage一起使用 。 例如,我们可以这样做(第9行):
现在,我们可以欣赏代码的灵活性
我们可以走这行:
let imageStorage = ImageStorage(访问器:DocumentDirectoryFilesAccessor())
并替换为:
let imageStorage = NoirImageStorage(访问器:RemoteServerFilesAccessor())
然后,我们会将带有Noir效果的图像存储在服务器上
( RemoteServerFilesAccessor将与某些服务层模块一起使用)。
视图控制器对此更改一无所知,并且扩展我们的ImagesStorage现在是无限的。 我们可以声明所需的任何访问器,并将它们注入到任何ImageStorage中 ,只要它们符合FileAccessor即可 。
这导致我们进入第3部分: Liskov替代原理。