代码规范问题

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

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

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

oc代码:

一、 命名

1.1 常量:

  可以写的比较随意,但是最好也用相应意思的英文来写,否则会很难读懂。

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.1 每个类应该在头文件中写上注释,如:

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

//类的中文名称

//类的作用

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

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

 

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

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

//函数的中文名称

//函数的详细说明

//重要参数说明

//返回值说明

//测试代码(如果需要则注释上,方便日后单元测试)

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

 

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

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

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

//修改原因:XXXXXXX

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

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

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

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

 

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

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

  如:此变量作用是什么

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

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

三、方法:

3.1 避免函数的参数过多,一般最多为5个

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

3.2 如果函数有多个返回状态,尝试用enum作为返回类型

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

3.4 空行的使用:

  在操作符前后加空格

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

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

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

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

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

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

3.6 不可将布尔变量和逻辑表达式直接与YES、NO或者1、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.1 提高类内的聚合度 

4.2 降低类间的耦合度 

4.3 限制继承的层数,一般最大为5 

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

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

 

 

swift代码:

从oc转swift  会有很多的需要注意的地方,如下

 

一、命名

  参考上面oc的 命名。

二、注释

  参考上面oc的 命名。

  swift中不用  #pragma mark

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

// MARK: - private

// MARK: - click

// MARK: - loadData

三、函数

  在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] = [:]


 四、类

  参考上面oc的 命名。

posted on 2016-02-25 23:14  &#127774;Bob  阅读(442)  评论(0编辑  收藏  举报

导航