提升自己逼格的编程之美之代码规范

原文

头文件#import的顺序(商量)

写法模板

#import <系统库>

#import <第三方库>

#import “其他类”

尽量按照先系统类 第三方类 自己写的类顺序导入 中间不能有空格

建议的写法

? ?

不建议的写法

@Class的写法

写法模板:@class class1, class2;

建议的写法

? ?

不建议的写法

? ?

@Interface的写法

写法模板

@interface 类名 : 父类 <协议1, 2="">

@interface和类名中间一个空格

类名后紧跟:之后空格加上父类协议之间用,空格分割

建议的写法

不建议的写法

? ?

@protocol的写法

写法的模板

@protocol 协议的名称 <协议1, 2="">

@potocol和协议的名称有空格 协议的名称和其他协议有空格 其他协议之间有空格

建议的写法

? ?

不建议的写法

? ?

@property的写法

@property (关键词, 关键词) 类 *变量名称;

关键词用,空格分割 类前后空格

正确写法

? ?

不建议的写法

@property关键词的使用

对象?strong

基本变量assign

XIB控件 代理?weak

字符串和block使用?copy

对于一些弱引用对象使用weak

对于需要赋值内存对象?copy

h头文件方法写法

写法模板

@interface

方法的参数在一排显示

方法之间保留一行

第一个方法和@interface保留空行

最后一个方法和@end保留空行

建议的写法

? ?

错误写法

? ?

声明const的字符串

开头用k标识

推荐k+模板名字首字母大写+作用名称 防止和其他的重复

比如:CartViewModel类需要声明更新购物车列表的通知

kCVMNoticationUpdateCartList

如果是声明Cell的重用字符

k+cell的名称+identifier

比如: GBHomeItemTableViewCell的标识符

kGBHomeItemTableViewCellIdentifier

Const声明字符串位置

如果是需要声明在h里面让其他的类用到需要在h声明m实现

声明

? ?

实现

对于如果导入是UIKit类就使用UIKIT_EXTERN?如果是Founction使用关键词FOUNDATION_EXTERN

如果只在本类使用只用写实现 不用写声明。

方法尽量控制最多五十行

一个方法内部最多五十行 如果超过就精简代码 就分开方法写

方便之后进行热修复 代码重构

注释一定要写

自己管理的类一定注释属性用途 方法的用途 参数的说明

属性如果设置默认值 一定注明默认值是什么

如果方法内部存在逻辑判断 方法跳转 一定注释判断用法 方法跳转用法

除了初始化操作

其他声明变量 赋值 判断 应该注明注释用途

注释的写法

Class类注释

? ?

property属性的注释

? ?

方法的注释

如果有返回值 请加上return

? ?

局部变量和全局变量注释

? ??

Block注释

? ??

NSUM的注释

不允许外接修改的属性要设置readonly

大家平时设置属性默认是可读可写 但是这样容易对于别人造成误解 以为可以赋值

对于只能获取的属性 一定写readonly

正确的写法

? ??

错误的写法

? ?

头文件引入的其他类 要使用@class

头文件引入的类使用@class声明不实用#import引入

可以防止互相引入 编译失败 不容易查找的BUG

造成的缺点

m文件还要#import 其他类调用这个类属性也要#import对应的类

综合来说宁愿自己多操作 也要防止这种循环引入的BUG的出现

建议的写法

? ?

不建议写法

? ?

pragma mark的使用

对于属性的不同作用 比如设置颜色的 设置字体的 设置其他样式 的可以进行分组

对于方法的作用分类 比如添加功能 删除功能的

对于其他的代理方法 Get Set方法 Init初始化方法

建议的写法

? ?

BOOL类型属性的声明

属性set不要带is get要带is

建议写法

? ?

不建议写法

? ?

方法命名的规范

不能用init set 开头进行命名

如果不是写初始化方法不要用init进行开头

如果不是属性的set方法不要用set作为方法的前缀

{}的写法

建议的写法

? ?

不建议的写法

? ?

计算符号两边要有空格

比如 + - * / =等运算符左右有空格

建议的写法

? ?

不建议的写法

? ?

控件命名的规范

对于命名一定不要简写 那篇很长的单词 但是一些单词就是简写的除外 比如WTO RMB

UILabel结尾加上Label;

UIImageView结尾记上ImageView

等等让其他的编程人员看名字就知道变量的用法 和属于什么控件

建议的写法

? ??

不建议的写法

? ?

if判断里面的条件要提取出来

对于if里面很多的判断条件 要提取出来 方便之后进行断点测试

建议的写法

? ?

不建议的写法

? ?

enum的定义

对于归属所在的enum 要写在对应的类

我们现在就全部enum放在一个文件 觉得和苹果的编码规范违背 并且分离代码有点麻烦

使用NS_ENUM进行定义

建议的写法

? ?

不建议的写法

? ?

对于初始化一定要使用类对应的初始化方法

比如UIView的对应初始化方法为

? ?

UIViewController对应的为

? ?

防止初始化用init new等没经过系统进行设置一些默认的属性 造成bug

对于声明NSString const要对适应对应的模块

比如系统的 NSNotificationName

? ?

建议的写法

? ?

不建议的写法

? ?

对于#define宏命名

单词全部的大写 单词之间用_分割

建议的写法

? ?

不建议的写法

? ?

对象调用方法要留空格

建议的写法

? ?

不建议的写法

? ?

对于只在m内部声明的const 需要添加static

这个我觉得可以不加 但是无法看到苹果的实现 所以不知道苹果的规范怎么写的

建议写法

? ??

不建议的写法

? ?

对于局部的变量尽量的初始化

局部的变量要初始化 属性有默认的值 所以我们不必须对于属性进行初始化

我之前遇到的一个BUG就是int类型没有初始化给我默认Nan造成崩溃

建议的写法

不建议的写法

? ?

对于一些对象判断是否赋值可以不进行初始化 但是对于一定不会为nil要进行初始化

变量名的规范

一定要使用驼峰的命名

建议的写法

? ?

不建议的写法

对于属性的赋值

不要直接调用set方法

建议的写法

不建议的写法

? ?

对于NS_OPTIONS类型多个值用|连接不能用+

建议的写法

不建议的写法

? ?

block的命名规范

之前研究过很多的第三方的命名 对于苹果官方的没找到

有CallBack结尾 Complete结尾 Block结尾 还有CompletionHandle结尾的

我看到苹果很多的结尾都是用CompletionHandle结尾

大部分命名是Block我们按照Block命名

建议的写法

错误写法

? ?

使用NSUserDefaults要先创建

因为我们用到NSUserDefaults无非是保存和读取 事先的创建一个对象 可以精简代码

当执行方法很多 用变量替换

建议的写法

? ?

不建议的写法

? ?

尽量少在initialize load方法做一些初始化的事情

影响程序的启动

建议的做法

? ?

不建议的做法

? ?

通知的移除

通知在dealloc要使用移除对象监听的方法

建议的写法

? ?

不建议的写法

? ?

判断不要放在一行

判断放在一行也是可以的 但是我们还是要求正规一些 毕竟注明Apple的goto BUG

建议的写法

? ?

不建议的写法

对于我们取值和存值的key要定义一下

定义一下key 方便我们使用 并且方便之后改名字

建议的写法

? ?

不建议的写法

方法的参数连接不能有空格

建议的写法

? ?

不建议的写法

? ?

对于block的循环引用使用weakify 和strongify

建议的写法

? ?

不建议的写法

? ?

布局和设置约束的方法选择

可以实现GBInitViewProtocol协议 执行对应的方法

建议的写法

有利于其他人很方便查找当前界面布局和添加试图的位置

属性要尽量使用懒加载

我们一个界面有很多控件 利用懒加载可以美化代码

所有的懒加载放在Getter的mark的下面

建议的写法

? ?

推荐的界面框架

所有界面的控件元素独立到另外的UIView

UIViewController只负责跳转界面

新建UIView负责界面的显示

VIewModel负责数据的请求和解析

APi负责请求

model负责后台数据解析

other 负责样式和其他处理

多使用字面量

字符串 @””

? ?

NSNumber @()

? ?

字典 @{}

? ?

数组 @[]

? ?

字典和数组的取值和存值

多用类型常量 少用#define

建议的写法

? ?

不建议的写法

? ?

对于一些状态 选项的使用枚举

尽量少用根据数字判断状态少用字符串 数字判断状态

建议的写法

? ?

不建议的写法

? ?

多使用类族

比如我们需要创建一个类 有多个样式

? ?

ZHCustomRedView

? ?

ZHCustomWhiteView

类名加上前缀避免冲突

因为团队的合作 可能会出现大家想到一样的名字或者添加第三方库引入和第三方库名字一样

尽量加上前缀。

如果只针对工程就使用工程的缩写

比如自己个人的第三方库就加上自己名字或者昵称的缩写

建议的写法

? ?

不建议的写法

? ?

提供全能的初始化方法

对于初始化参数有很多 但是不是一定全部使用的可以提供多个初始化方法

建议的写法

? ?

不建议的写法

? ?

实现Description方便调试

这个不推荐自己手写 可以使用Xcode插件自动生成 属性越多会加重手写代码的长度

尽可能使用不可变的对象

对于OC存在很多可变的对象 比如NSMutableString NSMutableArray NSMutableDictionary等等

对于一些不允许改变的直接使用不可变对象

可以节省对象开支 还可以防止别人修改数据造成bug

建议的写法

? ?

不建议的写法

? ?

如果建议的使用Block和代理

我觉得代理可以用在写控件需要数据源赋值 和一些事件回调的时候使用

我查阅了苹果的block基本上都是执行一个时间 需要异步回调就使用block

如果没有主动执行动作 而是监听异步的回调 建议用代理

建议的写法

? ?

不建议的写法

? ?

记得Dealloc记得释放

记得在Dealloc释放注册的通知和KVO的监听

不释放容易造成内存释放崩溃

养成习惯把按照方法功能到分类里面

对于一些有按照功能类型的方法划分在一个分类里面 分类和之前类写在同一个文件

建议的写法

? ?

不建议的写法

? ?

为第三方类添加分类添加前缀

比如为系统UIView添加分类Add的添加前缀

建议的写法

? ?

不建议的写法

? ?

尽量少在分类里面使用属性

假设我们分类有一个只读的字段 我们可以不使用属性 可以使用方法

建议的写法

? ?

不建议的写法

? ?

非要在自己类的分类添加读写的属性 可以用语法糖

可以利用主类的私有变量

建议的写法

不建议的写法

? ?

对于给第三方和系统的类非要添加属性 可以使用runtime。

对于一些自己不确定的可以使用try catch

对于不知道后台返回什么类型的 可以使用try catch

建议的写法

? ?

因为OC是运行时语法 可能array不一定是NSArray类型的

不建议的写法

? ?

如果后台返回list为字段 这段代码就崩溃了 可以使用try catch也可以用Model库 或者自己添加判断

使用dispatch_once来创建单例

建议的写法

? ?

不建议的写法

? ?

便利的写法

如果只需要便利数组和字典的写法用for in

建议的写法

? ?

不建议的写法

? ?

需要便利字典和数组的内容 并且需要索引用enumerator

建议的写法

? ?

不建议的写法

如果想进行缓存使用NSCache不要使用NSDictionary进行缓存

建议的写法

? ?

不建议的写法

? ?

尤达表达式

推荐:

? ?

不推荐:

? ?

nil 和 BOOL 检查

推荐

? ?

不建议的写法

? ?

黄金大道

建议的写法

? ?

不建议的写法

? ?

复杂的表达式

建议的写法

? ?

不建议的写法

? ?

三元运算符

推荐:

不推荐:

? ?

当三元运算符的第二个参数(if 分支)返回和条件语句中已经检查的对象一样的对象的时候,下面的表达方式更灵巧:

推荐:

? ?

不推荐:

? ?

错误处理

有些方法通通过参数返回 error 的引用,使用这样的方法时应当检查方法的返回值,而非 error 的引用。

推荐:

? ?

此外,一些苹果的 API 在成功的情况下会对 error 参数(如果它非 NULL)写入垃圾值(garbage values),所以如果检查 error 的值可能导致错误 (甚至崩溃)。

数组和字典最好指定元素的类型

建议的写法

? ?

不建议的写法

? ?

数组和字典的元素垂直写

建议的写法

? ?

不建议写法

时间: 2024-08-25 20:30:25

提升自己逼格的编程之美之代码规范的相关文章

标C编程笔记day08~day10代码规范、编译、库函数、命名空间、函数调用、哑元函数

代码编写规范,命令行编译,库函数简介,命名空间介绍,函数调用介绍,哑元函数介绍 一般来说,有.c实现文件,应该都要有.h头文件,.c文件中的所有函数都应该在.h文件中声明. 命令行编译方法: 1.gcc 后面带所有.c 文件 -o 输出文件名   直接生成可执行文件 2.依次gcc -c .c文件  -o ***.o  生成***.o文件 然后 gcc 所有.o文件 -o 输出文件   生成可执行文件 程序中的静态全局变量不可以被其他文件中的语句使用. .c文件使用.h文件中的全局变量:exte

求二进制数中1的个数(编程之美)

求二进制数中1的个数 继京东618店庆时买的<编程之美>这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下. 书中的题目如下 对于一个字节(8bit)的无符号数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能高. 就像书中给我们说的一样,我们一般人可能想到的解决方法如下 int countOne(int n){ int count=0; while(n){ if(n%2==1){ cou

编程之美之实时排名算法

首先来看一个实时排名算法 参考文献 某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新.现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名.用户最大规模为2亿:积分为非负整数,且小于100万. 存储结构 首先,我们用一张用户积分表user_score来保存用户的积分信息. 表结构: 示例数据: 下面的算法会基于这个基本的表结构来进行. 算法1:简单SQL查询 首先,我们很容易想到用一条简单的SQL语句查询出积分大于该用户积分的用户数量: select 1 + count(t

编程之美-分层遍历二叉树

问题:给定一个二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号.那么分层遍历如图的二叉树,正确的输出应该为: <span style="font-size:14px;">1 2 3 4 5 6 7 8</span> 书中还给出了问题2:打印二叉树中的某层次的节点(从左到右),其中根结点为第0层,成功返回true,失败返回false 分析与解法 关于二叉树的问题,由于其本身固有的

读书问题之《编程之美》 -----12061161 赵梓皓

我阅读的书是<编程之美> 刚开始的时候阅读序,就觉得控制cpu利用率这个问题很好玩,所以重点看了这部分和解决办法,问题也都大部分是这部分的.那么问题就来了(挖掘机技术xxx?中国山东找蓝翔) 咳咳,问题在下面: 1.关于问题的提出.(也是一点点建议) 本书的主要内容是告诉读者如何思考问题和解决问题.但是提出问题也是很重要的,正如爱因斯坦所说“提出一个问题往往比解决一个问题更重要”,很多面试题(比如井盖为啥是圆的)我觉得正常人很少会想到.所以,这个问题是怎么想出来的...我很好奇.也希望作者能够

《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明

先看看原题:<编程之美>3.6编程判断两个链表是否相交,原题假设两个链表不带环. 为了防止剧透使得没看过原题目的读者丧失思考的乐趣,我把最好的解法隐藏起来.由于这个问题本身的解答并不是本文的重点,扩展问题也采用这种形式呈现. 注:位于(*)符号之间的文字出自于:http://blog.csdn.net/v_july_v/article/details/6447013,作者v_JULY_v. 用指针p1.p2分别指向两个链表头,不断后移:最后到达各自表尾时,若p1==p2,那么两个链表必相交 用

编程之美之买票找零

题目:假设有2N个人在排队买票,其中有N个人手持50元的钞票,另外有N个人手持100元的钞票,假设开始售票时,售票处没有零钱,问这2N个人有多少种排队方式,不至使售票处出现找不开钱的局面? 分析:队伍的序号标为0,1,...,2n-1,并把50元看作左括号,100元看作右括号,合法序列即括号能完成配对的序列.对于一个合法的序列,第0个一定是左括号,它必然与某个右括号配对,记其位置为k.那么从1到k-1.k+1到2n-1也分别是两个合法序列.那么,k必然是奇数(1到k-1一共有偶数个),设k=2i

【编程之美】java实现重建二叉树

package com.cn.binarytree.utils; /** * @author 刘利娟 [email protected] * @version 创建时间:2014年7月20日 下午2:03:30 类说明: */ class Node { Node left; Node right; char chValue; Node(char chValue) { left = null; right = null; this.chValue = chValue; } } public cla

编程之美之字符串移位包含问题

[题目] 给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含.例如,S1=AABCD和s2=CDAA,返回true:给定s1=ABCD和s2=ACBD,返回false. [分析] [思路一] 从题目中可以看出,我们可以使用最直接的方法对S1进行循环移动,再进行字符串包含的判断,从而遍历其所有的可能性. 字符串循环移动,时间复杂度为O(n),字符串包含判断,采用普通的方法,时间复杂度为O(n*m),总体复杂度为O(n*n*m). 字符串包含判断,若采