前缀
主要用于避免和第三方开发者或者Apple之间的命名冲突。前缀的规范:
- 通常由2/3个大写字母组成,不是用下划线和子前缀。例如:NS、IB、AB。
- 使用前缀来命名类、协议、函数、常数,自定义数据类型(typedef structures),不要用前缀来命名方法。方法存在类的命名区域中,不要在这区域里面使用前缀。
书写规则
(1).对于由多个单词组成的名字,使用骆驼风格
(2).对于方法名字,小写字母开头,不要用前缀。
(3).对于 函数和常数,和相关类使用相同的前缀,并且大写第一个字母 。例NSLog、NSCellDisabled。
(4).避免使用下划线作为前缀,会导致方法名称私有 .
类的命名
一个类的名称应该 包含一个名词,清楚地表明的类(或类的对象)作用或者意义,名称应该有一个适当的前缀。如:NSString,NSDate。
协议
协议的命名应该根据使用协议的相应类行为命名。
- 大多数协议包含的相关方法,不与任何特定的类关联。这种协议的应该命名为使协议与类不能混淆。一个通常的规则是 用动名词(...ing )。对比NSLocking 、NSLock(看起来像类名)
- 有的协议包含一些没什么联系的方法(而不是创建多个独立的小协议)。这些协议跟一个类的联系很大,这个类主要体现了这个协议。这种情况下,命名规则为协议名 跟类名字一样 。一个例子是NSObject 协议,这个协议包含一些方法可以查询任何类在父类中的层次位置等。因为NSObject类实现了协议的大部分方法,所以协议可以以类名命名。
头文件
怎么命名你的头文件非常重要。因为你的命名表明了类中的内容:
- 如果一个类/协议不是一个文件中的一部分,将其声明独立成一个文件,这个文件的名字表明了该类/协议;
- 如果有一些联系的声明(类、协议、分类),将它们声明放到一个文件中,文件的命名根据基础的类、协议、分类;
头文件 | 声明 |
---|---|
NSString.h | NSString和NSSMutableString |
NSLock.h | NSLocking协议、NSLock、NSConditionLock、NSRecursive类 |
- 包含框架的头文件: 所有的框架都有一个头文件,以框架命名,包含框架里所有公开的头文件。例Foundation.h-- Foundation.framwork
- 为别的框架中类增加API 如果你在一个框架中声明的方法,是另一个框架中类的分类,名字为原来类的名字拼接上“Additions”。一个例子为Applicatiion kit 的NSBuddleAdditions.h头文件。
- 相联系的函数和数据类型:如果你有一些相联系的函数、常数、结构体等其他数据类型,将它们放到合适命名的头文件中。例如NSGraphics.h(Applicatiion kit )。
方法命名
- 方法名小写开头,之后每个单词首字母大写(Camel-Case),不要用前缀;
- 如果方法代表对象某个动作,方法名用动词开头。-(void)invokeWithTarget:(id)target。 不要使用"do"或"does"这样的词做名字一部分,因为这些辅助动词没什么意义,同时不要在动词前使用副词或形容词。
- 如果方法返回的是消息发送者(对象)的属性,用属性命名方法。"get"这个词不需要,除非有多个间接返回的值。 - (NSSize)cellSize;
- 在所有的参数前使用关键词,参数前的单词描述参数的意义- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- 当你创建一个基于现有方法的新方法, 在一个已有的方法上添加关键词,不要使用"and"去连接多个参数的关键词(对象属性名) - (id)initWithFrame:(CGRect)frameRect -> - (id)initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide;
6.如果方法包含着俩个分开的动作,用and去连接它们- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag;
set 和 get 方法
- 属性是名词 - (type)noun; - (void)setNoun:(type)aNoun;
- 属性表示的是形容词意思 - (BOOL)isAdjective; - (void)setAdjective:(BOOL)flag;
- 属性表示的是动词意思 -(BOOL)verbObject; - (void)setVerbObject:(BOOL)flag;
- 在属性的名称中,不要通过用分词形式将动词转换为形容词 - (void)setAcceptsGlyphInfo:(BOOL)flag; 不要写成- (void)setGlyphInfoAccepted:(BOOL)flag;
- 可以使用情态动词(动词前面“can”、“should”、“will”等)进一步说明属性意思,但不要使用'do'或'does'。 如: - (void)setCanHide:(BOOL)flag;但不要使用'do'或'does' 如 - (BOOL)doesAcceptGlyphInfo;
当使用get这个词时,只有当方法间接返回多个对象/值 - (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase; 注意,这种形式的方法,其中的引用型参数应该能接收NULL,因为方法调用者可能并不需要多个返回值。
方法参数
在命名方法参数时候有几个基本规则:
- 参数的名字也是骆驼风格
- 不要使用“pointer”或"ptr"这些词,参数的类型比参数的名字更能说明它是否是指针
- 避免一俩个字母做参数的名字
- 避免缩写,难以看懂。
私有方法
在Cocoa框架中命名大多数私有的方法用下划线前缀开头,对于你自己的私有方法,不要使用下划线前缀。可以使用一个基于在你公司或项目的形式”xx_”如:SEM_XXX
函数命名
函数命名有几下基本原则:
- 用你在类/常数中的前缀开头,并且前缀后的首字母大写
- 以动词开头,描述函数实现的功能 如:NSHighlightRect NSDeallocateObject
- 函数如果是查询一些属性,命名有一些特别的规定:
(1). 如果函数返回第一个参数的属性,省略动词 float NSHeight(NSRect aRect)
(2).如果函数返回值是指针,使用"Get" const char *NSGetSizeAndAlignment(const char *typePtr, unsigned int *sizep, unsigned int *alignp)
属性
因为属性和存取器方法的对应性质,所以对于属性的命名基本类似存取器方法的名字
- 如果属性是名称/动词意思 格式: @property (…) type nounOrVerb
例:@property (strong) NSString *title; @property (assign) BOOL showsAlpha; - 如果属性是形容词意思,属性名称省略"is"前缀,并且指定存取器get方法的命名 。例如:@property (assign, getter=isEditable) BOOL editable;
实例变量 用下划线前缀 来什么申明实例变量 如: _title
viewController代码结构的规定
- 所有的属性都使用getter和setter,初始化交给getter去做。
- viewDidload 里 写 view相关的事情 如 addSubview 。
- viewWillAppear 用来更新Form数据
- viewDidAppear 做一些监听类的事情
5.改变位置可以放在viewWilllayoutSubview或者didLayoutSubview里
6.在viewDidLayoutSubview确定UI位置关系之后设置autoLayout
代码排版方面
1.先是life cycle
- 代理方法实现 做好文档标识#pragma mark - UITableViewDelegate
- 事件处理
- getters and setters 写到最后
- ViewController 如果有私有方法 如:日期换算、图片裁剪等 写到分类或者单独一个模块,可以实现代码复用,脱藕。
网友评论