美文网首页
命名规范

命名规范

作者: SunshineBrother | 来源:发表于2020-04-02 20:02 被阅读0次

1、条件表达式

  • 1、当有条件过多、过长的时候需要换行,为了代码看起来整齐些
//good
if (condition1() && 
    condition2() && 
    condition3() && 
    condition4()) {
    // Do something
    }
//bad
if (condition1() && condition2() && condition3() && condition4()) { // Do something }
  • 2、在一个代码块里面有个可能的情况时善于使用 return 来结束异常的情况。
- (void)doHomework
{
    if (self.hungry) {
        return;
    }
 
    ...
}
  • 3、每个分支的实现都必须使用 {} 包含。
// bad
if (self.hungry) self.eat() 
// good
if (self.hungry) {
    self.eat()
}
  • 4、条件判断的时候应该是变量在左,条件在右。
if ( currentCursor == 2 ) { //... }
  • 5、switch 语句后面的每个分支都需要用大括号括起来。

2、类名

  • 1、大写驼峰式命名。每个单词首字母大写。比如「申请记录控制器」ApplyRecordsViewController

  • 2、每个类型的命名以该类型结尾。

    • ViewController:使用 ViewController 结尾。例子:ApplyRecordsViewController
    • View:使用 View 结尾。例子:分界线:boundaryView
    • NSArray:使用 s 结尾。比如商品分类数据源。categories
    • UITableViewCell:使用 Cell 结尾。比如 MyProfileCell
    • Protocol:使用 Delegate 或者 Datasource 结尾。比如 XQScanViewDelegate
    • Tool:工具类
    • 代理类:Delegate
    • Service 类:Service

3、枚举

枚举的命名和类的命名相近。

typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {
    UIControlContentVerticalAlignmentCenter  = 0,
    UIControlContentVerticalAlignmentTop     = 1,
    UIControlContentVerticalAlignmentBottom  = 2,
    UIControlContentVerticalAlignmentFill    = 3,
};

4、宏

  • 1、全部大写,单词与单词之间用 _连接。
  • 2、以 K 开头。后面遵循大写驼峰命名。「不带参数」
#define HOME_PAGE_DID_SCROLL @"com.xq.home.page.tableview.did.scroll"
#define KHomePageDidScroll @"com.xq.home.page.tableview.did.scroll"

5、属性

书写规则,基本上就是 @property 之后空一格,括号,里面的 线程修饰词、内存修饰词、读写修饰词,空一格 类 对象名称 根据不同的场景选择合适的修饰符。

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, assign, readonly) BOOL loading;   
@property (nonatomic, weak) id<#delegate#> delegate;
@property (nonatomic, copy) <#returnType#> (^<#Block#>)(<#parType#>);

6、私有变量

推荐以 _开头,写在 .m 文件中。例如 NSString * _somePrivateVariable

7、代理方法

  • 1、类的实例必须作为方法的参数之一。
  • 2、对于一些连续的状态的,可以加一些 will(将要)、did(已经)
  • 3、以类的名称开头
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

8、方法

  • 1、方法与方法之间间隔一行
  • 2、大量的方法尽量要以组的形式放在一起,比如生命周期函数、公有方法、私有方法、setter && getter、代理方法..
  • 3、方法最后面的括号需要另起一行。遵循 Apple 的规范
  • 4、对于其他场景的括号,括号不需要单独换行。比如 if 后面的括号。
  • 5、如果方法参数过多过长,建议多行书写。用冒号进行对齐。
  • 6、一个方法内的代码最好保持在50行以内,一般经验来看如果一个方法里面的代码行数过多,代码的阅读体验就很差(别问为什么,做过重构代码行数很长的人都有类似的心情)
  • 7、一个函数只做一个事情,做到单一原则。所有的类、方法设计好后就可以类似搭积木一样实现一个系统。
  • 8、对于有返回值的函数,且函数内有分支情况。确保每个分支都有返回值
  • 9、函数如果有多个参数,外部传入的参数需要检验参数的非空、数据类型的合法性,参数错误做一些措施:立即返回、断言。
  • 10、多个函数如果有逻辑重复的代码,建议将重复的部分抽取出来,成为独立的函数进行调用
- (instancetype)init
{
    self = [super init];
    if (self) {

    }
    return self;
}

- (void)doHomework:(NSString *)name
            period:(NSInteger)second
            score:(NSInteger)score;
  • 11、方法如果有多个参数的情况下需要注意是否需要介词和连词。很多时候在不知道如何抉择测时候思考下苹果的一些 API 的方法命名。
//good
- (instancetype)initWithAge:(NSInteger)age name:(NSString *)name;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;


//bad
- (instancetype)initWithAge:(NSInteger)age andName:(NSString *)name;

- (void)tableView:(UITableView *)tableView :(NSIndexPath *)indexPath;
  • 12、方法组之间也有个顺序问题。
    • 1、在生命周期的方法里面,比如 viewDidLoad 里面只做界面的添加,而不是做界面的初始化
    • 2、不要在除了getter之外的结构中设置view基本坐标、属性等。getter方法中不要添加比较重要重要的业务逻辑,重要的业务逻辑应该单独拿出来,放在对应的pragra mark 下,否则对于代码的阅读者来说,比较难以定位逻辑的入口位置。实际开发中遇到过多次这样的情况,焦头烂额的寻找关键逻辑入口处,纵里寻她千百度,结果它却躺在 getter方法中。
    • 3、在viewDidAppear里面做Notification的监听之类的事情
    • 4、每一个代理方法都对应上相应的协议,否则后期随着代码量的增加,很难找出某一代理方法对应的协议,不利于代码的可读性。
    • 5、getter 和setter 方法写在代码的最后面。
    • 6、UI布局可以说比较重要,也可以说不重要。重要是因为一个新手接手新项目,如果对布局还没有了解,业务逻辑便无从谈起;UI布局不重要是因为只要相关控件封装的足够好,页面UI布局通常会很简单;因为UI布局比较重要,所以笔者将它放在固定位置(setter&getter上面),因为UI布局通常比较简单,所以将其放在代码中比较靠后的位置。
#pragra mark - life cycle 

#pragra mark - notification 

#pragra mark - action 

#pragra mark - UITableViewDelegate
.....总之这里是各种代理就对了

#pragra mark - UI
- (void)loadView;

#pragra mark - setter & getter

9、图片资源

  • 1、单个文件的命名
    文件资源的命名也需要一定的规范,形式为:功能模块名_类别_功能_状态@nx.png
    Setting_Button_search_selected@2x.png、Setting_Button_search_selected@3x.png
  • 2、资源的文件夹命名 最好也参考 App 按照功能模块建立对应的实体文件夹目录,最后到对应的目录下添加相应的资源文件。

10、版本规范

采用 A.B.C 三位数字命名,比如:1.0.2,当有更新的情况下按照下面的依据

版本号 右说明对齐标题 示例
A.b.c 属于重大内容的更新 1.0.2 -> 2.0.0
a.B.c 属于小部分内容的更新 1.0.2 -> 1.1.1
a.b.C 属于补丁更新 1.0.2 -> 1.0.3

11、用名字表达代码含义

一些比较有表达力的单词:

单词 可替代单词
send deliver、dispatch、announce、distribute、route
find search、extract、locate、recover
start launch、create、begin、open
make create、set up、build、generate、compose、add、new

使用 i、j、k 作为循环迭代器的名字过于简单,user_i、member_i 这种名字会更有表达力。因为循环层次越多,代码越难理解,有表达力的迭代器名字可读性会更高。

为名字添加形容词等信息能让名字更具有表达力,但是名字也会变长。名字长短的准则是:作用域越大,名字越长。因此只有在短作用域才能使用一些简单名字。

12、名字不能带来歧义

起完名字要思考一下别人会对这个名字有何解读,会不会误解了原本想表达的含义。

  • 布尔相关的命名加上 is、can、should、has 等前缀。
  • 用 min、max 表示数量范围;
  • 用 first、last 表示访问空间的包含范围;
  • begin、end 表示访问空间的排除范围,即 end 不包含尾部

13、良好的代码风格

适当的空行和缩进。
排列整齐的注释:

int a = 1;   // 注释
int b = 11;  // 注释
int c = 111; // 注释

14、编写注释

阅读代码首先会注意到注释,如果注释没太大作用,那么就会浪费代码阅读的时间。那些能直接看出含义的代码不需要写注释,特别是并不需要为每个方法都加上注释,比如那些简单的 getter 和 setter 方法,为这些方法写注释反而让代码可读性更差。

不能因为有注释就随便起个名字,而是争取起个好名字而不写注释。

可以用注释来记录采用当前解决办法的思考过程,从而让读者更容易理解代码。

注释用来提醒一些特殊情况。

用 TODO 等做标记:

标记 用法
TODO 待做
FIXME 待修复
HACK 粗糙的解决方案
XXX 危险!这里有重要的问题

15、版本号

我们都知道版本号是x.x.x这样的。关于它的命名规则,这里有篇简单的文章可以浏览一下版本号命名规范及原则,大致意思就是:

  • 第一个数代表一些比较大的变动,比如全新的UI界面之类。
  • 第二个数代表一些功能的新增或变化。
  • 第三个数则代表一些bug的修复了,它往往很频繁。

相关文章

  • 适合各厂使用的 MySQL 团队开发规范,太详细了,建议收藏!

    数据库对象命名规范 数据库对象 数据库对象全局命名规范 数据库命名规范 表命名规范 字段命名规范 索引命名规范 视...

  • 代码书写规范

    res命名规范: src中命名规范: 习惯命名:

  • Android开发中的优化方案

    一、命名规范 代码规范先从命名规范开始,Android的命名规范主要涉及:Java源代码,xml文件,图片资源。 ...

  • Swift--规范编程

    命名规范 注释规范 声明 代码排版 命名规范 常用命名方法 匈牙利命名,一般只是命名变量,原则是: 变量名 = 类...

  • Flutter 代码规范

    命名规范 命名规范中包括了文件以及文件夹的命名规范,常量和变量的命名规范,类的命令规范。Dart 中只包含这三种命...

  • 入门13 CSS综合

    CSS编码规范 命名规范:语义化标签优先;基于功能命名、基于内容命名、基于表现命名;简略、明了、无后患 书写规范:...

  • 规范文档

    1.命名规范2.注释规范3.代码规范4.目录规范 1.命名规范 通用规范通用规范是在整个项目中,所有的命名都需要遵...

  • 内部前端规范v1.0

    项目目录结构规范 请查看 项目目录结构规范 HTML 命名规范 class 命名实行 BEM命名方式。关于BEM,...

  • [知识点滴]Div+CSS命名规范大全

    Div+CSS命名规范(前端web开发命名规范)Div+CSS命名规范(一)窗体头:header内容:conten...

  • 2018-06-28 python命名规范

    Python命名规范 Google Python****命名规范 module_name, 模块 package...

网友评论

      本文标题:命名规范

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