2013-04-25 34 views
0

嗨經驗豐富的程序員!關於.h和.m文件(如何管理)

標識想問你一些關於乾淨的代碼:)

編號喜歡讓我的代碼乾淨,並使其美觀大方,因此多數民衆贊成我的問題:

1)應該在哪裏我把#imports? 我的原則:(和我不認爲他們是很好的)

  • #進口框架應始終.H
  • #進口.h文件應該在.M總是
  • .h文件應只有@class,沒有進口(不含框架如UIKit的,等等)
  • 代表應在.M

    @interface ViewController() <UIAlertViewDelegate> 
    @end 
    

2)我應該在哪裏放置我的實例變量?

  • private和protected變量必須在.M
  • 公衆必須在.H

3)我應該在哪裏把我的方法是什麼?

  • 公衆對.H
  • 在.M 私人(而且是的,我知道,我的 「私有方法」 不是真正的私營企業,只是被隱藏)

(順便說一句這就是很明顯的)

4)#defines怎麼樣?

  • 全球 - 永遠的.h
  • 只用於該類 - 永遠的.m

5)我應該在哪裏把NSNotification全局標識符以及如何組織他們

  • #define NSNotificationDataSourceDidLoadData @「NSNotificationDataSourceDidLoadData」.h文件中的類將發送此通知

但是....

  • 蘋果公司在.h文件中
  • 在大多數情況下,我的.h文件只是很多私人的東西.. EMPTY :)

一年前我有另一種情況 - 一切是在.h,但我認爲它也不好

怎麼辦?你使用什麼原則? 謝謝!

那是一個關於編碼風格的問題,不是關於「如何讓它編譯」

+6

這過於寬泛。也許你可以專注於一個特定的方面,而不是放下12個子問題。 – CodaFi 2013-04-25 14:57:57

回答

5

這裏是我如何做到這一點:

  • 通常#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>進入.PCH文件。沒有頭文件或實現文件再次執行這些導入操作(使iOS和Mac OS X之間的代碼共享變得更容易)。
  • 在.h文件:因爲它們定義類相比其他類型的
    • 其他的.h文件只在絕對必要的進口,例如(枚舉,結構,一切都與一個typedef),然後將其在當前使用。 h文件。
    • 爲了避免引入其他.h文件,我們聲明瞭類(@class Foo;)。
    • 接口只包含其他類可以訪問的東西!這裏沒有私人的東西!
  • 在.m文件:
    • 包括所有你需要的.h文件。但不多;-)
    • 私有實例變量和屬性在類擴展中定義(@interface Foo())。
    • 私有方法不再需要「前向聲明」,所以不要這樣做。

在一個類中有一些東西,幾類應該訪問,但「正常」的用戶不應該,我創建foo_protected.h頭一類的類別,定義了「保護」的方法極少數情況下。

#define s上的字:如果可能,請避免使用它們。如果可能,請使用const變量或enum,因爲附加類型信息可以幫助編譯器以這種方式捕獲更多錯誤。例如,使用enum s具有很好的優點,即如果您有switch但您沒有處理enum的所有值,則會收到警告。如果你添加一個新的值,你會在你忘記處理它們的地方得到警告,這是你沒有用#define獲得的東西。

+0

+1提及私有方法/函數前向聲明的事情;我忘記了 – matt 2013-04-25 15:05:33

+0

@DarkDust嗨,我有點晚了。但是,請你舉一個例子來說明如何通過'foo_protected.h'實現一個定義「protected」的類的類。提前致謝。 – Unheilig 2014-02-05 22:39:10

+1

@Unheilig:請參見[如何模擬objective-c中的受保護屬性和方法](http://stackoverflow.com/questions/13637944/how-to-simulate-protected-properties-and-methods-in-objective-c )。 – DarkDust 2014-02-06 08:18:07

3

就個人而言,我認爲答案是非常簡單的。現在,實例變量可以在@implementation聲明,而且性能和協議收養可以在類擴展在.M文件中聲明,我不把任何那我不一個.H文件絕對放在那裏。

2

進口框架應始終.H

沒有,爲什麼呢?

進口.h文件應始終.M

這是相當模糊的。而如果你需要在頭文件中導入某些東西呢?你想要一個類的子類,你做了什麼? #import "SomeClass.h"在標題中。

.h文件應該只有@class,沒有進口(不含喜歡的UIKit框架等)

愚笨。 (對不起,它的確如此,看上面的推理。)

2)我應該在哪裏放置我的實例變量?

自其他類真的不應該訪問的ivars(即建議不要讓你的高德public),你可以把他們的任何地方:頭是好的(和它的對與V1的兼容性非常有用。 0脆弱的運行時API),但是你也可以放棄將所有內容放入類擴展中。

3)我應該在哪裏放我的方法?

你明白了這一點。

4)#defines怎麼樣?

就我而言,這也不錯。基本上,把定義和枚舉放到需要可見的地方。

蘋果公司在.h文件中 很多私人的東西在大多數情況下,我的.h文件只是..空:)

好吧,就算蘋果不符合他們的風格非常一致。始終如一。

空標題?如果您不需要標題,請不要使用標題。使用頭文件爲您的類,函數和類型聲明提供接口。