编码规范

一、工程结构

1、Android Studio工程结构:
    Project
    |--  module
            |--  src
                    |--  main
                            |--  java
                                    |--  module
                                            |--  activity
                                            |--  view
                                            |--  model
                            |--  res
                            AndroidManifest.xml
                    |--  projectTest
                    |--  test
            |--  libs
            |--  build
            build.gradle
            proguard-rules.pro                
    build.gradle
    gradle.properties
    local.properties
    settings.gradle
    LICENSE.txt
    README.txt

2、Xcode 工程结构
    Project
    |--  project
            |--  module
                    |--  controller
                    |--  view
                    |--  model
                            |--  bean
                            |--  delegate
                            |--  datasource
                    Contant
                    other files
     |--  Pods
     project.workspace
     project.xcodeproj
     LICENSE.txt
     README.txt

二、命名规范

 1、项目命名 
      以Company_项目名称缩写_平台名称命名,例如:XXX_MDW_iOS
 2、文件命名
      全部以大写字母开头,保持下划线与
      ViewController 以"模块名称+ViewController"命名,例如:MainViewController
      View以"模块名称+View类型"命名,例如:MainSeacherButton、MainCleanView
      Delegate以"模块名称+功能描述+Delegate"命名,例如:MainImageListDelegate
 3、包命名
      均为小写字母,用作描述模块
 4、变量命名
      开头首字母小写,遵守驼峰式命名法
      控件命名以“功能描述+View类型”命名,例如:submitButton
      禁止使用中立词、表意不清词定义变量,例如:button1、button
 5、方法命名
      开头首字母小写,遵守驼峰式命名法,例如:initUserData()
      参数命名规则同变量命名规则
 6、接口命名
      开头首字母大写,以“接口描述+Interface”命名,例如:MainInterface
      接口方法命名应准确标识此方法的调用时机,例如:viewDidLoad()、viewWillDidLoad()
 7、block命名
      开头首字母大写,以“block描述+Block”命名,例如:MainBlock
 8、协议命名
      开头首字母大写,以"协议描述+Protocal"命名,例如:MainProtocal
 9、存取方法命名
      方法名应由以下规则组成
      存方法:
          setUser(User user);
      取方法:
          List getUser();
10、缓存方法命名
      开发中经常需要本地缓存数据,在此类关于缓存方法的增删改查数据的方法命名上,应遵循以下原则:
      取方法:
          List getUser();
      增方法:
          addUser(User user)
      删方法:
          removeUser(int index)
      改方法:
          updateUser(int index,User user)
11、常量命名
      对于常量应遵循能使用就使用枚举的原则,在合适的头文件中定义枚举类型,方便本类与其他类调用时查看。

三、作用域

 1、静态方法
      Java以static关键字修饰,Objective-C使用+字符声明
      静态方法中不可调用非静态方法及变量,为保证静态方法内部线程安全;
      但可通过传参给静态方法,静态方法的形参在方法内部是线程安全的
      应在接口文件中暴露,使外部对其可见,在程序任何地方可以通过类名直接访问静态方法
 2、静态变量
      Java以static关键字修饰,Objective-C使用+字符声明
      静态变量因为与函数调用无关,一旦生成生命周期会持续到程序结束,所以在多线程状态下,是线程不安全的
      应在接口文件中暴露,使外部对其可见,在程序任何地方可以通过类名直接访问静态方法
      因可能产生线程安全问题,所以在处理多线程状态下的静态变量使用时,应注意可能需要使用一些同步手段,锁定静态变量,应尽量减少使用
 3、全局变量
      Java以public关键字修饰,Objective-C一般声明为一个配置类的属性 
      指的是在程序运行时,需在不同位置频繁访问、随时更改的变量
      全局变量因与函数调用有关,当没有对其产生引用时,此全局变量将可能被自动或手动回收,在调用其值的时候应注意,否则可能产生空指针问题 
 4、局部变量 
      局部变量应以最小作用域为限制,使之在使用完后立刻可以达到回收要求,否则将产生不确定问题
 5、私有方法
      私有方法不应在接口文件中暴露,使外部对其理论上不可见,其在当前类文件中才可被访问
 6、公有方法
      公有方法应在接口文件中暴露,是外部对其可见的,在程序任何地方可以通过类的实例化对象访问其公有方法
 7、保护方法
      保护方法应在接口文件中暴露,对外部部分类可见,包括子孙类、同包下类使用,用的不多,应尽量减少使用
 8、私有变量
      私有变量与局部变量一致,应控制在本类运行或本函数运行完后即可被手动或自动释放
 9、公有变量(属性)
      属性应在接口文件中暴露,任何外部类对其是可见的,应在主动暴露给其他类使用时声明,一般作为传递数据的接口
 10、保护变量 
      保护变量应在接口文件中暴露,部分外部类对其是可见的,包括子孙类、同包下类使用,用的不多,应尽量减少使用

四、换行

 1、方法括号换行
 2、for循环换行
 3、while循环换行
 4、switch换行
 5、if else换行
 6、block换行
 以上括号换行均应在首行末尾起{,在末行再换一行开头起}

五、注释

 1、类注释
      /** **************************************************************************************
        *  Copyright (c) [年份] [公司] All rights reserved.
        *  file name:[文件名称]
        *  author:[作者姓名]
        *  email:[作者公司邮箱地址]
        *  date:[年月日]
        *  description:[类功能描述]
        */  **************************************************************************************

 2、方法注释
      /**  **************************************************************************************
        *  method name:[方法名称]
        *  throw [Exception名称] [抛出异常条件描述]
        *  param [paramname] [参数1中文释意]
        *  param [paramname] [参数2中文释意]
        *  return [paramname] [返回值中文释意]
        *  author:[作者姓名]
        *  email:[作者公司邮箱地址]
        *  date:[年月日]
        */  **************************************************************************************

 3、变量注释
      /** 
        *  Parma Name:[变量名称][变量中文释意]
        */

 4、单行注释
       /** 注释内容 */

 5、多行注释
      /**
        *
        *
        */

六、其他

 1、缩进
      推荐使用4个空格,禁止使用Tab,需在Xcode配置中将Tab键设置为输入4个空格

 2、不使用全局通知
      尽量不要使用全局通知,若必须使用需单独抽取通知识别符到统一配置文件中,此文件命名应为NotifitionIdtifiers

 3、黄金路径
      a)禁止书写例如:
           bool isTrue;
           if(isTrue){
                return true;
           }else{
                return false;
           }
           应写为
           return isTrue;

      b)在条件判断时应使用例如:
           if(![someOther boolValue]){
                return;
           }
           避免书写例如:
           if([someOther boolValue]){
                //TODO
           }else{
                //TODO

           }

      c)在条件判断时注意区分判断条件关联性。
           在以下几种判断方式中做合理选择
           if(条件一){
                //TODO
           }else if(条件二){
                //TODO

           }else{
               //TODO
           }

           if(条件一){
                //TODO

           }
           if(条件二){
               //TODO
           }

           if(条件一||条件二){
                //TODO

           }

           if(条件一&&条件二){
                //TODO

           }

      d)尽量不使用多层if嵌套判断,并在多条件判断时应优先使用短路算法,提高计算效率。

 4、英文拼写
      推荐使用苹果推崇的全单词拼写命名,按苹果的说法“好的方法名应当可以以一个句子的形式朗读出来”。减少缩写,方便识别。

 5、mark — 文档标记
      iOS开发需在代码中增加 #param — mark 功能归类描述
      以提高代码浏览效率。

 6、switch break
      在使用switch做条件判断时,需要写default分支,以免此处出现逻辑漏洞,导致后续处理异常。

 7、单行字符限制
      为保证正常代码浏览,一行代码不应超过120个字符。
      
 8、Exception 
      低层代码抛出的异常务必在高层捕获并处理。
      且尽量精准地抛出或捕获异常,不应直接处理所有异常的父类Exception。
      
 9、Library
      在使用任何Framework时,必须在第三方库与业务代码中增加封装层,保证不出现因第三方库变化导致频繁更改大量业务代码的问题。
      在开发任何Framework时,应将所有需引用的头文件写到一个跟Framework同名的头文件中,用作其他工程直接引用,而不应该让其他工程分别引用所需的其他头文件

10、硬编码
      关于项目中出现的既定字符串应抽取到共同文件中,而不应硬编码在业务代码中,可能造成后期版本迭代时,修改上出现很多漏改等问题。
      禁止书写魔法数字,应按常量定义数字代表的判断条件。

七、小技巧

1、if else 单条件判断成功会直接跳出,不运行其他else判断
    例:
          int a=0;
          int b=1;
          if(a==0){
            System.out.println(a);
          }else if(b==1){
            System.out.println(b);
          }
          运行结果:0

你可能感兴趣的:(编码规范)