1.指导原则
【原则 1】首先是为人编写程序,其次才是计算机。
说明:这是软件开发的基本要点,软件的生命周期贯穿产品的开发、测试、生产、用户使用、 版本升级和后期维护等长期过程,只有易读、易维护的软件代码才具有生命力。
【原则 2】保持代码的简明清晰,避免过分的编程技巧。
说明:简单是最美。保持代码的简单化是软件工程化的基本要求。不要过分追求技巧,否则 会降低程序的可读性。
【原则 3】编程时首先达到正确性,其次考虑效率。
说明:编程首先考虑的是满足正确性、健壮性、可维护性、可移植性等质量因素,最后才考 虑程序的效率和资源占用。
【原则 4】编写代码时要考虑到代码的可测试性。
说明:不可以测试的代码是无法保障质量的,开发人员要牢记这一点来设计、编码。实现设计功能的同时,要提供可以测试、验证的方法。
【原则 6】鼓励多加注释。
类的属性和方法要添注释。统一为快捷键cmd+option+/ ;
其他注释可使用双斜杠 // 添加。
2.编码风格
统一的编程风格,有助于 高整个项目的开发质量。同时,对于普通程序员来说,养成良好的编程习惯有助于 高 自己的编程水平, 高编程效率。因此,统一的、良好编程风格不仅仅是个人主观美学上的或是形式上的问题,而且会涉及到产品质量,涉及到个人编程能力的 高,必 须引起大家重视。
除了这里总结的编码风格外,原则上编码风格应与苹果官方库保持一致。
2.1 基本格式
【规则 1】if、else、else if、for、while、do等语句执行语句不得紧跟其后。 不论执行语句有多少都要加 { }。
说明:这样可以防止书写失误,也易于阅读。
正例:
if (varible1 < varible2) {
varible1 = varible2;
}
反例:下面的代码执行语句紧跟 if的条件之后,而且没有加{},违反规则。
if (varible1 < varible2) varible1 = varible2;
【规则 2】条件语句的常量需写在双等号==的前面
说明:这样写可防止双等号误写为单等号 =的情况。
正例:
if ( 3 == a) {
//执行语句
}
反例:
if ( a == 3 ) {
//执行语句
}
【规则 3】定义指针类型的变量,*应放在变量前。
正例:
float *pfBuffer;
反例:
float* pfBuffer;
【规则4】源程序中关系较为紧密的代码应尽可能相邻。
说明:这样便于程序阅读和查找。
正例:
iLength = 10;
iWidth = 5;//矩形的长与宽关系较密切,放在一起。
strCaption = “Test”;
反例:
iLength = 10;
strCaption = “Test”;
iWidth = 5;
【规则 5】相关的赋值语句等号对齐。例子如【规则4】正例。
2.2 空行空格
【规则 1】函数(方法)块之间使用两个空行分隔。
【规则 2】多元运算符和它们的操作数之间至少需要一个空格。
正例:
iWidth = 5;
iWidth += 5;
反例:
iWidth=5;
iWidth+=5;
【规则 3】关键字之后要留空格。
说明:if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
【规则 4】方法名与形参不能留空格,返回类型与方法标识符有一个空格。
正例:
- (UIColor *)initWithWhite:(CGFloat)white alpha:(CGFloat)alpha;
反例:
- (UIColor *)initWithWhite : ( CGFloat ) white alpha : ( CGFloat ) alpha;
【规则 5】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。‘,’之后要留空 格。‘;’不是行结束符号时其后要留空格。
正例:
for (i = 0; i < MAX_BSC_NUM; i++)
{
DoSomething(iWidth, iHeight);
}
【规则 6】注释符与注释内容之间要用一个空格进行分隔。
正例:
/** 图片视图 */
反例:
/**图片视图*/
2.3 断行
长表达式(超过 80 列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐。
说明: 条件表达式的续行在第一个条件处对齐。
for循环语句的续行在初始化条件语句处对齐。
函数调用和函数声明的续行在第一个参数处对齐。
赋值语句的续行应在赋值号处对齐。
正例:
if ((iFormat == CH_A_Format_M)
&& (iOfficeType == CH_BSC_M)) //条件表达式的续行在第一个条件处对齐
{
doSomething();
}
for (long_initialization_statement;
long_condiction_statement;
long_update_statement)
{
doSomething();
}
//函数声明的续行在第一个参数处对齐
BYTE ReportStatusCheckPara(HWND hWnd,
BYTE ucCallNo,
BYTE ucStatusReportNo);
//赋值语句的续行应在赋值号处对齐
fTotalBill = fTotalBill +faCustomerPurchases[iID]
+ fSalesTax(faCustomerPurchases[iID]);
2.4 命名规则
【规则 1】变量、类名、文件夹名字统一使用驼峰命名法命名,类名和文件夹名字首字母需大写。
【规则 2】宏统一大写命名,中间可以添加下划线。
正例:
#define BUTTON_WIDTH (int)320
反例:
#define kButtonWidth (int)320
2.5 其他
【规则 1】在表达式中使用括号,使表达式的运算顺序更清晰。
说明:由于将运算符的优先级与结合律熟记是比较困难的,为了防止产生歧义并 高可读性, 即使不加括号时运算顺序不会改变,也应当用括号确定表达式的操作顺序。
正例:
if (((iYear % 4 == 0) && (iYear % 100 != 0)) || (iYear % 400 == 0))
反例:
if(iYear %4==0&&iYear %100!=0||iYear %400==0)
【规则 2】避免表达式中的附加功能,不要编写太复杂的复合表达式。
说明:带附加功能的表达式难于阅读和维护,它们常常导致错误。对于一个好的编译器,下 面两种情况效果是一样的。
正例 :
aiVar[1] = aiVar[2] + aiVar[3];
aiVar[4]++;
iResult = aiVar[1] + aiVar[4];
aiVar[3]++;
反例:
iResult = (aiVar[1] = aiVar[2] + aiVar[3]++) + ++aiVar[4] ;
【规则 3】如果for循环的条件语句,变量比较的值如果需要计算应在循环之前计算好。
正例:
NSInteger count = Self.peopleArray.count;
for (NSInteger i == 0; i < count; i++) {
//执行语句
}
反例:
for (NSInteger i == 0; i < Self.peopleArray.count; i++) {
//执行语句
}
【规则 4】应避免直接使用数字对业务类型进行判断,可用枚举类型替代。
正例:
if (role == Admin) {
//执行语句
}
反例:
if(role == 1) {
//执行语句
}
【规则 5】视图控制器代码的分块规范
#program mark -- VC生命周期
viewdidload
viewdisappear
#program mark -- 系统代理
//代理方法
#program mark -- 自定义代理
//代理方法
#program mark -- 事件方法
//事件方法
#pragram mark -- 推送方法
//推送方法
#program mark -- 自定义方法
//自定义方法
#program mark -- getter setter方法
//getter setter方法