編碼規(guī)范

一、工程結(jié)構(gòu)

1、Android Studio工程結(jié)構(gòu):
    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 工程結(jié)構(gòu)
    Project
    |--  project
            |--  module
                    |--  controller
                    |--  view
                    |--  model
                            |--  bean
                            |--  delegate
                            |--  datasource
                    Contant
                    other files
     |--  Pods
     project.workspace
     project.xcodeproj
     LICENSE.txt
     README.txt

二、命名規(guī)范

 1、項(xiàng)目命名 
      以Company_項(xiàng)目名稱縮寫_平臺(tái)名稱命名,例如:XXX_MDW_iOS
 2、文件命名
      全部以大寫字母開頭,保持下劃線與
      ViewController 以"模塊名稱+ViewController"命名,例如:MainViewController
      View以"模塊名稱+View類型"命名,例如:MainSeacherButton、MainCleanView
      Delegate以"模塊名稱+功能描述+Delegate"命名,例如:MainImageListDelegate
 3、包命名
      均為小寫字母,用作描述模塊
 4、變量命名
      開頭首字母小寫,遵守駝峰式命名法
      控件命名以“功能描述+View類型”命名,例如:submitButton
      禁止使用中立詞、表意不清詞定義變量,例如:button1、button
 5、方法命名
      開頭首字母小寫,遵守駝峰式命名法,例如:initUserData()
      參數(shù)命名規(guī)則同變量命名規(guī)則
 6、接口命名
      開頭首字母大寫,以“接口描述+Interface”命名,例如:MainInterface
      接口方法命名應(yīng)準(zhǔn)確標(biāo)識(shí)此方法的調(diào)用時(shí)機(jī),例如:viewDidLoad()、viewWillDidLoad()
 7、block命名
      開頭首字母大寫,以“block描述+Block”命名,例如:MainBlock
 8、協(xié)議命名
      開頭首字母大寫,以"協(xié)議描述+Protocal"命名,例如:MainProtocal
 9、存取方法命名
      方法名應(yīng)由以下規(guī)則組成
      存方法:
          setUser(User user);
      取方法:
          List<User> getUser();
10、緩存方法命名
      開發(fā)中經(jīng)常需要本地緩存數(shù)據(jù),在此類關(guān)于緩存方法的增刪改查數(shù)據(jù)的方法命名上,應(yīng)遵循以下原則:
      取方法:
          List<User> getUser();
      增方法:
          addUser(User user)
      刪方法:
          removeUser(int index)
      改方法:
          updateUser(int index,User user)
11、常量命名
      對(duì)于常量應(yīng)遵循能使用就使用枚舉的原則,在合適的頭文件中定義枚舉類型,方便本類與其他類調(diào)用時(shí)查看。

三、作用域

 1、靜態(tài)方法
      Java以static關(guān)鍵字修飾,Objective-C使用+字符聲明
      靜態(tài)方法中不可調(diào)用非靜態(tài)方法及變量,為保證靜態(tài)方法內(nèi)部線程安全;
      但可通過傳參給靜態(tài)方法,靜態(tài)方法的形參在方法內(nèi)部是線程安全的
      應(yīng)在接口文件中暴露,使外部對(duì)其可見,在程序任何地方可以通過類名直接訪問靜態(tài)方法
 2、靜態(tài)變量
      Java以static關(guān)鍵字修飾,Objective-C使用+字符聲明
      靜態(tài)變量因?yàn)榕c函數(shù)調(diào)用無關(guān),一旦生成生命周期會(huì)持續(xù)到程序結(jié)束,所以在多線程狀態(tài)下,是線程不安全的
      應(yīng)在接口文件中暴露,使外部對(duì)其可見,在程序任何地方可以通過類名直接訪問靜態(tài)方法
      因可能產(chǎn)生線程安全問題,所以在處理多線程狀態(tài)下的靜態(tài)變量使用時(shí),應(yīng)注意可能需要使用一些同步手段,鎖定靜態(tài)變量,應(yīng)盡量減少使用
 3、全局變量
      Java以public關(guān)鍵字修飾,Objective-C一般聲明為一個(gè)配置類的屬性 
      指的是在程序運(yùn)行時(shí),需在不同位置頻繁訪問、隨時(shí)更改的變量
      全局變量因與函數(shù)調(diào)用有關(guān),當(dāng)沒有對(duì)其產(chǎn)生引用時(shí),此全局變量將可能被自動(dòng)或手動(dòng)回收,在調(diào)用其值的時(shí)候應(yīng)注意,否則可能產(chǎn)生空指針問題 
 4、局部變量 
      局部變量應(yīng)以最小作用域?yàn)橄拗?,使之在使用完后立刻可以達(dá)到回收要求,否則將產(chǎn)生不確定問題
 5、私有方法
      私有方法不應(yīng)在接口文件中暴露,使外部對(duì)其理論上不可見,其在當(dāng)前類文件中才可被訪問
 6、公有方法
      公有方法應(yīng)在接口文件中暴露,是外部對(duì)其可見的,在程序任何地方可以通過類的實(shí)例化對(duì)象訪問其公有方法
 7、保護(hù)方法
      保護(hù)方法應(yīng)在接口文件中暴露,對(duì)外部部分類可見,包括子孫類、同包下類使用,用的不多,應(yīng)盡量減少使用
 8、私有變量
      私有變量與局部變量一致,應(yīng)控制在本類運(yùn)行或本函數(shù)運(yùn)行完后即可被手動(dòng)或自動(dòng)釋放
 9、公有變量(屬性)
      屬性應(yīng)在接口文件中暴露,任何外部類對(duì)其是可見的,應(yīng)在主動(dòng)暴露給其他類使用時(shí)聲明,一般作為傳遞數(shù)據(jù)的接口
 10、保護(hù)變量 
      保護(hù)變量應(yīng)在接口文件中暴露,部分外部類對(duì)其是可見的,包括子孫類、同包下類使用,用的不多,應(yīng)盡量減少使用

四、換行

 1、方法括號(hào)換行
 2、for循環(huán)換行
 3、while循環(huán)換行
 4、switch換行
 5、if else換行
 6、block換行
 以上括號(hào)換行均應(yīng)在首行末尾起{,在末行再換一行開頭起}

五、注釋

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

 2、方法注釋
      /**  **************************************************************************************
        *  method name:[方法名稱]
        *  throw [Exception名稱] [拋出異常條件描述]
        *  param [paramname] [參數(shù)1中文釋意]
        *  param [paramname] [參數(shù)2中文釋意]
        *  return [paramname] [返回值中文釋意]
        *  author:[作者姓名]
        *  email:[作者公司郵箱地址]
        *  date:[年月日]
        */  **************************************************************************************

 3、變量注釋
      /** 
        *  Parma Name:[變量名稱][變量中文釋意]
        */

 4、單行注釋
       /** 注釋內(nèi)容 */

 5、多行注釋
      /**
        *
        *
        */

六、其他

 1、縮進(jìn)
      推薦使用4個(gè)空格,禁止使用Tab,需在Xcode配置中將Tab鍵設(shè)置為輸入4個(gè)空格

 2、不使用全局通知
      盡量不要使用全局通知,若必須使用需單獨(dú)抽取通知識(shí)別符到統(tǒng)一配置文件中,此文件命名應(yīng)為NotifitionIdtifiers

 3、黃金路徑
      a)禁止書寫例如:
           bool isTrue;
           if(isTrue){
                return true;
           }else{
                return false;
           }
           應(yīng)寫為
           return isTrue;

      b)在條件判斷時(shí)應(yīng)使用例如:
           if(![someOther boolValue]){
                return;
           }
           避免書寫例如:
           if([someOther boolValue]){
                //TODO
           }else{
                //TODO

           }

      c)在條件判斷時(shí)注意區(qū)分判斷條件關(guān)聯(lián)性。
           在以下幾種判斷方式中做合理選擇
           if(條件一){
                //TODO
           }else if(條件二){
                //TODO

           }else{
               //TODO
           }

           if(條件一){
                //TODO

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

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

           }

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

           }

      d)盡量不使用多層if嵌套判斷,并在多條件判斷時(shí)應(yīng)優(yōu)先使用短路算法,提高計(jì)算效率。

 4、英文拼寫
      推薦使用蘋果推崇的全單詞拼寫命名,按蘋果的說法“好的方法名應(yīng)當(dāng)可以以一個(gè)句子的形式朗讀出來”。減少縮寫,方便識(shí)別。

 5、mark — 文檔標(biāo)記
      iOS開發(fā)需在代碼中增加 #param — mark 功能歸類描述
      以提高代碼瀏覽效率。

 6、switch break
      在使用switch做條件判斷時(shí),需要寫default分支,以免此處出現(xiàn)邏輯漏洞,導(dǎo)致后續(xù)處理異常。

 7、單行字符限制
      為保證正常代碼瀏覽,一行代碼不應(yīng)超過120個(gè)字符。
      
 8、Exception 
      低層代碼拋出的異常務(wù)必在高層捕獲并處理。
      且盡量精準(zhǔn)地拋出或捕獲異常,不應(yīng)直接處理所有異常的父類Exception。
      
 9、Library
      在使用任何Framework時(shí),必須在第三方庫(kù)與業(yè)務(wù)代碼中增加封裝層,保證不出現(xiàn)因第三方庫(kù)變化導(dǎo)致頻繁更改大量業(yè)務(wù)代碼的問題。
      在開發(fā)任何Framework時(shí),應(yīng)將所有需引用的頭文件寫到一個(gè)跟Framework同名的頭文件中,用作其他工程直接引用,而不應(yīng)該讓其他工程分別引用所需的其他頭文件

10、硬編碼
      關(guān)于項(xiàng)目中出現(xiàn)的既定字符串應(yīng)抽取到共同文件中,而不應(yīng)硬編碼在業(yè)務(wù)代碼中,可能造成后期版本迭代時(shí),修改上出現(xiàn)很多漏改等問題。
      禁止書寫魔法數(shù)字,應(yīng)按常量定義數(shù)字代表的判斷條件。

七、小技巧

1、if else 單條件判斷成功會(huì)直接跳出,不運(yùn)行其他else判斷
    例:
          int a=0;
          int b=1;
          if(a==0){
            System.out.println(a);
          }else if(b==1){
            System.out.println(b);
          }
          運(yùn)行結(jié)果:0
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容