代碼規範問題

關於代碼規範,大同小異。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的 命名。

相關文章
相關標籤/搜索