iOS DeveloperAndroid技术交流ios技术交流

OC代码规范

2021-02-26  本文已影响0人  浪人残风

Version: 0.01

本文部份章节摘自《苹果 Cocoa 编码规范》(即Apple’s Cocoa Coding Guidelines)、《Google的Objective-C编码规范》(即Google Objective-C Style Guide)。

命名

在面向对象软件库的设计过程中,开发人员经常忽视对类、方法、函数、常量以及其他编程接口元素的命名。本节讨论大多数 Cocoa 接口的一些命名约定。

一般性原则

清晰性

代码 点评
insertObject:atIndex: good
insert:at: 不清晰;要插入什么?“at”表示什么?
removeObjectAtIndex: good
removeObject: 这样也不错,可以针对特定的对象进行移除。
remove 不清晰;要移除什么?
代码 点评
destinationSelection good
destSel 不清晰
setBackgroundColor: good
setBkgdColor: 不清晰

你可能会认为某个缩写广为人知,但有可能并非如此,尤其是当你的代码被来自不同文化和语言背景的开

发人员所使用时。

代码 点评
sendPort 是发送端口还是返回一个发送端口?
displayName 是显示名称还是返回用于展示的名称?

一致性

代码 点评
- (int)tag 在 NSView, NSCell, NSControl 中有定义
- (void)setStringValue:(NSString *) 在 Cocoa 的许多类中有定义

请参考“方法参数”一节。

不要自我指涉

代码 点评
NSString okey
NSStringObject 自我指涉
代码 点评
NSUnderlineByWordMask okey
NSTableViewColumnDidMoveNotification okey

前缀

前缀是名称的重要组成部分。它们可以区分软件的功能范畴。通常,软件会被打包成一个框架或多个紧密相关的框架(如 Foundation 和 Application Kit 框架)。前缀可以防止第三方开发者与苹果公司之间的命名冲

突(同样也可防止苹果内部不同框架之间的命名冲突)。

前缀 Cocoa 框架
NS Foundation
NS Application Kit
AB Address Book
IB Interface Builder

书写约定

在为 API 元素命名时,请遵循如下一些简单的书写约定:

类与协议命名

类名应包含一个明确描述该类(或类的对象)是什么或做什么的名词。类名要有合适的前缀(请参考“前缀”一节)。 Foundation 及 Application Kit 有很多这样例子,如: NSString, NSData, NSScanner, NSApplication, NSButton 以及 NSEvent 。

协议应该根据对方法的行为进行分组的方式来命名。

代码 点评
NSLocking good
NSLock 糟糕,它看起来像类名

头文件

头文件的命名方式很重要,我们可以根据其命名知晓头文件的内容。

头文件 声明
NSApplication.h NSApplication 类
头文件 声明
NSString.h NSString 和 NSMutableString 类
NSLock.h NSLocking 协议和 NSLock, NSConditionLock, NSRecursiveLock 类
头文件 框架
Foundation.h Foundation.framework

方法命名

一般性规则

为方法命名时,请考虑如下一些一般性规则:

代码 点评
- (NSSize)cellSize;
- (NSSize)calcCellSize;
- (NSSize)getCellSize;
代码 点评
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
代码 点评
- (id)viewWithTag:(int)aTag;
- (id)taggedView:(int)aTag;
代码 所在类
- (id)initWithFrame:(NSRect)frameRect; NSView
- (id)initWithFrame:(NSRect)frameRect mode:(ind)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide; NSMatrix - NSView的子类
代码 点评
- (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes;
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;

虽然上面的例子中使用 and 看起来也不错,但当你的方法有许多参数时,就会显得有些繁琐累赘不够简洁。

代码 点评
- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag; NSWorkspace

访问方法

访问方法是对象属性的读取与设置方法。其命名有特定的格式,依赖于属性描述的内容。

代码 点评
- (void)setAcceptsGlyphInfo:(BOOL)flag;
- (BOOL)acceptsGlyphInfo;
- (void)setGlyphInfoAccepted:(BOOL)flag;
- (BOOL)glyphInfoAccepted;
代码 点评
- (void)setCanHide:(BOOL)flag;
- (BOOL)canHide;
- (void)setShouldCloseDocument:(BOOL)flag;
- (void)shouldCloseDocument;
- (void)setDoseAcceptGlyphInfo:(BOOL)flag;
- (BOOL)doseAcceptGlyphInfo;
代码 点评
- (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase; NSBezierPath

像上面这样的方法,在其实现里应允许接受 NULL 作为其 in/out 参数,以表示调用者对一个或多个返回值不感兴趣。

委托方法

委托方法是那些在特定事件发生时可被对象调用,并声明在对象的委托类中的方法。它们有独特的命名约定,这些命名约定同样也适用于对象的数据源方法。

集合方法

管理对象(集合中的对象被称之为元素)的集合类,约定要具备如下形式的方法:

- (void)addElement:(elementType)anObj;
- (void)removeElement:(elementType)anObj;
- (NSArray *)elements;

例如:

- (void)addLayoutManager:(NSLayoutManager *)anObj;
- (void)removeLayoutManager:(NSLayoutManager *)anObj;
- (NSArray *)layoutManagers;

集合方法命名有如下一些限制和约定:

集合方法的实现要考虑如下细节:

通常你不会直接调用 setTextStorage: ,而是覆写它。

另一个关于集合约定的例子来自 NSWindow 类:

- (void)addChildWindow:(NSWindow *)childWin ordered:(NSWindowOrderingMode)place;
- (void)removeChildWindow:(NSWindow *)childWin;
- (NSArray *)childWindows;
- (NSWindow *)parentWindow;
- (void)setParentWindow:(NSWindow *)window;

方法参数

命名方法参数时要考虑如下规则:

按照 Cocoa 惯例,以下关键字与参数联合使用:

…action:(SEL)aSelector
…alignment:(int)mode
…atIndex:(int)index
…content:(NSRect)aRect
…doubleValue:(double)aDouble
…floatValue:(float)aFloat
…font:(NSFont *)fontObj
…frame:(NSRect)frameRect
…intValue:(int)anInt
…keyEquivalent:(NSString *)charCode
…length:(int)numBytes
…point:(NSPoint)aPoint
…stringValue:(NSString *)aString
…tag:(int)anInt
…target:(id)anObject
…title:(NSString *)aString

私有方法

大多数情况下,私有方法命名与公共方法命名约定相同,但通常我们约定给私有方法添加前缀,以便与公共方法区分开来。即使这样,私有方法的名称很容易 导致特别的问题。当你设计一个继承自 Cocoa framework 某个类的子类时,你无法知道你的私有方法是否不小心覆盖了框架中基类的同名方法。

Cocoa framework 的私有方法名称通常以下划线作为前缀(如: _fooData ),以标示其私有含义。基于这样的事实,遵循以下两条建议:

尽管为私有方法名称添加前缀的建议与前面类中方法命名的约定冲突,但这里的意图与之有所不同:为了防止不小心地覆盖了基类中的私有方法。

函数命名

Objective-C 允许通过函数( C 形式的函数)描述行为,就如成员方法一样。

函数命名应该遵循如下几条规则:

查询属性的函数有个更多的规则要遵循:

实例变量与数据类型命名

这一节描述实例变量、常量、异常以及通知的命名约定。

实例变量

在为类添加实例变量要注意如下几点:

如果实例变量设计为可被访问的,确保编写了访问方法。

枚举常量

const 常量

字符串常量

其他常量

实际的字符串值在实现文件中赋予。(注意: APPKIT_EXTERN 宏等价于 Objective-C 中 extern 。)

异常与通知

异常与通知的命名遵循相似的规则,但是它们有各自推荐的使用模式。

异常

虽然你可以基于任何目的而使用异常(由 NSException 类及相关类实现),但 Cocoa 通常不使用异常来处理常规的,可预料的错误。在这些情形下,使用诸如 nil/NULL/NO 或错误代码之类的返回值。异常的典型应用是类似数组越界之类的编程错误。

异常由具有如下形式的全局 NSString 对象标识:

[Prefix] + UniquePartOfName + Exception

UniquePartOfName 部分是由连续的首字符大写的单词组成。例如:

NSColorListIOException
NSColorListNotEditableException
NSDraggingException
NSFontUnavailableException
NSIllegalSelectorException

通知

如果一个类有委托,那它的大部分通知可能由其委托的委托方法来处理。这些通知的名称应该能够反应其响应的委托方法。比如,当应用程序提交 NSApplicationDidBecomeActiveNotification 通知时,全局 NSApplication 对象的委托对象会注册对该通知的处理,从而能够接收 applicaitonDidBecomeActive: 消息。

通知由具有如下形式的全局 NSString 对象标识:

[相关联类的名称] + [Did 或 Will] + [UniquePartOfName] + Notification

例如:

NSApplicationDidBecomeActiveNotification
NSWindowDidMiniaturizeNotification
NSTextViewDidChangeSelectionNotification
NSColorPanelColorDidChangeNotification

可接受的缩略名

在设计编程接口时,通常名称不要缩写。然而,下面列出的缩写要么是固定下来的,要么是过去被广泛使用的,所以你可以继续使用。关于缩写有一些额外的注意事项:

常见的缩写

缩写 含义
alloc Allocate
app Application
calc Calculate
dealloc Deallocate
dict Dictionary
err Error
func Function
horiz Horizontal
info Information
init Initialize
max Maximum
msg Message
nib Interface Builder archive
pboard Pasteboard
rect Rectangle
ret Return
temp Temporary
vert Vertical

常见的略写

ASCIIPDFXMLHTMLURLRTFHTTPTIFF
JPGGIFLZWROMRGBCMYKMIDIFTP

编码

花括号的使用

空格的使用

空行的使用

缩进的使用

折行的使用

注释

文档注释

xcode中可以使用扩展插件 VVDocumenter 自动生成文档注释,只需要在生成注释的地方按三个斜杠///

下载编译后会自动安装为xcode的插件,重启xcode后可以看到 Window->VVDocumenter 的配置菜单

在需要生成注释的地方按三个斜杠///,会自动生成文档注释

代码注释

约定俗成的习惯

成员变量定义

属性定义

比较操作

如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!

读者有什么想看的相关技术篇章,欢迎评论留言!

QQ交流群:908058499

上一篇下一篇

猜你喜欢

热点阅读