Xcode 项目组结构的最佳实践?
Best practice for an Xcode project groups structure?
在提供代码示例的教程和示例中,有时我会看到 Xcode 的项目导航器中的项目文件按照 MVC 模式按组排列("Views"、"Controllers", "Model"), 有时它们按功能分组 (例如 "Login", "Checklist").
关于iOS,有苹果的convention/recommendation吗?
哪个应该是最佳做法?
开发人员以多种方式组织他们的组、代码和文件。但是我使用类似下面的东西:
CoreData:包含数据模型和实体类。
扩展:包含一个class(默认苹果class扩展+项目class扩展。)
Helper:包含第三方classes/Frameworks(例如SWRevealController)+桥接classes(例如Obj C class 在基于 Swift 的项目中)
Model:创建一个单例class(eg.AppModel - NSArray、NSDictionary、String 等)用于保存数据。 Web Service Response 解析和存储数据也在这里完成。
服务:包含 Web 服务进程(例如登录验证、HTTP Request/Response)
视图:包含故事板、LaunchScreen.XIB 和视图类。创建一个子文件夹 Cells - 包含 UITableViewCell、UICollectionViewCell 等
Controller: Contain Logic or Code related to UIElements (eg. UIButton's reference+ clicked action) 可以用ViewModel[=代替60=] 如果使用 MVVM。
此结构来自another Stack Overflow post.
这些也可能对您有所帮助:
我实际上创建了一个项目来演示我认为适合中小型代码库的 Xcode 项目结构。你可以找到它 here.
这是它的概要:
- 来源 - 所有源代码
- 帐户 - 帐户相关 类(会话相关 类、帐户逻辑等)
- 应用程序 - 应用程序相关 类。应用委托、配置 类、等
- 核心添加 - 扩展和 sub类 来自 apple 的 类
- 实用程序 - 通用实用程序 类。有用的扩展、格式化实用程序、便利 类 等等
- 基于元素的文件夹 - UIView、UITableViewCell 等的文件夹
- 本地持久性 - 本地持久性层。与本地数据库(领域、核心数据)的所有交互
- 存储库 - 所有与模型相关的本地持久性逻辑
- 常量 - 所有常量。 URL、字体、颜色、错误等
- 模型 - 所有模型(服务器端实体的表示)。我们还会在这里抛出任何对象映射逻辑
- 模块 - 在这里我们可以找到按功能划分的应用程序的每个部分
- 基于模块的文件夹 - 每个文件夹包含所有特定于模块的视图控制器、视图、委托和相关 类
- 网络 - 应用程序的网络层(例如 类 负责与网络服务交互)
- 服务 - 所有与模型相关的网络逻辑
- 故事板 - 包含所有故事板文件
- 资源 - 任何其他资源,如媒体、文档、本地化文件等
在项目中组织文件时,有两种最广为人知的方法。 按类型和按功能组织代码文件。
按类型组织代码
按类型组织代码对于小项目来说是可以的,但对于大项目来说不是一个好习惯。
这样,你把所有Models放在一个文件夹里,所有Views放在另一个文件夹里,所有Controllers 在第三个文件夹等
试想一下,您有大量按类型组织的文件和文件夹,当您处理单个功能时,您必须打开所有文件夹。这会让您感到困惑,并且在滚动浏览文件时可能会迷路很多次。
像这样:
- AppDelegate
- 查看控制器
- 功能 1 VC
- 特征 2 风投
- 特征 3 风投
- 模型
- 特征 1 模型
- 特征 2 模型
- 特征 3 模型
- 观看次数
- 专题 1 浏览量
- 专题 2 次浏览
- 专题 3 次浏览
- 扩展
- 功能 1 扩展
- 功能 2 扩展
- 功能 3 扩展
- 网络
- 资源
按功能(意图)组织代码
按功能(意图)组织代码是大型项目和大型团队的最佳实践。您将与该功能相关的所有内容都放在一个文件夹中,并且在处理该功能时,您不必打开所有其他文件夹(组)。
因为团队通常只专注于一个功能,他们只关注一个文件夹或一组文件。他们不一定需要了解其他功能和文件。
看起来像这样:
- AppDelegate
- 特点
- 特征 1
- 查看控制器
- 型号
- 观看次数
- 逻辑
- 特征 2
- 查看控制器
- 型号
- 观看次数
- 逻辑
- 网络
- 型号
- 逻辑
- 扩展程序
- 资源
此外,值得一提的是,这种做法和技术(按功能组织项目)已被世界上最大的公司所采用。因此,他们根据项目的特性划分团队,每个团队都致力于特定的特性。除此之外,当你使用 git
时,它减少了合并和变基时发生冲突的可能性。
在提供代码示例的教程和示例中,有时我会看到 Xcode 的项目导航器中的项目文件按照 MVC 模式按组排列("Views"、"Controllers", "Model"), 有时它们按功能分组 (例如 "Login", "Checklist").
关于iOS,有苹果的convention/recommendation吗? 哪个应该是最佳做法?
开发人员以多种方式组织他们的组、代码和文件。但是我使用类似下面的东西:
CoreData:包含数据模型和实体类。
扩展:包含一个class(默认苹果class扩展+项目class扩展。)
Helper:包含第三方classes/Frameworks(例如SWRevealController)+桥接classes(例如Obj C class 在基于 Swift 的项目中)
Model:创建一个单例class(eg.AppModel - NSArray、NSDictionary、String 等)用于保存数据。 Web Service Response 解析和存储数据也在这里完成。
服务:包含 Web 服务进程(例如登录验证、HTTP Request/Response)
视图:包含故事板、LaunchScreen.XIB 和视图类。创建一个子文件夹 Cells - 包含 UITableViewCell、UICollectionViewCell 等
Controller: Contain Logic or Code related to UIElements (eg. UIButton's reference+ clicked action) 可以用ViewModel[=代替60=] 如果使用 MVVM。
此结构来自another Stack Overflow post.
这些也可能对您有所帮助:
我实际上创建了一个项目来演示我认为适合中小型代码库的 Xcode 项目结构。你可以找到它 here.
这是它的概要:
- 来源 - 所有源代码
- 帐户 - 帐户相关 类(会话相关 类、帐户逻辑等)
- 应用程序 - 应用程序相关 类。应用委托、配置 类、等
- 核心添加 - 扩展和 sub类 来自 apple 的 类
- 实用程序 - 通用实用程序 类。有用的扩展、格式化实用程序、便利 类 等等
- 基于元素的文件夹 - UIView、UITableViewCell 等的文件夹
- 本地持久性 - 本地持久性层。与本地数据库(领域、核心数据)的所有交互
- 存储库 - 所有与模型相关的本地持久性逻辑
- 常量 - 所有常量。 URL、字体、颜色、错误等
- 模型 - 所有模型(服务器端实体的表示)。我们还会在这里抛出任何对象映射逻辑
- 模块 - 在这里我们可以找到按功能划分的应用程序的每个部分
- 基于模块的文件夹 - 每个文件夹包含所有特定于模块的视图控制器、视图、委托和相关 类
- 网络 - 应用程序的网络层(例如 类 负责与网络服务交互)
- 服务 - 所有与模型相关的网络逻辑
- 故事板 - 包含所有故事板文件
- 资源 - 任何其他资源,如媒体、文档、本地化文件等
在项目中组织文件时,有两种最广为人知的方法。 按类型和按功能组织代码文件。
按类型组织代码
按类型组织代码对于小项目来说是可以的,但对于大项目来说不是一个好习惯。
这样,你把所有Models放在一个文件夹里,所有Views放在另一个文件夹里,所有Controllers 在第三个文件夹等
试想一下,您有大量按类型组织的文件和文件夹,当您处理单个功能时,您必须打开所有文件夹。这会让您感到困惑,并且在滚动浏览文件时可能会迷路很多次。
像这样:
- AppDelegate
- 查看控制器
- 功能 1 VC
- 特征 2 风投
- 特征 3 风投
- 模型
- 特征 1 模型
- 特征 2 模型
- 特征 3 模型
- 观看次数
- 专题 1 浏览量
- 专题 2 次浏览
- 专题 3 次浏览
- 扩展
- 功能 1 扩展
- 功能 2 扩展
- 功能 3 扩展
- 网络
- 资源
按功能(意图)组织代码
按功能(意图)组织代码是大型项目和大型团队的最佳实践。您将与该功能相关的所有内容都放在一个文件夹中,并且在处理该功能时,您不必打开所有其他文件夹(组)。
因为团队通常只专注于一个功能,他们只关注一个文件夹或一组文件。他们不一定需要了解其他功能和文件。
看起来像这样:
- AppDelegate
- 特点
- 特征 1
- 查看控制器
- 型号
- 观看次数
- 逻辑
- 特征 2
- 查看控制器
- 型号
- 观看次数
- 逻辑
- 特征 1
- 网络
- 型号
- 逻辑
- 扩展程序
- 资源
此外,值得一提的是,这种做法和技术(按功能组织项目)已被世界上最大的公司所采用。因此,他们根据项目的特性划分团队,每个团队都致力于特定的特性。除此之外,当你使用 git
时,它减少了合并和变基时发生冲突的可能性。