用于多平台开发的模块化体系结构:第1部分

这是3部分系列的第1部分。 您可以在这里找到其他部分:

第2部分:接口和框架开发
第3部分:演示和UI

配套项目: Github

驯服海妖

截至2019年1月,苹果在全球范围内拥有14亿台有源设备。 我们中的许多人至少拥有2或3。我们会在一整天在Mac电脑上工作,在iPhone上浏览以及在Apple Watch上浏览之间切换。 我们希望连续性经验是无缝的。 跨平台存在巨大的机会。 但是,很多时候我们将开发工作仅集中在一个平台上。 我们担心会增加复杂性,增加预算和不合时宜的时间表。 我们害怕神话人物- 海妖

本文试图驯服怪物。 但是,它不是“快速致富”教程。 为多个平台构建应用程序意味着需要额外的维护,编码,测试,设计/ UX资源,以及将您的应用程序作为系统的全面综合的高级思考。 但是,通过正确的方法,应用一些最佳实践方法和技术,肯定可以以实际有效的方式实现。

下面的示例代表了一个更极端的情况,我们将为iPhoneApple TVApple WatchApple TV构建一个幻灯片应用程序。 苹果硬件生态系统的四个触角可供开发。 下一次我们将离开第五台iPad 。 并希望将来HomePodVR / AR眼镜甚至Apple Car能够完成Kraken缺少的触角。

您的海妖可能会有所不同。 它可能只是一个触手可及的一个iPhone应用程序。 这里讨论的许多原理(例如模块化)仍然适用并且非常有帮助。 继续阅读。

所有伟大的项目都始于良好的架构

建筑

幻灯片应用程序很简单:它将每隔几秒钟显示一次来自Unsplash的随机照片。 根据平台的不同,它还将显示摄影师的姓名,图像描述和喜欢的图像。

我们要做的第一件事是决定如何将所需的功能分解为各个组件以分离关注点。 在我们的案例中,有明确的界限。 将与Unsplash API通信的业务逻辑分离到其自己的模块中是有意义的。 我们将其称为ShowEngine 。 我们还可以将负责按一定时间间隔加载每个映像的运行循环代码分离到其自己的模块/类中,以更接近于单一职责原则。 但是对于这个简单的示例,我们将其放在一起。 在上图中, ShowEngine用绿色表示。 这是一个可重用的框架,我们将与系统的其余部分集成。 由于这些功能都不依赖于UIKit或AppKit,因此我们可以将其构建为Mac目标,并且仍然可以在其他平台上重用。 作为Mac目标进行构建的另一个好处是,我们不必依赖模拟器。 因此,例如,运行单元测试要快得多。

接下来,我们将每个平台的表示层代码保留在各自的模块中。 您可以说这里有很多共同点,因此有机会共享代码。 那是完全合法的。 对于此示例,我们将使事情保持简单,并将每个平台都放在单独的模块中。 在重复和使项目可能过于复杂和僵化之间进行权衡。 关键是,对于所有用例,没有一种完美的架构。 您必须查看要解决的问题,并构建可以最好地解决的问题。

最后,我们将使用AppDelegate / Factory / Composer构建Main模块,在其中我们将组合ShowEngine和表示层的实例。

该体系结构中一个非常重要的因素是抽象和我们将要构建的接口,该接口将允许模块彼此通信。 我们将使用委托作为接口,但是使用闭包可以完成相同的事情。 该解决方案将使Presentation / UI模块与Business Logic / ShowEngine模块无关。 如果任何时候我们想更改ShowEngine的实现细节或更改图像提供程序,都可以在不更改其余代码库的情况下进行。

在不影响体系结构的情况下,让我们设置项目…

设定

项目设置

设置可能看起来很广泛,但是这里有很多重复–可以保证,它将很快进行。 该项目包含适用于我们所有平台特定目标的SlideShow 。 而ShowEngineFramework将成为共享模块:

Open Xcode > New Project > Cross-platform > Empty > Name it " SlideShow"

现在我们有了主机应用程序项目,让我们向其添加框架项目。

New Project > Cross-platform > Empty > Name it " ShowEngineFramework"

保存此项目时,请确保在“ Add to下拉列表中选择“ SlideShow 。 Xcode项目应如下所示: