tft每日頭條

 > 生活

 > Objective C

Objective C

生活 更新时间:2024-08-13 18:13:56

Objective-C 是 C 語言的擴展,增加了動态類型和面對對象的特性。它被設計成具有易讀易用的,支持複雜的面向對象設計的編程語言。它是 Mac OS X 以及 iPhone 的主要開發語言。

Cocoa 是 Mac OS X 上主要的應用程序框架之一。它由一組 Objective-C 類組成,為快速開發出功能齊全的 Mac OS X 應用程序提供支持。

而在日常的編程中,我們除了要寫代碼,還需要去閱讀别人的代碼,熟悉過往的業務邏輯。不知,你可曾發過牢騷:這代碼怎麼能這麼寫呢?有些時候我們的代碼,也會被别人去讀,不知你可曾想過,當别人讀到你的代碼的時候會作何評價。

誠然,“讓代碼能夠工作”是做為開發者的頭等大事。但是,代碼的可維護性卻是更加影響深遠的一件事情。你的代碼既有可能在下一個版本中被修改,也極有可能被交給另外的同事去修改。畢竟我們寫代碼,不止是在和機器溝通,而且也是在和人溝通——和其他的程序員溝通。大家都知道“學好普通話,走遍天下都不怕”,同樣的道理:寫出一手漂亮的代碼,你和誰溝通都沒問題。

即使你的原始代碼修改之後,其代碼風格和可讀性仍會影響到可維護性和可擴展性。即使代碼不複存在,你的風格和律條仍存活下來。

下面我們将圍繞一些基本的準則展開讨論,目的是讓我們寫出一手漂亮的代碼,更好的用代碼與其他同事溝通,也為了提高我們代碼的可維護性和可修改性,也是為了讓我們自己工作的地方有一個愉悅的代碼環境。

(PS:當你真的按照這些看似偏執的規則去做的時候,你就真的能夠發現“偉大來自細節”,而且會受益匪淺。保劍鋒自磨砺出,梅花香自苦寒來。)

總則

1.Don’t repeat your self.

2.代碼自注釋,依靠代碼本身來表達你的設計意圖,不要依賴注釋。

3.單一指責,無論是類、函數、模塊、包盡可能令其指責純淨且單一。

4.死程序不說謊,不要因為防止Crash寫奇葩的代碼。程序Crash了,反而更容易查找錯誤。

5.借用美國童子軍軍規:讓營地比你來時更幹淨。

格式

1.任意函數長度不得超過50行。

2.任意行代碼不得超過80字符。可以在設置中設置超過80個字符的提醒。

Objective C(Objective-C神在細節之中)1

3.在定義函數的行前留白一行

4.功能相近的代碼要放在一起。

5.使用#pragma來切分不同功能區域的代碼。

6.二元運算符和參數之間需要放置一個空格,一元運算符、強制類型轉換和參數之間不放置空格。關鍵字之後圓括号之前需要放置一個空格.

void *ptr = &value 10 * 3;

NewType a = (NewType)b;

for (int i = 0; i < 10; i ) {

doCoolThings;

}

7.長的字面值應被拆分為多行。

NSArray *theShit = @[

@"Got some long string objects in here.",

[AndSomeModelObjects too],

@"Moar strings."

];

NSDictionary *keyedShit = @{

@"this.key": @"corresponds to this value",

@"otherKey": @"remoteData.payload",

@"some": @"more",

@"JSON": @"keys",

@"and": @"stuff",

};

命名

命名是編程中最基本的技能,我們給變量、函數、類、包等等命名。給他們以名字,讓他們有意義,既能表示他們到底是做什麼的,也能将其與其他變量區别開來。而通過,語言的發展史,我們也能夠看到“方便編程人員理解和使用”一直都是編程語言發展的動力之一,而命名則是其最最核心的環節。像人一樣娶一個好名字至關重要,“丁當”總比“狗蛋”來的好聽。

為什麼要命名?命名代表着抽象,我們使用名字将一些沒必要關系的細節隐去,減少我們自己的記憶成本,也更加方便我們理解。用過C語言的人都知道,一個變量名最終會轉化成類似于~~~0x11111111~~~之類的地址,相比去理解和記憶這些地址,用一個更加抽象的變量名來代表這些地址。無論從理解還是記憶上都要方便的。

命名一定要“名副其實”,盡可能使用有意的名稱,而且這個意義和指稱的變量真實意義相關。

盡量不要出現沒有任何意義的命名類似于下述形式的命名:

int a = 1;

int b = 3;

CGPoint point = CGPointMake(a,b);

如果換成下面的形式是不是可讀性強了很多:

int startX = 1;

int startY = 3;

CGPoint startPoint = CGPointMake(startX,startY);

命名首字母大寫,其他命名首字母小寫。并且采用駝峰格式分割單詞。

例如:BWTest

使用能夠讀出來的名稱

人類長于記憶和使用單詞。大腦中的相當一部分就是用來容納和處理單詞的。單詞如果能夠讀的出來,則非常方便我們閱讀和理解。

錯誤的示例: genymdhms (生成日期,年、月、日、時、分、秒)

正确的實例: generationTimeStamp

使用可搜索的名稱

單字母名稱和數字常量有一個問題,就是很難在一大篇文字中找出來。試想一下,你找~~~MAX_CLASSES_PER_STUDENT~~~容易還是找數字7容易。

文件名

文件名反映出了其實現了什麼類(包括大小寫),你需要遵循所參與醒目的約定。

文件的擴展名及其意義如下:

Objective C(Objective-C神在細節之中)2

類别的擴展名以“被擴展的類名 自定義命名部分組成”

例如:NSSstring Utils.h

縮略詞

雖然方法命名不應使用縮略詞,然而有些縮略詞在過去被反複的使用,所以使用這些縮略詞能更好的的表達代碼的含義。下表列出了Cocoa可接受的縮略詞。

Objective C(Objective-C神在細節之中)3

以下是一些常用的首字母縮略詞:ASCII,PDF,XML,HTML,URL,RTF,HTTP,TIFF,JPG,PNG,GIF,LZW,ROM,RGB,CMYK,MIDI,FTP…

宏定義全部字母大寫,例如:#define BW_DEBUG 1

常量定義,字符串定義以小寫字母 k 開頭,随後首字母大寫

static NSString* const kBWBarTitle = @"動态";

如果要定義常量使用static const優于宏定義,前者會進行類型檢查

因為OC沒有命名空間的概念,所以使用前兩個或者多個字母來表示命名空間,例如”NSObject中的NS”,我們也使用自己的命名空間。比如

紅點中使用了VAS:VASAddValueInfo...

錢包中使用了QW:QWApplication....

注釋

讓代碼自注釋,不要依賴注釋來解釋自己的設計或者編碼意圖。除了特殊情況外,代碼中不要有多餘的注釋。

類與對象

明确指定構造函數

注釋并且明确指定你的類的構造函數。

對于需要繼承你的類的人來說,明确指定構造函數十分重要。這樣他們就可以隻重寫一個構造函數(可能是幾個)來保證他們的子類的構造函數會被調用。這也有助于将來别人調試你的類時,理解初始化代碼的工作流程。 ###重載指

定構造函數

當你寫子類的時候,如果需要 init… 方法,記得重載父類的指定構造函數。

如果你沒有重載父類的指定構造函數,你的構造函數有時可能不會被調用,這會導緻非常隐秘而且難以解決的 bug。

重載 NSObject的方法

如果重載了 NSObject 類的方法,強烈建議把它們放在 @implementation 内的起始處,這也是常見的操作方法。

通常适用(但不局限)于init…,copyWithZone:,以及dealloc方法。所有init…方法應該放在一起,copyWithZone: 緊随其後,最後才是dealloc 方法

觀察者模式

如果隻是單純的傳遞數據,不要使用觀察者模式,容易導緻邏輯鍊斷裂。

參考資料

1.《Clean Code》

2.《編寫可閱讀代碼的藝術》

3.《Google Objective-C Style Guide》

4.《Introduction to Coding Guidelines for Cocoa》

5.《iOS應用開發最佳實踐系列一:編寫高質量的Objective-C代碼》

内容來源:CocoaChina

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved