自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

IOS團(tuán)隊(duì)編程規(guī)范

移動(dòng)開(kāi)發(fā) iOS
簡(jiǎn)潔的代碼可以讓bug無(wú)處藏身。要寫(xiě)出明顯沒(méi)有bug的代碼,而不是沒(méi)有明顯bug的代碼。先把眼前的問(wèn)題解決掉,解決好,再考慮將來(lái)的擴(kuò)展問(wèn)題。

[[201429]]

前 言

需求是暫時(shí)的,只有變化才是永恒的,面向變化編程,而不是面向需求編程。

不要過(guò)分追求技巧,降低程序的可讀性。

簡(jiǎn)潔的代碼可以讓bug無(wú)處藏身。要寫(xiě)出明顯沒(méi)有bug的代碼,而不是沒(méi)有明顯bug的代碼。

先把眼前的問(wèn)題解決掉,解決好,再考慮將來(lái)的擴(kuò)展問(wèn)題。

一、命名規(guī)范

1、統(tǒng)一要求

含義清楚,盡量做到不需要注釋也能了解其作用,若做不到,就加注釋,使用全稱,不使用縮寫(xiě)。

2、類名

大駝峰式命名:每個(gè)單詞的首字母都采用大寫(xiě)字母

==例:== MFHomePageViewController

3、私有變量

  • 私有變量放在 .m 文件中聲明
  • 以 _ 開(kāi)頭,***個(gè)單詞首字母小寫(xiě),后面的單詞的首字母全部大寫(xiě)。

==例:== NSString *_somePrivateVariable

4、property變量

  • 小駝峰式命名:***個(gè)單詞以小寫(xiě)字母開(kāi)始,后面的單詞的首字母全部大寫(xiě)
  • 屬性的關(guān)鍵字推薦按照 原子性,讀寫(xiě),內(nèi)存管理的順序排列。
  • Block、NSString屬性應(yīng)該使用copy關(guān)鍵字
  • 禁止使用synthesize關(guān)鍵詞

==例:==

  1. typedef void (^ErrorCodeBlock) (id errorCode,NSString *message); 
  2.  
  3. @property (nonatomic, readwrite, strong) UIView *headerView; //注釋 
  4.  
  5. @property (nonatomic, readwrite, copy) ErrorCodeBlock errorBlock; //將block拷貝到堆中 
  6.  
  7. @property (nonatomic, readwrite, copy) NSString *userName;  

5、宏和常量命名

  • 對(duì)于宏定義的常量

#define 預(yù)處理定義的常量全部大寫(xiě),單詞間用 _ 分隔

宏定義中如果包含表達(dá)式或變量,表達(dá)式或變量必須用小括號(hào)括起來(lái)。

  • 對(duì)于類型常量

對(duì)于局限于某編譯單元(實(shí)現(xiàn)文件)的常量,以字符k開(kāi)頭,例如kAnimationDuration,且需要以static const修飾

對(duì)于定義于類頭文件的常量,外部可見(jiàn),則以定義該常量所在類的類名開(kāi)頭,例如EOCViewClassAnimationDuration, 仿照蘋(píng)果風(fēng)格,在頭文件中進(jìn)行extern聲明,在實(shí)現(xiàn)文件中定義其值

==例:==

  1. //宏定義的常量 
  2.  
  3. #define ANIMATION_DURATION    0.3 
  4.  
  5. #define MY_MIN(A, B)  ((A)>(B)?(B):(A)) 
  6.  
  7.   
  8.  
  9. //局部類型常量 
  10.  
  11. static const NSTimeInterval kAnimationDuration = 0.3; 
  12.  
  13.   
  14.  
  15. //外部可見(jiàn)類型常量 
  16.  
  17. //EOCViewClass.h 
  18.  
  19. extern const NSTimeInterval EOCViewClassAnimationDuration; 
  20.  
  21. extern NSString *const EOCViewClassStringConstant;  //字符串類型 
  22.  
  23.   
  24.  
  25. //EOCViewClass.m 
  26.  
  27. const NSTimeInterval EOCViewClassAnimationDuration = 0.3; 
  28.  
  29. NSString *const EOCViewClassStringConstant = @"EOCStringConstant" 

6、Enum

  • Enum類型的命名與類的命名規(guī)則一致
  • Enum中枚舉內(nèi)容的命名需要以該Enum類型名稱開(kāi)頭
  • NS_ENUM定義通用枚舉,NS_OPTIONS定義位移枚舉

==例:==

  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { 
  2.  
  3.     UIViewAnimationTransitionNone, 
  4.  
  5.     UIViewAnimationTransitionFlipFromLeft, 
  6.  
  7.     UIViewAnimationTransitionFlipFromRight, 
  8.  
  9.     UIViewAnimationTransitionCurlUp, 
  10.  
  11.     UIViewAnimationTransitionCurlDown, 
  12.  
  13. }; 
  14.  
  15.   
  16.  
  17. typedef NS_OPTIONS(NSUInteger, UIControlState) { 
  18.  
  19.     UIControlStateNormal       = 0, 
  20.  
  21.     UIControlStateHighlighted  = 1  

7、Delegate

  • 用delegate做后綴,如
  • 用optional修飾可以不實(shí)現(xiàn)的方法,用required修飾必須實(shí)現(xiàn)的方法
  • 當(dāng)你的委托的方法過(guò)多, 可以拆分?jǐn)?shù)據(jù)部分和其他邏輯部分, 數(shù)據(jù)部分用dataSource做后綴. 如
  • 使用did和will通知Delegate已經(jīng)發(fā)生的變化或?qū)⒁l(fā)生的變化。
  • 類的實(shí)例必須為回調(diào)方法的參數(shù)之一
  • 回調(diào)方法的參數(shù)只有類自己的情況,方法名要符合實(shí)際含義
  • 回調(diào)方法存在兩個(gè)以上參數(shù)的情況,以類的名字開(kāi)頭,以表明此方法是屬于哪個(gè)類的

==例:==

  1. @protocol UITableViewDataSource    
  2.  
  3. @required   
  4.  
  5. //回調(diào)方法存在兩個(gè)以上參數(shù) 
  6.  
  7. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  8.  
  9. @optional 
  10.   
  11.  
  12. //回調(diào)方法的參數(shù)只有類自己 
  13.  
  14. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented 
  15.  
  16.  
  17. @protocol UITableViewDelegate    
  18.  
  19. @optional 
  20.   
  21.  
  22. //使用`did`和`will`通知`Delegate` 
  23.  
  24. - (nullable NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath; 
  25.  
  26. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;  

8、方法

  • 方法名用小駝峰式命名
  • 方法名不要使用new作為前綴
  • 不要使用and來(lái)連接屬性參數(shù),如果方法描述兩種獨(dú)立的行為,使用and來(lái)串接它們。
  • 方法實(shí)現(xiàn)時(shí),如果參數(shù)過(guò)長(zhǎng),則令每個(gè)參數(shù)占用一行,以冒號(hào)對(duì)齊。
  • 一般方法不使用前綴命名,私有方法可以使用統(tǒng)一的前綴來(lái)分組和辨識(shí)
  • 方法名要與對(duì)應(yīng)的參數(shù)名保持高度一致
  • 表示對(duì)象行為的方法、執(zhí)行性的方法應(yīng)該以動(dòng)詞開(kāi)頭
  • 返回性的方法應(yīng)該以返回的內(nèi)容開(kāi)頭,但之前不要加get,除非是間接返回一個(gè)或多個(gè)值。
  • 可以使用情態(tài)動(dòng)詞(動(dòng)詞前面can、should、will等)進(jìn)一步說(shuō)明屬性意思,但不要使用do或does,因?yàn)檫@些助動(dòng)詞沒(méi)什么實(shí)際意義。也不要在動(dòng)詞前使用副詞或形容詞修飾

==例:== 

  1. //不要使用 and 來(lái)連接屬性參數(shù) 
  2.  
  3. - (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes;    //推薦 
  4.  
  5. - (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;    //反對(duì)  
  6.   
  7.  
  8. //表示對(duì)象行為的方法、執(zhí)行性的方法 
  9.  
  10. - (void)insertModel:(id)model atIndex:(NSUInteger)atIndex; 
  11.  
  12. - (void)selectTabViewItem:(NSTableViewItem *)tableViewItem  
  13.   
  14.  
  15. //返回性的方法 
  16.  
  17. - (instancetype)arrayWithArray:(NSArray *)array;  
  18.   
  19.  
  20. //參數(shù)過(guò)長(zhǎng)的情況 
  21.  
  22. - (void)longMethodWith:(NSString *)theFoo  
  23.                   rect:(CGRect)theRect  
  24.               interval:(CGFloat)theInterval  
  25.  
  26.    //Implementation  
  27.    
  28.  
  29. //不要加get  
  30. - (NSSize) cellSize;  //推薦  
  31. - (NSSize) getCellSize;  //反對(duì)   
  32.  
  33. //使用情態(tài)動(dòng)詞,不要使用do或does 
  34. - (BOOL)canHide;  //推薦  
  35. - (BOOL)shouldCloseDocument;  //推薦  
  36. - (BOOL)doesAcceptGlyphInfo;  //反對(duì)  

二、代碼注釋規(guī)范

優(yōu)秀的代碼大部分是可以自描述的,我們完全可以用代碼本身來(lái)表達(dá)它到底在干什么,而不需要注釋的輔助。

但并不是說(shuō)一定不能寫(xiě)注釋,有以下三種情況比較適合寫(xiě)注釋:

  • 公共接口(注釋要告訴閱讀代碼的人,當(dāng)前類能實(shí)現(xiàn)什么功能)。
  • 涉及到比較深層專業(yè)知識(shí)的代碼(注釋要體現(xiàn)出實(shí)現(xiàn)原理和思想)。
  • 容易產(chǎn)生歧義的代碼(但是嚴(yán)格來(lái)說(shuō),容易讓人產(chǎn)生歧義的代碼是不允許存在的)。

除了上述這三種情況,如果別人只能依靠注釋才能讀懂你的代碼的時(shí)候,就要反思代碼出現(xiàn)了什么問(wèn)題。

***,對(duì)于注釋的內(nèi)容,相對(duì)于“做了什么”,更應(yīng)該說(shuō)明“為什么這么做”。

1、import注釋

如果有一個(gè)以上的import語(yǔ)句,就對(duì)這些語(yǔ)句進(jìn)行分組,每個(gè)分組的注釋是可選的。

  1. // Frameworks  
  2. #import ;  
  3. // Models  
  4. #import "NYTUser.h"  
  5. // Views  
  6. #import "NYTButton.h"  
  7. #import "NYTUserView.h" 

2、屬性注釋

寫(xiě)在屬性之后,用兩個(gè)空格隔開(kāi)

==例:==

  1. @property (nonatomic, readwrite, strong) UIView *headerView; //注釋 

3、方法聲明注釋:

一個(gè)函數(shù)(方法)必須有一個(gè)字符串文檔來(lái)解釋,除非它:

  • 非公開(kāi),私有函數(shù)。
  • 很短。
  • 顯而易見(jiàn)。

而其余的,包括公開(kāi)接口,重要的方法,分類,以及協(xié)議,都應(yīng)該伴隨文檔(注釋):

  • 以/開(kāi)始
  • 第二行是總結(jié)性的語(yǔ)句
  • 第三行永遠(yuǎn)是空行
  • 在與第二行開(kāi)頭對(duì)齊的位置寫(xiě)剩下的注釋。

建議這樣寫(xiě):

  1. /This comment serves to demonstrate the format of a doc string. 
  2.  
  3.   
  4.  
  5. Note that the summary line is always at most one line long, and after the opening block comment, 
  6.  
  7. and each line of text is preceded by a single space
  8.  
  9. */  

方法的注釋使用Xcode自帶注釋快捷鍵:Commond+option+/

==例:==

  1. /** 
  2.  
  3.   
  4.  
  5. @param tableView 
  6.  
  7. @param section 
  8.  
  9. <a href='http://www.jobbole.com/members/wx1409399284'>@return</a> 
  10.  
  11. */ 
  12.  
  13. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
  14.  
  15.  
  16.     //... 
  17.  
  18.  

4、代碼塊注釋

單行的用//+空格開(kāi)頭,多行的采用/* */注釋

5、TODO

使用//TODO:說(shuō)明 標(biāo)記一些未完成的或完成的不盡如人意的地方

==例:==

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
  2.  
  3.  
  4.     //TODO:增加初始化 
  5.  
  6.     return YES; 
  7.  
  8.  

三、代碼格式化規(guī)范

1、指針*位置

定義一個(gè)對(duì)象時(shí),指針*靠近變量

==例:== NSString *userName;

2、方法的聲明和定義

在 - 、+和 返回值之間留一個(gè)空格,方法名和***個(gè)參數(shù)之間不留空格

==例:==

  1. - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index

3、代碼縮進(jìn)

  • 不要在工程里使用 Tab 鍵,使用空格來(lái)進(jìn)行縮進(jìn)。在 Xcode > Preferences > Text Editing 將 Tab 和自動(dòng)縮進(jìn)都設(shè)置為 4 個(gè)空格
  • Method與Method之間空一行
  • 一元運(yùn)算符與變量之間沒(méi)有空格、二元運(yùn)算符與變量之間必須有空格

==例:== 

  1. !bValue 
  2.  
  3. fLength = fWidth * 2;   
  4.  
  5. - (void)sampleMethod1;   
  6.  
  7. - (void)sampleMethod2;  

4、對(duì)method進(jìn)行分組

使用#pragma mark -對(duì)method進(jìn)行分組 

  1. #pragma mark - Life Cycle Methods 
  2.  
  3. - (instancetype)init 
  4.  
  5. - (void)dealloc   
  6.  
  7. - (void)viewWillAppear:(BOOL)animated 
  8.  
  9. - (void)viewDidAppear:(BOOL)animated 
  10.  
  11. - (void)viewWillDisappear:(BOOL)animated 
  12.  
  13. - (void)viewDidDisappear:(BOOL)animated   
  14.  
  15. #pragma mark - Override Methods 
  16.  
  17. #pragma mark - Intial Methods   
  18.  
  19. #pragma mark - Network Methods   
  20.  
  21. #pragma mark - Target Methods  
  22.  
  23. #pragma mark - Public Methods   
  24.  
  25. #pragma mark - Private Methods   
  26.  
  27. #pragma mark - UITableViewDataSource   
  28.  
  29. #pragma mark - UITableViewDelegate    
  30.  
  31. #pragma mark - Lazy Loads  
  32.  
  33. #pragma mark - NSCopying    
  34.  
  35. #pragma mark - NSObject  Methods  

5、大括號(hào)寫(xiě)法

對(duì)于類的method:左括號(hào)另起一行寫(xiě)(遵循蘋(píng)果官方文檔)

對(duì)于其他使用場(chǎng)景(if,for,while,switch等): 左括號(hào)跟在***行后邊

==例:==

  1. - (void)sampleMethod 
  2.  
  3.  
  4.     BOOL someCondition = YES; 
  5.  
  6.     if(someCondition) { 
  7.  
  8.         // do something here 
  9.  
  10.     } 
  11.  
  12.  

6、property變量

==例:==

  1. @property (nonatomic, readwrite, strong) UIView *headerView; //注釋 

四、編碼規(guī)范

1、if語(yǔ)句

①、須列出所有分支(窮舉所有的情況),而且每個(gè)分支都須給出明確的結(jié)果。

==推薦這樣寫(xiě):==

  1. var hintStr; 
  2.  
  3. if (count < 3) { 
  4.  
  5.   hintStr = "Good"
  6.  
  7. else { 
  8.  
  9.   hintStr = ""
  10.  
  11.  

==不推薦這樣寫(xiě):==

  1. var hintStr; 
  2.  
  3. if (count < 3) { 
  4.  
  5.  hintStr = "Good"
  6.  
  7.  

②、不要使用過(guò)多的分支,要善于使用return來(lái)提前返回錯(cuò)誤的情況,把最正確的情況放到***返回。

==推薦這樣寫(xiě):== 

  1. if (!user.UserName) return NO
  2.  
  3. if (!user.Passwordreturn NO
  4.  
  5. if (!user.Email) return NO  
  6.  
  7. return YES;  

==不推薦這樣寫(xiě):== 

  1. BOOL isValid = NO
  2.  
  3. if (user.UserName) 
  4.  
  5.     if (user.Password
  6.     { 
  7.         if (user.Email) isValid = YES; 
  8.     } 
  9. return isValid;  

③、條件過(guò)多,過(guò)長(zhǎng)的時(shí)候應(yīng)該換行。條件表達(dá)式如果很長(zhǎng),則需要將他們提取出來(lái)賦給一個(gè)BOOL值,或者抽取出一個(gè)方法

==推薦這樣寫(xiě):==

  1. if (condition1 && 
  2.  
  3.     condition2 && 
  4.  
  5.     condition3 && 
  6.  
  7.     condition4) { 
  8.  
  9.   // Do something 
  10.  
  11.  
  1. BOOL finalCondition = condition1 && condition2 && condition3 && condition4 
  2.  
  3. if (finalCondition) { 
  4.  
  5.   // Do something 
  6.  
  7.  
  8.  
  9. if ([self canDelete]){ 
  10.  
  11.   // Do something 
  12.  
  13.  
  14.   
  15.  
  16. - (BOOL)canDelete 
  17.  
  18.  
  19.     BOOL finalCondition1 = condition1 && condition2 
  20.  
  21.     BOOL finalCondition2 =  condition3 && condition4 
  22.  
  23.   
  24.  
  25.     return condition1 && condition2; 
  26.  
  27.  

==不推薦這樣寫(xiě):==

  1. if (condition1 && condition2 && condition3 && condition4) { 
  2.  
  3.   // Do something 
  4.  
  5.  

④、條件語(yǔ)句的判斷應(yīng)該是變量在右,常量在左。

==推薦:==

  1. if (6 == count) { 
  2.  
  3.   
  4.  
  5. if (nil == object) { 
  6.  
  7.   
  8.  
  9. if (!object) { 
  10.  
  11.  

==不推薦:==

  1. if (count == 6) { 
  2.  
  3.  
  4. if (object == nil) { 
  5.  
  6.  

if (object == nil)容易誤寫(xiě)成賦值語(yǔ)句,if (!object)寫(xiě)法很簡(jiǎn)潔

⑤、每個(gè)分支的實(shí)現(xiàn)代碼都須被大括號(hào)包圍

==推薦:==

  1. if (!error) { 
  2.  
  3.   return success; 
  4.  
  5.  

==不推薦:==

  1. if (!error) 
  2.   return success;  

可以如下這樣寫(xiě):

  1. if (!error) return success; 

2、for語(yǔ)句

①、不可在for循環(huán)內(nèi)修改循環(huán)變量,防止for循環(huán)失去控制。

  1. for (int index = 0; index < 10; index++){ 
  2.    ... 
  3.    logicToChange(index
  4.  

②、避免使用continue和break。

continue和break所描述的是“什么時(shí)候不做什么”,所以為了讀懂二者所在的代碼,我們需要在頭腦里將他們?nèi)》础?/p>

其實(shí)***不要讓這兩個(gè)東西出現(xiàn),因?yàn)槲覀兊拇a只要體現(xiàn)出“什么時(shí)候做什么”就好了,而且通過(guò)適當(dāng)?shù)姆椒?,是可以將這兩個(gè)東西消滅掉的:

  • 如果出現(xiàn)了continue,只需要把continue的條件取反即可
  1. var filteredProducts = Array() 
  2. for level in products { 
  3.     if level.hasPrefix("bad") { 
  4.         continue 
  5.     } 
  6.     filteredProducts.append(level
  7.  

我們可以看到,通過(guò)判斷字符串里是否含有“bad”這個(gè)prefix來(lái)過(guò)濾掉一些值。其實(shí)我們是可以通過(guò)取反,來(lái)避免使用continue的:

  1. for level in products {  
  2.     if !level.hasPrefix("bad") {  
  3.       filteredProducts.append(level 
  4.     }  
  5.  
  • 消除while里的break:將break的條件取反,并合并到主循環(huán)里

在while里的break其實(shí)就相當(dāng)于“不存在”,既然是不存在的東西就完全可以在最開(kāi)始的條件語(yǔ)句中將其排除。

while里的break:

  1. while (condition1) { 
  2.   ... 
  3.   if (condition2) { 
  4.     break; 
  5.   } 
  6.  

取反并合并到主條件:

  1. while (condition1 && !condition2) { 
  2. ... 
  3.  
  • 在有返回值的方法里消除break:將break轉(zhuǎn)換為return立即返回

有人喜歡這樣做:在有返回值的方法里break之后,再返回某個(gè)值。其實(shí)完全可以在break的那一行直接返回。

  1. func hasBadProductIn(products: Array) -> Bool { 
  2.     var result = false     
  3.     for level in products { 
  4.         if level.hasPrefix("bad") { 
  5.             result = true 
  6.             break 
  7.         } 
  8.     } 
  9.    return result 
  10.  

遇到錯(cuò)誤條件直接返回:

  1. func hasBadProductIn(products: Array) -> Bool { 
  2.  
  3.     for level in products { 
  4.  
  5.         if level.hasPrefix("bad") { 
  6.  
  7.             return true 
  8.  
  9.         } 
  10.  
  11.     } 
  12.  
  13.    return false 
  14.  
  15.  

這樣寫(xiě)的話不用特意聲明一個(gè)變量來(lái)特意保存需要返回的值,看起來(lái)非常簡(jiǎn)潔,可讀性高。

3、Switch語(yǔ)句

①、每個(gè)分支都必須用大括號(hào)括起來(lái)

推薦這樣寫(xiě): 

  1. switch (integer) {    
  2.   case 1:  {  
  3.     // ...    
  4.    }  
  5.     break;    
  6.   case 2: {   
  7.     // ...    
  8.     break;  
  9.   }    
  10.   default:{  
  11.     // ...    
  12.     break;  
  13.   }  
  14.  

②、使用枚舉類型時(shí),不能有default分支, 除了使用枚舉類型以外,都必須有default分支 

  1. RWTLeftMenuTopItemType menuType = RWTLeftMenuTopItemMain;    
  2. switch (menuType) {    
  3.   case RWTLeftMenuTopItemMain: {  
  4.     // ...    
  5.     break;  
  6.    }  
  7.   case RWTLeftMenuTopItemShows: {  
  8.     // ...    
  9.     break;  
  10.   }  
  11.   case RWTLeftMenuTopItemSchedule: {  
  12.     // ...    
  13.     break;  
  14.   }  
  15.  

在Switch語(yǔ)句使用枚舉類型的時(shí)候,如果使用了default分支,在將來(lái)就無(wú)法通過(guò)編譯器來(lái)檢查新增的枚舉類型了。

4、函數(shù)

①、一個(gè)函數(shù)只做一件事(單一原則)

每個(gè)函數(shù)的職責(zé)都應(yīng)該劃分的很明確(就像類一樣)。

==推薦:==

  1. dataConfiguration()  
  2. viewConfiguration()  

==不推薦:==

  1. void dataConfiguration() 
  2.   ... 
  3.   viewConfiguration() 
  4.  

②、對(duì)于有返回值的函數(shù)(方法),每一個(gè)分支都必須有返回值

==推薦:== 

  1. int function() 
  2.     if(condition1){ 
  3.         return count1 
  4.     }else if(condition2){ 
  5.         return count2 
  6.     }else
  7.        return defaultCount 
  8.     } 
  9.  

==不推薦:==

  1. int function() 
  2.     if(condition1){ 
  3.         return count1 
  4.     }else if(condition2){ 
  5.         return count2 
  6.     } 

③、對(duì)輸入?yún)?shù)的正確性和有效性進(jìn)行檢查,參數(shù)錯(cuò)誤立即返回

==推薦:==

  1. void function(param1,param2) 
  2.       if(param1 is unavailable){ 
  3.            return; 
  4.       }  
  5.  
  6.       if(param2 is unavailable){ 
  7.            return; 
  8.       } 
  9.      //Do some right thing 
  10.  

④、如果在不同的函數(shù)內(nèi)部有相同的功能,應(yīng)該把相同的功能抽取出來(lái)單獨(dú)作為另一個(gè)函數(shù)

原來(lái)的調(diào)用:

  1. void logic() {  
  2.   a();  
  3.   b();  
  4.   if (logic1 condition) {  
  5.     c();  
  6.   } else {  
  7.     d();  
  8.   }  
  9.  

將a,b函數(shù)抽取出來(lái)作為單獨(dú)的函數(shù)

  1. void basicConfig() { 
  2.   a(); 
  3.   b(); 
  4. void logic1() { 
  5.   basicConfig(); 
  6.   c(); 
  7. void logic2() { 
  8.   basicConfig(); 
  9.   d(); 
  10.  

⑤、將函數(shù)內(nèi)部比較復(fù)雜的邏輯提取出來(lái)作為單獨(dú)的函數(shù)

一個(gè)函數(shù)內(nèi)的不清晰(邏輯判斷比較多,行數(shù)較多)的那片代碼,往往可以被提取出去,構(gòu)成一個(gè)新的函數(shù),然后在原來(lái)的地方調(diào)用它這樣你就可以使用有意義的函數(shù)名來(lái)代替注釋,增加程序的可讀性。

舉一個(gè)發(fā)送郵件的例子:

  1. openEmailSite(); 
  2. login();     
  3. writeTitle(title); 
  4. writeContent(content); 
  5. writeReceiver(receiver); 
  6. addAttachment(attachment); 
  7. send();  

中間的部分稍微長(zhǎng)一些,我們可以將它們提取出來(lái):

  1. void writeEmail(title, content,receiver,attachment) 
  2.   writeTitle(title); 
  3.   writeContent(content); 
  4.   writeReceiver(receiver); 
  5.   addAttachment(attachment); 
  6.  

然后再看一下原來(lái)的代碼:

  1. openEmailSite(); 
  2. login(); 
  3. writeEmail(title, content,receiver,attachment) 
  4. send();   
責(zé)任編輯:龐桂玉 來(lái)源: iOS大全
相關(guān)推薦

2009-08-03 17:07:13

ASP.NET編程規(guī)范

2009-08-03 16:57:42

ASP.NET編程規(guī)范

2009-07-24 10:29:29

PL SQL編程規(guī)范

2025-03-04 13:00:00

JavaScrip代碼語(yǔ)言

2009-08-27 16:30:08

C#編程命名規(guī)范

2012-02-02 15:04:02

軟件開(kāi)發(fā)

2011-04-07 10:50:47

數(shù)據(jù)庫(kù)編程注釋規(guī)范

2012-03-22 17:16:24

Java

2011-09-26 10:50:16

JavaScript

2015-09-01 10:42:15

編程規(guī)范完全指南

2013-05-27 11:52:16

CiscoIOS思科交換機(jī)

2011-04-07 10:29:21

數(shù)據(jù)庫(kù)編程書(shū)寫(xiě)規(guī)范

2009-11-10 15:30:46

VB.NET編程原則

2023-05-06 07:32:31

Vue項(xiàng)目Mixin

2022-08-19 09:12:19

數(shù)據(jù)庫(kù)開(kāi)發(fā)

2010-03-05 11:38:40

Python編程規(guī)范

2022-04-26 18:08:21

C語(yǔ)言代碼編程規(guī)范

2012-11-08 09:45:44

JavaScriptrequireJS

2014-11-04 10:38:13

iOS圖形

2011-12-12 11:16:02

iOS并發(fā)編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)