object- c 编码规范与指导

object-c 编码规范与指导

文档版本

版本号 修改时间 修改内容 修改人

概述

对于任何工程项目来说,统一的施工标准都是保证工程质量的重要因素。堪称当今人类最抽象、最复杂的工程—软件工程,自然更加不能例外。高品质、易维护的软件开发离不开清晰严格的编码规范。本文档详细描述object-C软件开发过程中的编码规范。本规范也适用于所有在文档中出现的源码。

文件结构

所有iphone的源文件均必须包含一个规范的说明,说明包含了该文件的名称、功能概述、作者、版权和版本历史信息等内容。文件头和函数的说明的格式为:

1.文件头说明

/*fileName
======================================================================
模块名 :<模块名称>
文件名 :<文件名>
实现功能:<描述该文件实现的主要功能> 
作者  :<作者部门和姓名>
版本  :<当前版本号>
创建日期:
备注  :<其它说明>
修改日期:<日期格式:yyyy-mm-dd>
修改人 :<修改人>
修改内容:<修改内容>
======================================================================
fileName*/

2.方法说明

/**
 *  <#Description#>
 *
 *  @param task    <#task description#>
 *  @param arrange <#arrange description#>
 *
 *  @created by 谢躜 on 2015-01-21 09:30:19
 */

3.头文件的引用说明

在h文件中引用其他类用@class fileName
在m文件中引用其他类都用#import “fileName.h

4.文件的组织结构

文档结构 .png

参考 coding ios 客户端源码规范

    ├── Coding_iOS
    │   ├── Models:数据类
    │   ├── Views:视图类
    │   │   ├── CCell:所有的CollectionViewCell都在这里
    │   │   ├── Cell:所有的TableViewCell都在这里
    │   │   └── XXX:ListView(项目、动态、任务、讨论、文档、代码)和InputView(用于聊天和评论的输入框)
    │   ├── Controllers:控制器,对应app中的各个页面
    │   │   ├── Login:登录页面
    │   │   ├── RootControllers:登录后的根页面
    │   │   ├── MeSetting:设置信息页面
    │   │   └── XXX:其它页面
    │   ├── Images:app中用到的所有的图片都在这里
    │   ├── Resources:资源文件
    │   ├── Util:一些常用控件和Category、Manager之类
    │   │   ├── Common
    │   │   ├── Manager
    │   │   ├── OC_Category
    │   │   └── ObjcRuntime
    │   └── Vendor:用到的一些第三方类库,一般都有改动
    │       ├── AFNetworking
    │       ├── AGEmojiKeyboard
    │       ├── ASProgressPopUpView
    │       ├── ActionSheetPicker
    │       ├── FontAwesome+iOS
    │       ├── MJPhotoBrowser
    │       ├── MLEmojiLabel
    │       ├── NSDate+Helper
    │       ├── NSStringEmojize
    │       ├── PPiAwesomeButton
    │       ├── QBImagePickerController
    │       ├── RDVTabBarController
    │       ├── SMPageControl
    │       ├── SVPullToRefresh
    │       ├── SWTableViewCell
    │       ├── UMENG
    │       ├── UMessage_Sdk_1.1.0
    │       ├── XGPush
    │       ├── XTSegmentControl
    │       └── iCarousel
    └── Pods:项目使用了[CocoaPods](http://code4app.com/article/cocoapods-install-usage)这个类库管理工具

命名规则

如果想要有效的管理一个稍微复杂一点的体系,针对其中事物的一套统一、带层次结构、清晰明了的命名准则就是必不可少而且非常好用的工具。
活跃在生物学、化学、军队、监狱、黑社会、恐怖组织等各个领域内的大量有识先辈们都曾经无数次地以实际行动证明了以上公理的正确性。除了上帝(设它可以改变世间万物的秩序)以外,相信没人有实力对它不屑一顾。
在软件开发这一高度抽象而且十分复杂的活动中,命名规则的重要性更显得尤为突出。一套定义良好并且完整的、在整个项目中统一使用的命名规范将大大提升源代码的可读性和软件的可维护性。
在引入细节之前,先说明一下命名规范的整体原则:

  • 同一性:
    在编写一个子模块或派生类的时候,要遵循其基类或整体模块的命名风格,保持命名风格在整个模块中的同一性。
  • 标识符组成:
    标识符采用英文单词或其组合,应当直观且可以拼读,可望文知意,用词应当准确。
  • 最小化长度和最大化信息量原则:
    在保持一个标识符意思明确的同时,应当尽量缩短其长度。
  • 避免过于相似:
    不要出现仅靠大小写区分的相似的标识符,例如iIfunctionFunction等等。
  • 避免在不同级别的作用域中重名:
    程序中不要出现名字完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但容易使人误解。
  • 正确命名具有互斥意义的标识符:
    用正确的反义词组命名具有互斥意义的标识符,如: minValueIntegermaxValueIntegergetName()setName()

5. h,m,nib文件名命名

除了异常类等个别情况(不希望被用户看作一个普通的、正常的类之情况)外,iphone的h,m,nib文件名命名应该遵循以下准则:

(1) h,m,nib文件名命名的名称都要以大写字母开头;

(2) 如果是一般的视图控制器,则后面加上ViewController,即h,m,nib文件名的名称仿效分别为:

***ViewController.h
***ViewController.m
***ViewController.xib

(3)如果是自定义的视图类,则后面加上对应的类型,

UITableViewCell 简写为 Cell,UICollectionViewCell 简写为CCell

h,m,nib文件名的名称仿效分别为:


***View.h、
***View.m、
***View.xib;

***Cell.h、
***Cell.m、
***Cell.xib;

***CCell.h、
***CCell.m、
***CCell.xib;

6. 变量

(1)所有变量名命名的名称都要以小写字母开头。

(2)类中定义变量名称:其主要格式为***+对象类所在的名称,如给UITextFiled命名,则要写成***TextField、如valueTextFiledtitleTextField等,相应的UILabel的命名有valueLabeltitleLabel等,UITableView则要写成valueTableView等。其规则也同样适用于NSArray、NSMutableDictonary等所有类型;
另外,如果当前变量是自己类中使用,则要在后面加上下划线,如valueArray_等,而在属性中定义时用valueArray。

(3)全局变量全部以单词_global开头,以类型结尾,如_global***TextField_global***String等。

(4)成员变量。在变量前面加上下划线_

   UIButon * _cancelButton;

(5)其中NSMutaleArray、NSMutableDictonary与NSArray、NSDictonary的结尾相同,分别为Array及Dict,不做区分。

7. 方法

(1)所有方法名命名的名称都要以小写字母开头,要求语义完整清晰,不要乱用简写。

(2) 在ViewController中,一个控件可能有多个事件 如果是事件的名称,则要先以对象名称加上对象的事件,如

UIButton *nameButton;

#program mark - Event
//默认情况下 EventTouchUpInside 我们简写成 Pressed
- (IBAction) nameButtonPressed:(id)sender;
//EventTouchDown
- (IBAction) nameButtonTouchDown:(id)sender;

(3) Action。 如果是在一个视图类中,一个控件的事件相对于这个视图类来说只是视图类的一个事件,则不需要以控件对像名称加上对像事件命名。 而是根据视图类来命名。

@interface AbstractActionSheetPicker : NSObject
@end


UIBarButtonItem *sysDoneButton = [self createButtonWithType:UIBarButtonSystemItemDone target:self
                                                             action:@selector(actionPickerDone:)];
                                                             
                                                             
UIBarButtonItem *sysCancelButton = [self createButtonWithType:UIBarButtonSystemItemCancel target:self
                                                               action:@selector(actionPickerCancel:)];
                                                             

- (IBAction)actionPickerDone:(id)sender
{

}

- (IBAction)actionPickerCancel:(id)sender
{

}



8. 宏

宏全部用大写,并且用必要的下划线分开,如

#define NAME_VALUE  @"dddd"
#define MAXSIZE     30

9. 常量

常量用字母 k 开头, 如

static const NSUInteger kUsernameRow = 0;

10. 代码风格

代码风格与版式代码风格的重要性怎么强调都不过分。一段稍长一点的无格式代码基本上就是不可读的。 先来看一下这方面的整体原则:

  • 空行的使用
    空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。 这里不做规定,视自己的风格而定
  • 语句与代码行
    一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
    “if”、“for”、“while”、“try”、“catch”等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 “{ }” 。这样可以防止书写和修改代码时出现失误。
  • 缩进和对齐
    程序的分界符 “{” 和 “}” 的格式如下所示:
while(1){
    //statement
    for(int i=0;i<=n;i++){
        //statement
    }
}

以上风格是约定风格,而下面风格则不提倡。

while(1)
{
    //statement
    for(int i=0;i<=n;i++)
    {
        //statement
    }
}

“{ }” 之内的代码块在 “{” 右边一个制表符(4个半角空格符,直接按键盘上的Tab键来进行控制)处左对齐。

  • 最大长度
    代码行最大长度宜控制在80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。不过此规则可以视情况适当放宽。

  • 空格的使用
    关键字之后要留空格。象NSInteger等关键字之后至少要留一个空格;
    其余的不做要求,如for语句里面的几条语句、&&、||等。

  • 修饰符的位置
    为便于理解,应当将修饰符 “*” 和 “&” 紧靠变量,例如NSString *testStringNSArray *testArray

  • 注释
    注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。
    边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
    注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。
    当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。对于业务逻辑,常用的枚举数据,或者代码对应的参数一定要有说明,如


/**
 *  设置类型
 *
 *  @param type  类型 0 公有,1 私有
 *
 *  @created by 谢躜 on 2015-01-21 18:47:24
 */
- (void)setType:(NSInteger)type
{
    if(0 == type){
        //当类型为公有的时候
        ...
    }else if (1 == type){
        //当类型为私有的时候
        ...
    }
}


11. h文件组织

类 interface h文件中分别依次列出属性方法


#import <UIKit/UIKit.h>

@interface DateilViewController : UIViewController
{
    //变量
    NSString *_dataString;
}


//属性
@property (nonatomic, strong) NSDictionary *supplyDateilDict;
@property (nonatomic, strong) NSMutableArray *supplyArray;

//方法
- (void)handleData;
- (void)createView;


@end

协议 protocol ,依次列出 @required,@optional

@protocol UITableViewDataSource<NSObject>

@required

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

@optional

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;

// Editing

// Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

// Moving/reordering

// Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath:
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

// Index

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;                                                    // return list of section titles to display in section index view (e.g. "ABCD...Z#")
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;  // tell table which section corresponds to section title/index (e.g. "B",1))

// Data manipulation - insert and delete support

// After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change
// Not called for edit actions using UITableViewRowAction - the action's handler will be invoked instead
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

// Data manipulation - reorder / moving support

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

@end

12. m文件组织

ViewController
/*Class 的生命周期
* Class 生命周期回调方法放在最前面
*/
#pragma mark - Lifecircle

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{  
}

- (void)viewDidLoad
{  
}

- (void)viewWillAppear:(BOOL)animated
{
}

- (void)viewDidDisappear:(BOOL)animated
{
}

- (void)didReceiveMemoryWarning
{
}

- (void)dealloc
{
}

/* 所有的控件事件放在生命周期后面
* 包括 Event ,Action,Notifation
* 如果是相近的方法用program mark 分类。排在一起。 
*/
#pragma mark - Event
- (void)backAction
{
}

- (void)selectTabbarButton:(UIButton *)sender
{
}

+ (void)reachabilityChanged:(NSNotification *)note
{
}

#pragma mark KeyBoardNotify
- (void)keyboardWillChange:(NSNotification *)note
{
}


- (void)keyboardShowNotify:(NSNotification *)note
{
    
}
//键盘隐藏调整界面
- (void)keyboardHideNotify:(NSNotification *)note
{
  
}

/*其它方法分为两部分, 
* 第一部分是数据模型操作相关的方法
* 第二部分为视图,控件相关操作 
*/
#pragma mark - Fouction

#pragma mark - HandleModal
- (void)getSupplyDateilData 
{
}

// 时间转换
- (NSString *)showTimeWithValue:(NSTimeInterval)time 
{   
}



//添加一个安排
- (void)addArrange
{
}


#pragma mark  HandleView
- (void)creatDateilView
{
    
}
// 显示土地信息
- (void)creatDateilInformationView
{
    
}

- (void)createAdvertisementView 
{ 
}

/*
* 其它协议,委托,数据源方法没有固定顺序,用到了就加到后面
*/


#pragma mark -UITableViewDataSource
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  }
  
  
#pragma mark -UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  
}



--

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 关于资源 适用于计算机程序的资源是与程序可执行代码相关的数据文件。资源可以通过将代码之外的复杂数据集或图形内容创建...
    nicedayCoco阅读 626评论 0 0
  • 1 文件与目录 1.1 文件命名 1 文件与目录的命名可以使用的字符为[A-Z, a-z, 0-9, ., _, ...
    rick_2016阅读 11,454评论 0 9
  • iOS编程规范0规范 0.1前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可 测试、高效...
    iOS行者阅读 4,435评论 21 35
  • 1.准备好替代物 当我们想干一些对我们而言不是很好的事情时比如玩手机,吃油炸,玩游戏等,可以马上为自己提供一个代替...
    咿呀作语阅读 186评论 0 1