美文网首页
代码规范

代码规范

作者: MR_詹 | 来源:发表于2016-12-14 14:45 被阅读51次

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


    命名原则

    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

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

    • (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;

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

    • (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;

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

    • (void)browserDidScroll:(NSBrowser *)sender;

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

    • (void)scrollView:(AOScrollerView *)scrollView adButtonDidClick:(UIButton *)button;
    
    ######案例三:图片资源的命名
    ![](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

    • (int)runModalForDirectory:(NSString *)path file:(NSString *) name types:(NSArray *)fileTypes;

    错误的做法。

    • (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;

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

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

    看看案例
    //创建目录文件夹+(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)

    相关文章

      网友评论

          本文标题:代码规范

          本文链接:https://www.haomeiwen.com/subject/zupimttx.html