代码规范

2016-12-14  本文已影响51人  MR_詹

文章内容都是在其他博客中东摘西取整理的,如有雷同,请多多见谅!!


命名原则

1.一般性原则:可读性高(简洁且清晰)和防止命名冲突(通过加前缀后缀来保证)。  Objective-C 的命名通常都比较长, 名称遵循驼峰式命名法. 一个好的命名标准很简单, 就是做到在开发者一看到名字时, 就能够懂得它的含义和使用方法. 另外, 每个模块都要加上自己的前缀, 前缀在编程接口中非常重要, 可以区分软件的功能范畴并防止不同文件或者类之间命名发生冲突, 比如相册模块(PhotoGallery)的代码都以PG作为前缀: PGAlbumViewController

Paste_Image.png

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

Paste_Image.png
一、图片命名

命名规则的基本思想是把文件名分成三部分:第一部分是图片的逻辑归属分类,第二部分是图片的表现内容,第三部分是图片的内容的类型,有些图片还会有第四部分,表示图片表现的状态。基本规则:

用英文命名,不用拼音
每一部分用下划线分隔
图片名中两倍图在名字最后要加@2x,三倍图在名字最后要加@3x

Paste_Image.png
二、类的命名

类名(以及类别、协议名)应首字母大写,并以驼峰格式分割单词。

1.类的前缀
1)所有类名、枚举、结构、protocol定义时最好加一个统一的标示符,可以是项目缩写,或者个人项目的名称缩写,例如都加上全大写的Hoo(我的姓氏)作为前缀
2)根据功能模块可以在给功能模块的类添加功能模块的名称前缀,如用户中心的profileViewController.可以命名为HooUCProfileViewController.
2.类的后缀
所有protocol定义时,都加上后缀Delegate 。如,HooRefreshViewDelegate,表示RefreshView的协议;
所有的控制器都加上Controller,所有的通知名都加上Notification。

三、类别命名

类名+标识+扩展(UIImageView +HP+Web)
例:如果我们想要创建一个基于UIImageView 的类别用于网络请求图片,我们应该把类别放到名字是UIImageView+HPWeb.h的文件里。UIImageView为要扩展的类名,HP为专属标识,Web为扩展的功能。

四、方法命名

方法名应遵守小驼峰原则,首字母小写,其他单词首字母大写,每个空格分割的名称以动词开头。执行性的方法应该以动词开头,小写字母开头,返回性的方法应该以返回的内容开头,但之前不要加get。如:

- (void)insertModel:(id)model atIndex:(NSUInteger)atIndex;
- (instancetype)arrayWithArray:(NSArray *)array;

代理方法以发送代理的对象类名作为代理方法名的开始(去掉类名的前缀,并且小写开头)

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
五、枚举的命名

正宗的iOS开发者当然要以Objective-C的方式命名枚举,如:

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};
六、属性、变量名命名

变量名使用小驼峰法, 使变量名尽量可以推测其用途,属性具有描述性。别一心想着少打几个字母,让你的代码可以迅速被理解更加重要。每个属性命名都加上类型后缀,如,按钮就加上Button后缀,模型就加上Model后缀。

@property (nonatomic, strong) UIButton *submitButton;

1)类成员变量名
  成员变量用小驼峰法命名并前缀下划线,如:

UIButton *_submitButton;

2)局部变量名  遵守小驼峰命名规则,如:

NSInteger numCompletedConnections =3;
七、const 常量

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

const float kMaxHeigt = 100.0f;

如果是特殊含义的常量也建议加上后缀,如通知加上Notification为后缀,如:

extern Nsstring * Const kLoginSuccessNotification

======================20170122补充======================

命名的三个原则:表现力、清晰、无歧义

Tip1:什么时候需要在声明变量的时候指明类型?

原则是,如果在现实世界中显而易见的,并且不容易产生歧义的,我们不需要声明类型。

NSString       * accountName;
NSMutableArray * mailboxes;
NSArray        * defaultHeaders;
BOOL             isOpen;

凡是容易产生歧义的,必须指明类型。

UIImage        *avatarImage;  
UIImageView    *avatarImageView;  
NSURL          *avatarURL;
Tip2:带有返回值的方法我们应当如何命名?

规则如下。

[object/class thing+condition];
[object/class thing+input:input];
[object/class thing+identifer:input];
realPath    = [path     stringByExpandingTildeInPath];
fullString  = [string   stringByAppendingString:@"Extra Text"];
object      = [array    objectAtIndex:3];

上述的三个句子string + ByExpandingTildeInPath,string规定了返回值的类型,也就是thing, ByExpandingTildeInPath规定了条件。

Tip3:如何避免歧义?
- (void)sortInfo
- (void)refreshTimer
- (void)update
- (void)fetchInfo:

sortInfo 你究竟是想对Info这个东西进行排序呢?还是想返回排序信息?
refreshTimer 究竟是想返回一个刷新时间还是执行一个刷新操作?
update 想更新什么?
fetchInfo 是想执行获取信息的操作还是返回fetch的信息?
如何更改?

- (void)currentSortInfo        
- (void)refreshDefaultTimer   
- (void)updateMenuItemTitle   
- (void)infoForFetch:

current作为形容词指明了sortInfo是一个名词,所以很明显是返回当前的排序信息。
有了Default那么refresh理所当然的是一个动词,用来表明这是一次刷新操作
指明了需要更新的对象
指明了info的意思,是关于Fetch操作的。

案例一:变量的命名
//材料 UILabel* shicaiLB; // UIImageView* foodImageV; /*步骤*/ //图标 // UIImageView * imageTB; UILabel * setpLB; //横线 UIView * lineV; //步骤简介 UITextView * textLb; //图片 // UIImageView * imageView; UIImageView * imageEND; //小贴士 UITextView * stsLb;

上面的命名几乎全部违反了命名的第二条准则。Clear.
第一行注释写的是材料。UILabel* shicaiLB
如果是食物的材料,那么实际上应该是 ingredient 这个单词。LB 这个缩写我估计是 label 的意思。那么实际上正确的命名应该是UILabel *ingredientLabel

第二条,步骤。 UILabel *setpLB
 ,基本的拼写错误。步骤 = step那么正确写法应该是: stepLabel
 .实际上这样写还是有问题的,到底是什么东西的步骤。前面应当继续加一个形容词。比如cookingStepLabel
.

第三条,横线。这个注释首先有问题。
横线到底是 cell 的分割线?还是 view 和 view 之间的分割线?这个分割线到底有什么特点?作用是什么?
我们完全无法从命名中获知.

第四条,步骤简介.UITextView *textLB
.这个完全不知道在写什么.按照注释的意思,应该是stepSummaryTextView
.

第五条,注释是图片......我在后续代码中发现这个变量并没有被用到.

第六条, 小贴士. UITextView * stsLb;
 按照他之前的命名逻辑, LB应该是等同于Label的意思,那么这时候又用LB作为限定词给TextView命名,上下逻辑混乱.错上加错了.推荐cookingTipsTextView
.```

######案例二:代理方法的命名

//点击scrollView中的图片点击事件协议@protocol ValueClickDelegate <NSObject>-(void)ADbuttonClick:(NSInteger)vid;@end

代理方法有着非常严格的命名规范.
要以发出信息的类命作为开始.例如

是以tableView作为开头的.因为这个代理方法是由tableView发出的.
如果代理方法的参数只有一个并且是发出者本身.那么需要指明代理方法的意图.例如

用 did
或者 will
用来说明事件发生的状态,例如

上述这个代理方法主要是为了响应点击图片之后的行为.所以应当写为.


######案例三:图片资源的命名
![](https://img.haomeiwen.com/i1923392/fdf0988dbd005263.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

图片文件的命名通用的方法有两种。
与声明变量类似,都采用驼峰命名法。
全部小写,单词与单词之间采用_
链接。 .e.g.login_button_icon
.

我比较建议第二种,因为如果采用第一种有时候会与变量名混淆。
那么,按照第二种命名方式。这三张图片资源的命名应该是。
homepage_topright_pop_4;
homepage_topright_pop_5;
homepage_topright_pop_6


#######案例四:方法的命名

方法命名的原则:命名需要清楚的指明方法的用途,参数的意义。
我们常常碰到一个方法含有多个参数的情况,如何链接这些参数呢?
如果方法的参数都是 receiver 的属性,那么参数之间的链接不可以使用 and

错误的做法。

如果你的方法里的参数来自截然不同的行为,那么可以用 and
活着 with
来链接。

看看案例
//创建目录文件夹+(NSString *)CreateList:(NSString *)List ListName:(NSString *)Name;//写入NsArray文件+(BOOL)WriteFileArray:(NSArray *)ArrarObject SpecifiedFile:(NSString *)path;

首字母应当小写。改完之后是

(NSString *)createList:(NSString *)list listName:(NSString *)name;

createList 和后面的第二个参数 listName ,两个参数都含有list这个名字,那么到底哪个参数才是list的名字?
经过我看.m文件的实现,才知道,第一个list是上一级目录的名字,而第二个参数才是真正的listName,那么需要把方法改成。+ (NSString *)createList:(NSString *)listName parentDirectory:(NSString *)directoryName;


参考文章:
[jackiehoo ](http://www.jianshu.com/users/902105722a5a)
上一篇下一篇

猜你喜欢

热点阅读