< 返回首页

标哥的笔记,是记录在日常学习技术和日常开发中那些年遇到过的坑!本站为新站,原"标哥的技术博客"中的文章会慢慢移到本站,欢迎收藏本站!
在使用本站过程中,有任何建议请联系标哥! 另,承接App开发、网站开发和微信小程序开发!欢迎联系我们


iOS代码规范

 作者:标哥    发布日期:2017-01-13 11:40    阅读量:690次
 

命名基础

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

一般性原则

最好是既清晰又简短,但不要为简短⽽而丧失清晰性

代码点评
insertObject:atIndex:Good
insert:at:不清晰;要插⼊什么呢?at又表⽰什么?
removeObjectAtIndex:Good
removeObject:不错,因为⽅法是用来移除作为参数的对象
remove:不清晰;这是要移除什么呢?

名称通常不缩写,即使名称很⻓,也要拼写完全

代码点评
destinationSelectionGood
destSel不清晰
setBackgroundColor:Good
setBkgdColor:不清晰

一致性

尽可能与Cocoa编程接⼝命名保持一致。如果你不太确定某个命名的⼀致性,请浏览头文件或参考文档中的范例,在使⽤多态方法的类中,命名的⼀致性⾮常重要。在不同类中实现相同功能的⽅法应该具有相同的名称。

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

前缀

所有类名、枚举、结构、protocol定义时,都加上全大写的HYB作为前缀

后缀

所有protocol定义时,都加上后缀Delegate。如,HYBRefreshViewDelegate,表示RefreshView的协议。

导入头文件

对于Objective-C的类文件,使用#import导入;对于c,c++文件,使用#include导入

方法命名

方法名首字母小写,其他单词首字母大写,每个空格分割的名称以动词开头。如:

- (void)insertModel:(id)model atIndex:(NSUInteger)atIndex;

属性、变量命名

每个属性命名都加上类型后缀,如,按钮就加上Button后缀,模型就加上Model后缀。比如:

@property (nonatomic, strong) UIButton *submitButton;

对于内部私有变量,也需要加上后缀并以下划线开头,如:_titleLabel_descLabel_okButton

访问方法

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

如果属性是⽤用名词表达的,则命名格式为: 

- (type)noun;
- (void)setNoun:(type)aNoun;


例如: 

- (void)setTitle:(NSString *)aTitle;

如果属性是⽤形容词表达的,则命名格式为: 

- (BOOL)isAdjective;
- (void)setAdjective:(BOOL)isAdjective;


例如: 

- (BOOL)isEditable;
- (void)setEditable:(BOOL)isEditable;

如果属性是⽤用动词表达的,则命名格式为: 

- (BOOL)verbObject; 
- (void)setVerbObject:(BOOL)flag;


例如: 
 - (BOOL)showsAlpha; - (void)setShowsAlpha:(BOOL)flag; 
####动词要用现在时态 

  1. 不要使⽤动词的过去分词形式作形容词使⽤用

  2. 可以使⽤情态动词(canshouldwill等)来提⾼清晰性,但不要使用dodoes

- (BOOL)openFile:(NSString *)fullPath withApplication:
(NSString *)appName andDeactivate:(BOOL)flag;

- (void)setAcceptsGlyphInfo:(BOOL)flag;
// 不好
- (BOOL)acceptsGlyphInfo;

- (void)setGlyphInfoAccepted:(BOOL)flag;
// 不好
- (BOOL)glyphInfoAccepted;

// 好
- (void)setCanHide:(BOOL)flag;
- (BOOL)canHide;
- 
// 好
- (void)setShouldCloseDocument:(BOOL)flag;
// 不好
- (BOOL)shouldCloseDocument;

// 好
- (void)setDoesAcceptGlyphInfo:(BOOL)flag;
- (BOOL)doesAcceptGlyphInfo;

只有在方法需要间接返回多个值的情况下,才使⽤get 像上面这样的方法,在其实现里应允许接受NULL作为其in/out参数,以表示调⽤者对⼀个或多个返回值不感兴趣。

委托方法

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

名称以标示发送消息的对象的类名开头,省略类名的前缀并⼩小写第一个字⺟:

-(BOOL)tableView:(NSTableView*)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString
*)filename;

冒号紧跟在类名之后(随后的那个参数表⽰委派的对象)。该规则不适用于只有一个sender参数的⽅法:


上⾯的那条规则也不适⽤于响应通知的⽅法。在这种情况下,方法的唯⼀参数表⽰通知对象:

- (void)windowDidChangeScreen:(NSNotification *)notification;

⽤于通知委托对象操作即将发生或已经发⽣的方法名中要使⽤didwill,⽤用于询问委托或用did/will,但最好使⽤should,意思更易懂:

- (void)browserDidScroll:(NSBrowser *)sender; 
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;

- (BOOL)windowShouldClose:(id)sender;

枚举常量

声明枚举类型时,命名以HYB为前缀,而枚举值以小写k开头,后面的单词首字母大写,其余小写。如:

typedef NS_ENUM(NSUInteger, HYBContentMode) {
  kContentModeScaleFit = 1 << 1,
  kContentModeScaleFill = 1 << 2
};

const常量

以小写k开头,后面单词首字母大写,其余小写。如:

const float kMaxHeigt = 100.0f;

如果是静态常量,仅限本类内使用的,加上前缀s_,如果是整个工程共用,以sg_为前缀。如:

s_kMaxHeight; sg_kMaxHeight;

其他常量

  • 使用#define声明普通常量,以小写k开头,后面的单词首字母大写,其余小写。如:

#define kScreenWidth ([UIScreen mainScreen].bounds.size.width)
  • 通知常量名,以Notification为后缀,如:

#define kLoginSuccessNotification @”HYBLoginSucessNotification”

代码注释

类注释

类头需要有注释,功能说明,作者等:如,

/**
 *   这里是功能说明
 *
 *  @author Huangyibiao
 *  @modify 如果有修改需要这行,加上修改人和修改日期
 */
@interface HYBUIMaker : NSObject

方法注释

方法注释需要加上作者,功能说明,参数说明,返回值说明:

/**
 *  @author
 *  描述内容
 *
 *  @param string <#string description#>
 *  @param font   <#font description#>
 *
 *  @return <#return value description#>
 */
+ (CGSize)sizeWithString:(NSString*)string andFont:(UIFont *)font;

块注释

对于块注释,有多种多种风格

风格一:
/////////////////////////////////////
// @name UIButton控件生成相关API
/////////////////////////////////////
风格二:
//
// 块功能说明
//

风格三:

/*
* 块功能说明
*
*/

类内分块结构写法

有生命周期的类,从上到下结构为:

#pragma mark – life cycle
#pragma mark – Delegate
#pragma mark – CustomDelegate
#pragma mark – Event
#pragma mark - Network
#pragma mark – Private
#pragma mark – Getter/Setter

参考

本文档参考Coding Guidelines for Cocoa


承接:ThinkPHP项目开发、网站项目开发、微信项目开发、微信小程序项目开发、App开发,欢迎联系标哥QQ632840804