diff --git a/Chapter1 - iOS/1.52.md b/Chapter1 - iOS/1.52.md index 66f9c2f..8c4b344 100644 --- a/Chapter1 - iOS/1.52.md +++ b/Chapter1 - iOS/1.52.md @@ -1,12 +1,19 @@ -# 如何打造团队的代码风格统一以及开发效率的提升 +# 开发效率提升利器 -> 最近重构项目组件,看到项目中存在一些命名和方法分块方面存在一些问题,结合平时经验和 [Apple官方代码规范](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html) 在此整理出 iOS 工程规范。提出第一个版本,如果后期觉得有不完善的地方,继续提出来不断完善,文档在此记录的目的就是为了大家的代码可读性较好,后来的人或者团队里面的其他人看到代码可以不会因为代码风格和可读性上面造成较大时间的开销。 - - 软件的生命周期贯穿产品的开发,测试,生产,用户使用,版本升级和后期维护等过程,只有易读,易维护的软件代码才具有生命力。 +> 软件的生命周期贯穿产品的开发,测试,生产,用户使用,版本升级和后期维护等过程,只有易读,易维护的软件代码才具有生命力。 -## 一些原则 + +## 一、思路 + +最近重构项目组件,看到项目中存在一些命名和方法分块方面存在一些问题,结合平时经验和 [Apple官方代码规范](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html) 在此整理出 iOS 工程规范。提出第一个版本,如果后期觉得有不完善的地方,继续提出来不断完善,文档在此记录的目的就是为了大家的代码可读性较好,后来的人或者团队里面的其他人看到代码可以不会因为代码风格和可读性上面造成较大时间的开销。 + +先梳理出规范,然后使用一些脚本的方式,提高大家使用的便捷性与效率,最后开发一些协作脚本。 + + + +## 二、一些原则 1. 长的,描述性的方法和变量命名是好的。不要使用简写,除非是一些大家都知道的场景比如 VIP。不要使用 bgView,推荐使用 backgroundView 2. 见名知意。含义清楚,做好不加注释代码自我表述能力强。(前提是代码足够规范) @@ -37,21 +44,18 @@ } ``` - -## 变量 +### 变量 1. 一个变量最好只有一个作用,切勿为了节省代码行数,觉得一个变量可以做多个用途。(单一原则) 2. 方法内部如果有局部变量,那么局部变量应该靠近在使用的地方,而不是全部在顶部声明全部的局部变量。 - -## 运算符 +### 运算符 1. 1元运算符和变量之间不需要空格。例如:++n 2. 2元运算符与变量之间需要空格隔开。例如: containerWidth = 0.3 * Screen_Width 3. 当有多个运算符的时候需要使用括号来明确正确的顺序,可读性较好。例如: 2 << (1 + 2 * 3 - 4) - -## 条件表达式 +### 条件表达式 1. 当有条件过多、过长的时候需要换行,为了代码看起来整齐些 ``` @@ -115,7 +119,8 @@ switch (menuType) { ``` -## 类名 + +### 类名 1. 大写驼峰式命名。每个单词首字母大写。比如「申请记录控制器」ApplyRecordsViewController 2. 每个类型的命名以该类型结尾。 @@ -128,13 +133,11 @@ switch (menuType) { - 代理类:Delegate - Service 类:Service - -## 类的注释 +### 类的注释 有时候我们需要为我们创建的类设置一些注释。我们可以在类的下面添加。 - -## 枚举 +### 枚举 枚举的命名和类的命名相近。 ``` @@ -146,8 +149,7 @@ typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) { }; ``` - -## 宏 +### 宏 1. 全部大写,单词与单词之间用 `_` 连接。 2. 以 `K` 开头。后面遵循大写驼峰命名。「不带参数」 @@ -157,8 +159,7 @@ typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) { #define KHomePageDidScroll @"com.xq.home.page.tableview.did.scroll" ``` - -## 属性 +### 属性 书写规则,基本上就是 `@property 之后空一格,括号,里面的 线程修饰词、内存修饰词、读写修饰词,空一格 类 对象名称` 根据不同的场景选择合适的修饰符。 @@ -170,8 +171,7 @@ typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) { @property (nonatomic, copy) <#returnType#> (^<#Block#>)(<#parType#>); ``` - -## 单例 +### 单例 单例适合全局管理状态或者事件的场景。一旦创建,对象的指针保存在静态区,单例对象在堆内存中分配的内存空间只有程序销毁的时候才会释放。基于这种特点,那么我们类似 UIApplication 对象,需要全局访问唯一一个对象的情况才适合单例,或者访问频次较高的情况。我们的功能模块的生命周期肯定小于 App 的生命周期,如果多个单例对象的话,势必 App 的开销会很大,糟糕的情况系统会杀死 App。如果觉得非要用单例比较好,那么注意需要在合适的场合 tearDown 掉。 @@ -220,13 +220,14 @@ typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) { ``` -## 私有变量 + +### 私有变量 推荐以 `_` 开头,写在 .m 文件中。例如 NSString * _somePrivateVariable -## 代理方法 +### 代理方法 1. 类的实例必须作为方法的参数之一。 2. 对于一些连续的状态的,可以加一些 will(将要)、did(已经) @@ -239,7 +240,8 @@ typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) { ``` -## 方法 + +### 方法 1. 方法与方法之间间隔一行 2. 大量的方法尽量要以组的形式放在一起,比如生命周期函数、公有方法、私有方法、setter && getter、代理方法.. @@ -365,7 +367,8 @@ typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) { ``` -## 图片资源 + +### 图片资源 1. 单个文件的命名 文件资源的命名也需要一定的规范,形式为:功能模块名_类别_功能_状态@nx.png @@ -375,7 +378,8 @@ typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) { 最好也参考 App 按照功能模块建立对应的实体文件夹目录,最后到对应的目录下添加相应的资源文件。 -## 注释 + +### 注释 1. 对于类的注释写在当前类文件的顶部 2. 对于属性的注释需要写在属性后面的地方。 //** 1.1.1 | | a.b.**C** | 属于补丁更新 | 1.0.2 -> 1.0.3 | - -## 改进 +### 改进 我们知道了平时在使用 Xcode 开发的过程中使用的系统提供的代码块所在的地址和新建控制器、模型、view等的文件模版的存放文件夹地址后,我们就可以设想下我们是否可以定制自己团队风格的控制器模版、是否可以打造和维护自己团队的高频使用的代码块? @@ -405,14 +407,16 @@ Xcode 代码块的存放地址:`~/Library/Developer/Xcode/UserData/CodeSnippet Xcode 文件模版的存放地址:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/ -## 意义 + +### 意义 1. 为了个人或者团队开发者的代码更加规范。Property的书写的时候的空格、线程修饰词、内存修饰词的先后顺序 2. 提供大量可用的代码块,提高开发效率。比如在 Xcode 里面敲 UITableView_init 便可以自动懒加载创建一个 UITabelView 对象,你只需要设置在指定的位置写相应的参数 3. 通过一些代码块提高代码规范、避免一些bug。比如曾看到过 block 属性用 strong 修饰的代码,造成内存泄漏。举个例子你在 Xcode 中输入 **Property_delegate** 就会出来 `@property (nonatomic, weak) id<<#delegate#>> delegate;`,你输入 **Property_block** 就会出来 `@property (nonatomic, copy) <#returnType#> (^<#Block#>)(<#parType#>);` -## 代码块的改造 + +## 三、 代码块的改造 我们可以将属性、控制器生命周期方法、单例构造一个对象的方法、代理方法、block、GCD、UITableView 懒加载、UITableViewCell 注册、UITableView 代理方法的实现、UICollectionVIew 懒加载、UICollectionVIewCell 注册、UICollectionView 的代理方法实现等等组织为 codesnippets @@ -462,7 +466,7 @@ Xcode 文件模版的存放地址:/Applications/Xcode.app/Contents/Developer/P 4. 将当前的所有文件提交到 Git 仓库 -## 文件模版的改造 +## 四、文件模版的改造 我们观察系统文件模版的特点,和在 Xcode 新建文件模版对应。 @@ -507,31 +511,62 @@ Xcode 文件模版的存放地址:/Applications/Xcode.app/Contents/Developer/P 3. 进入存放 file template 的文件夹将内容复制到系统存放 file template 的地方 -## 内容及其如何使用 - -1. Property 属性。敲 **Property_** 自动联想,光标移动选中后敲回车自动补全 -2. Mark 标识。 敲 **Mark_** 自动联想,会展示各种常用的 Mark,光标移动选中后敲回车自动补全 -3. Method 方法。敲 **Method_** 自动联想,会展示各种常用的 Method,光标移动选中后敲回车自动补全 -4. GCD。敲 **GCD_** 自动联想,会展示各种常用的 GCD,光标移动选中后敲回车自动补全 -5. 常用 UI 控件的懒加载。敲 **_init** 自动联想,展示常用的 UI 控件的懒加载,光标移动选中后敲回车自动补全 -6. Delegate。敲 **Delegate_** 自动联想,会展示各种常用的 Delegate,光标移动选中后敲回车自动补全 -7. Notification。敲 **NSNotification_** 自动联想,会展示各种常用的 NSNotification 的代码块,比如发送通知、添加观察者、移除观察者、观察者方法的实现等等,光标移动选中后敲回车自动补全 -8. Protocol。敲 **Protocol_** 自动联想,会展示各种常用的 Protocol 的代码块,光标移动选中后敲回车自动补全 -9. 内存修饰代码块 -10. 工程常用 TODO、FIXME、Mark。敲 **Mark_** 自动联想,会展示各种常用的 Mark 的代码块,光标移动选中后敲回车自动补全 -11. 内存修饰代码块。敲 **Memory_** 自动联想,会展示各种常用的内存修饰的代码块,光标移动选中后敲回车自动补全 -12. 一些常用的代码块。敲 **Thread_** 等自动联想,选中后敲回车自动补全。 -## 使用 + +## 六、使用 + +### 1. Xcode 中开发 + +- Property 属性。敲 **Property_** 自动联想,光标移动选中后敲回车自动补全 + +- Mark 标识。 敲 **Mark_** 自动联想,会展示各种常用的 Mark,光标移动选中后敲回车自动补全 + +- Method 方法。敲 **Method_** 自动联想,会展示各种常用的 Method,光标移动选中后敲回车自动补全 + +- GCD。敲 **GCD_** 自动联想,会展示各种常用的 GCD,光标移动选中后敲回车自动补全 + +- 常用 UI 控件的懒加载。敲 **_init** 自动联想,展示常用的 UI 控件的懒加载,光标移动选中后敲回车自动补全 + +- Delegate。敲 **Delegate_** 自动联想,会展示各种常用的 Delegate,光标移动选中后敲回车自动补全 + +- Notification。敲 **NSNotification_** 自动联想,会展示各种常用的 NSNotification 的代码块,比如发送通知、添加观察者、移除观察者、观察者方法的实现等等,光标移动选中后敲回车自动补全 + +- Protocol。敲 **Protocol_** 自动联想,会展示各种常用的 Protocol 的代码块,光标移动选中后敲回车自动补全 + +- 内存修饰代码块 + +- 工程常用 TODO、FIXME、Mark。敲 **Mark_** 自动联想,会展示各种常用的 Mark 的代码块,光标移动选中后敲回车自动补全 + +- 内存修饰代码块。敲 **Memory_** 自动联想,会展示各种常用的内存修饰的代码块,光标移动选中后敲回车自动补全 + +- 一些常用的代码块。敲 **Thread_** 等自动联想,选中后敲回车自动补全。 + + + +### 2. Code Snippet 同步 + +你可能是代码块的创建者,也可能是使用方,使用的时候直接先给脚本赋权 + +``` +chmod +x ./syncSnippets.sh // 为脚本设置可执行权限 +./syncSnippets.sh // 同步git云端代码块和文件模版到本地 +``` + +如果自己有新的代码块创建,觉得不错,想同步到远端 github repo,则可以使用下面的命令 ```shell -chmod +x ./syncSnippets.sh // 为脚本设置可执行权限 chmod +x ./uploadMySnippets.sh // 为脚本设置可执行权限 -./syncSnippets.sh // 同步git云端代码块和文件模版到本地 ./uploadMySnippets.sh //将本地的代码块和文件模版同步到云端 ``` + +![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2021-1008-CodeSnippetMethodGroup.png) + +![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2021-1008-CodeSnippetProperty.png) + +![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2021-1008-CodeSnippetLazyLoad.png) + ## PS **不断完善中。大家有好用或者不错的代码块或者文件模版希望参与到这个项目中来,为我们开发效率的提升添砖加瓦、贡献力量** diff --git a/Chapter1 - iOS/1.62.md b/Chapter1 - iOS/1.62.md index 27cd8a5..1e2ba37 100644 --- a/Chapter1 - iOS/1.62.md +++ b/Chapter1 - iOS/1.62.md @@ -529,6 +529,6 @@ oclintForProject ``` 同类型的文章: -- [如何打造团队的代码风格统一以及开发效率的提升](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.52.md) +- [开发效率提升利器](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.52.md) - [oclint介绍](https://github.com/hdw09/CIHexoBlog/blob/master/source/_posts/OClint学习笔记.md) - [自定义oclint规则](https://github.com/hdw09/CIHexoBlog/blob/master/source/_posts/OCLint-自定义规则101.md) \ No newline at end of file diff --git a/Chapter1 - iOS/chapter1.md b/Chapter1 - iOS/chapter1.md index 8438e69..aea5002 100644 --- a/Chapter1 - iOS/chapter1.md +++ b/Chapter1 - iOS/chapter1.md @@ -55,7 +55,7 @@ * [49、MVC、MVP、MVVM](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.49.md) * [50、“静态库”和“动态库”](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.50.md) * [51、cocoapods 相关小技巧](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.51.md) - * [52、如何打造团队的代码风格统一以及开发效率的提升](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.52.md) + * [52、开发效率提升利器](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.52.md) * [53、iOS 数据持久化](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.53.md) * [54、Xcode 设置作者信息](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.54.md) * [55、史上最强、最详细无痕埋点方案](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.55.md) diff --git a/SUMMARY.md b/SUMMARY.md index 64162d1..1a3f691 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -54,7 +54,7 @@ * [49、MVC、MVP、MVVM](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.49.md) * [50、“静态库”和“动态库”](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.50.md) * [51、cocoapods 相关小技巧](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.51.md) - * [52、如何打造团队的代码风格统一以及开发效率的提升](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.52.md) + * [52、开发效率提升利器](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.52.md) * [53、iOS 数据持久化](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.53.md) * [54、Xcode 设置作者信息](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.54.md) * [55、史上最强、最详细无痕埋点方案](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.55.md) diff --git a/assets/2021-1008-CodeSnippetLazyLoad.png b/assets/2021-1008-CodeSnippetLazyLoad.png new file mode 100644 index 0000000..669b81e Binary files /dev/null and b/assets/2021-1008-CodeSnippetLazyLoad.png differ diff --git a/assets/2021-1008-CodeSnippetMethodGroup.png b/assets/2021-1008-CodeSnippetMethodGroup.png new file mode 100644 index 0000000..73727ad Binary files /dev/null and b/assets/2021-1008-CodeSnippetMethodGroup.png differ diff --git a/assets/2021-1008-CodeSnippetProperty.png b/assets/2021-1008-CodeSnippetProperty.png new file mode 100644 index 0000000..0900a82 Binary files /dev/null and b/assets/2021-1008-CodeSnippetProperty.png differ