编码规范

一、工程结构

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<User> getUser();
10、缓存方法命名
      开发中经常需要本地缓存数据,在此类关于缓存方法的增删改查数据的方法命名上,应遵循以下原则:
      取方法:
          List<User> 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容