iOS-SOLID原则第2页-开放/封闭原则

打开/关闭原理指出模块应该打开以进行扩展,而关闭则可以进行修改。

从本质上讲,在iOS中,这意味着应该通过扩展打开模块,无论是通过快速扩展(或Obj-C类别),子类还是通过依赖项注入(或可以提供的其他任何扩展模块)。

使用扩展模块的任何其他模块仍应能够使用它。 这与SRP原理非常吻合,因为您无需使用该模块更改其他模块中的任何内容。


我将演示第一个示例—在第一部分的ImageStorage类示例中进行类化。
假设我们要添加一个新的ImageStorage类,它所做的只是保存带有黑色效果的图像。

我们要做的就是子类化ImageStorage并覆盖它的saveImage函数:

如你看到的

我们仍然可以像以前一样使用ImageStorage 。 它没有任何改变,因为我们以对扩展开放的方式编写了ImageStorage 。 它应保持关闭状态以进行修改,因为任何修改都可能使其他模块以我们不希望或期望的方式运行。


对于此示例,我们将修改ImageStorage类的工作方式。 我们将为其添加文件访问器。 从现在开始,所有文件I / O将成为访问者的工作。 (这也将给我们带来更高级别的职责分离。SRP FTW!)

首先,由于我们使用依赖注入,因此ImageStorage现在不能使用静态函数。

接下来,我们需要声明文件访问器协议:

现在,我们需要更改ImageStorage类。

我们将通过init()注入FilesAccessor,从现在开始,加载和保存功能将与FilesAccessor一起使用:

看看SRP效果如何? 现在,ImageStorage不再关心文件访问的责任。

现在,我们可以实现我们的DocumentDirectoryFileAccessor:

最后,我们需要修改ProfilePicManager以使其与具有特定FilesAccessor的特定ImageStorage一起使用 。 例如,我们可以这样做(第9行):


现在,我们可以欣赏代码的灵活性
我们可以走这行:

  let imageStorage = ImageStorage(访问器:DocumentDirectoryFilesAccessor()) 

并替换为:

  let imageStorage = NoirImageStorage(访问器:RemoteServerFilesAccessor()) 

然后,我们会将带有Noir效果的图像存储在服务器上
RemoteServerFilesAccessor将与某些服务层模块一起使用)。

视图控制器对此更改一无所知,并且扩展我们的ImagesStorage现在是无限的。 我们可以声明所需的任何访问器,并将它们注入到任何ImageStorage中 ,只要它们符合FileAccessor即可


这导致我们进入第3部分: Liskov替代原理。