代码规范问题

关于代码规范,大同小异。javascript

今天就对代码规范来个简单的概述,意见不一样的,欢迎讨论:css

说明:编码遵循简单,直观,清晰的原则,才能易读、易维护。最重要的是养成常常作注释的良好习惯。java

oc代码:编程

1、 命名swift

1.1 常量:bash

  能够写的比较随意,可是最好也用相应意思的英文来写,不然会很难读懂。svn

1.2 变量:函数

  遵循驼峰命名法工具

   UI控件,咱们就要以“功能”+“类型”来命名,言简意赅,一眼就能看出来他的功能 。 如“待办”的表格用 toDoTableView。 单元测试

  若是是约束,以Const尾缀,最好写A的属性 To B的属性命名,若是是宽度,能够很简单,如C的宽度 = CWidthConst

  若是是定义成员变量,记得前面加个下划线(这里注意成员变量和类的属性的区别)

1.3 属性

  修饰属性的关键字:

    block,NSString用copy

    基本数据类型用assign

    UI控件若是不是懒加载用weak,若是是懒加载用strong

    对象(包括CALayer)属性用strong

    readOnly(只读不能修改,其实用KVC都是能够赋值的)

1.4 方法名:

  遵循驼峰命名法

  避免方法的参数过多,通常最多为5个

  若是方法有多个返回状态,尝试用enum做为返回类型

  方法名不要用缩写,尽可能表达方法操做的意思

1.5 通知:

  使用“项目前缀”+“发出通知的类”+“did/will”+“动做”+“Notification”

  如:

    UIKIT_EXTERN NSString *const UIWindowDidResignKeyNotification; // nil

    NSString *const SHUserDidLoginNotification = @"SHUserDidLoginNotification";//自定义的通知

1.6 代理:

  “项目前缀”+"类名"+“Delegate”

1.7 类:

  以项目的前缀开头

  以类的做用+所属于的类型来命名

    如:SHToDoCell, SHToDoController等

1.8 关于宏所有用大写,多个单词用下划线分隔或者用小写“k”开头后面遵循驼峰命名法进行定义。 

1.9 名字清楚简单,让人一目了然,尽可能用英文命名名字有意义,名字最好尽量精确表达其内容,不能够用拼音代替

1.10 尽可能选择通用词汇 

1.11 避免用缩写,若是名字太长才在不引发歧义的前提下用缩写,当命名里出现缩写词时,缩写词所有大写

1.12 避免局部名和外层的名字冲突,避免方法里面的单词和参数名字相同

  如  不能够写   -(void)showView:(UIView *)view name:(NSString*)name

    能够写-(void)showView:(UIView *)view viewName:(NSString*)name

1.13 文件名:

  “项目前缀”+"行为/属性"+"类型"命名,如:SHHomeViewController  ZFoundTableViewCell

  对于一个汉语有多个英文的名字要统一规定好,如交易就是transaction,说了就不要再用deal

1.14 关于英语词性的选择(优秀的产品都应如此):

  类和对象名应是名词 

  实现行为的类成员函数名应是动词 

 

 

2、注释:

2.1 每一个类应该在头文件中写上注释,如:

/*****************************************/

//类的中文名称

//类的做用

//这个类在什么状况下将被调用

/*****************************************/

 

2.2 每一个类的每一个函数前面应该都应该有注释,如:

/*****************************************/

//函数的中文名称

//函数的详细说明

//重要参数说明

//返回值说明

//测试代码(若是须要则注释上,方便往后单元测试)

/*****************************************/

 

2.3 每次作了修改,应该按照以下格式做出说明(通常这个用得很少,由于有svn等代码管理工具,能够很轻易的看到哪里改了,还能够很容易的回滚。可是不得不说若是一个工程这么写的话,即便将工程单独拿出来,不依靠svn 也能够很容易的被开发者读懂,可维护性更强)

/*****************************************/

//类型:修改;修改人:某某某;日期:2012.1.1

//修改缘由:XXXXXXX

/**************/

//原代码不要删除,方便改错后恢复

/**************/

/*****************************************/

 

2.4 方法中重要的逻辑和语句要做注释

2.5 类的变量,宏,常量,枚举等应该有所说明

  如:此变量做用是什么

2.6 程序中要注意用#pragma mark 来对程序进行分块以及注释

2.7 添加有必要的注释,尽量使用Xcode注释快捷键(⌘⌥/)

3、方法:

3.1 避免函数的参数过多,通常最多为5个

  若是是参数大于等于3个的方法,要去折行

3.2 若是函数有多个返回状态,尝试用enum做为返回类型

3.3 规模不能太大,尽可能控制在200行代码以内,重复使用的代码抽象成函数

3.4 空行的使用:

  在操做符先后加空格

  文件中的主要部分用空行分开 

  方法之间要用两个空行分开 

  用空行将代码按逻辑片段划分 

  理论上每一行不超过一屏幕

  不要在一行中放多于一条语句 

3.5 语句switch中的case按字母顺序排列 

3.6 不可将布尔变量和逻辑表达式直接与YES、NO或者一、0进行比较。

  如: 设bFlag 是布尔类型的变量 能够写

  if (bFlag)    // 表示flag为真 

  if (!bFlag)   // 表示flag为假 

  不要写:

   if (bFlag == TRUE)  

  if (bFlag == 1)    

  if (bFlag == FALSE)    

  if (bFlag == 0)    

3.7 不可将浮点变量用“==”或“!=”与任何数字比较。

说明:不管是float仍是double类型的变量,都有精度限制。因此必定要避免将浮点变量用“==”或“!=”与数字比较,应该转化成“>=”或“<=”形式。

如:能够写 

if ((fResult >= -EPSINON) && (fResult <= EPSINON)) 

不能够写: if (fResult == 0.0)   

其中EPSINON是容许的偏差(即精度)

3.8 优先考虑用代码代替xib,代码直观,且实现容易移植。xib和storyboard更耗费内存。可是swift中例外,由于苹果在swift中主推storyboard编程

 

4、类:

4.1 提升类内的聚合度 

4.2 下降类间的耦合度 

4.3 限制继承的层数,通常最大为5 

4.4 尽可能不要将基类(父类)强制转换成派生类(子类)

4.5 对于功能类似的两个类注意抽取出父类

 

 

swift代码:

从oc转swift  会有不少的须要注意的地方,以下

 

1、命名

  参考上面oc的 命名。

2、注释

  参考上面oc的 命名。

  swift中不用  #pragma mark

  而是使用 // MARK: -,按功能、协议、代理等分组

// MARK: - private // MARK: - click // MARK: - loadData

3、函数

  在swift中 你们大多都叫函数了,不叫方法了

  参考上面oc的 命名。

  须要注意的是swift中:

  判断语句不用加括号

   如:

  if typeValue == 1 {
  }

  在访问枚举类型时,使用更简洁的点语法

  let color = UIColor.red

  当对外接口不兼容时,使用@available(iOS x.0, *) 标明接口适配的起始系统版本号

  @available(iOS 8.0, *)   func myFunction() {   }
  没条语句后面不要加分号

   bool类型命名时,使用is做为前缀  var isMine: Bool = false

 

  当函数的第一个参数构成整个语句的介词时(如,at, by, for, in, to, with 等),为第一个参数添加介词参数标签

  func login(with username: String?, password: String?){ 

  }

 

  可选类型拆包取值时,使用if let 判断

  if let data = result.data {
  }
 

   多个可选类型拆包取值时,将多个if let 判断合并

  if let name = person.name, let age = person.age {
  }

   避免使用 as! 或 try!  而是使用if let as?判断

  if let name = person.name as? String {
  }
 

   组和字典变量定义时须要标明泛型类型,并使用更简洁清晰的语法

    var names: [String] = []

    var values: [String: Int] = [:]

    var person: [String: Any] = [:]

 

 4、类

  参考上面oc的 命名。

相关文章
相关标签/搜索