文档章节

我是如何收拾代码的

芳仔小脚丫
 芳仔小脚丫
发布于 2015/05/14 18:16
字数 2068
阅读 5648
收藏 26

注释

虽说好的代码不用注释,但是那得是好的代码..好记性不如烂笔头,好好写注释可以给自己和自己的小伙伴省下很多时间.

注释都是// 或是/* 注释 */ ,这样的通用注释不做多说明,这里介绍一些稍带技巧的注释:

参数的注释

UIButton *btnSend;/**< 发送按钮 */

在调用时可以得到提示,在内容比较多时比较好用,我有时候脑子短路要想好一会才能记得当初定义的变量是做什么用的。

方法的注释

如果你的方法是没有参数的,只需要写一句注释,那只需要在方法前加注释就行了

type 1

/** table 相关设置 */
-(void)configTable{}

type 2(插件:VVDocument)使用此插件可以很便捷的为自己的代码添加注释

/*!
 *  @author joanfen, 15-05-14 12:05:22
 *
 *  @brief  相关设置
 */
-(void)configTable{}

这样的注释 在你调用时会显示你所添加注释,如图


有参数的注释

/*!
 *  @Author joanfen, 15-05-13 14:01:51
 *  @method POST
 *  @see XRClass
 *  @brief  链接解析
 *
 *  @param linkAddressStr 链接地址
 */

大家使用VVDocument 的插件来写注释就对了。这样的注释自己写起来太费事,没有插件我真不愿意写。

方法分区

#pragma mark - <注释,也可不写,没有注释时就只显示一条分割线>
#pragma mark 注释

区别:带 - 的会显示一条分割线

便于简单快速的查找方法

添加提示信息

#error <提示信息>

如果加上这样的错误提示,在 Build 时 XCode 会提示编译错误:

在某部分代码没有完成,而且如果提交会导致问题时可以加上这样的提示信息来提醒自己。

如果你觉得只是想提醒自己来完成,并不需要加上红色的 error 信息,你可以尝试使用

#warning <提示信息>

这样的话在编译时提示信息是这样的

使用场景

在替换某个类时,需要删除原有的代码,再进行替换,每次删除一个我就加一行同样的 warning,最后新的写好之后,搜索这行 waring,将调用方法填充,大大提高效率;

UI 写好了,数据部分还没有好,将逻辑梳理好,方法写好,加上 warning ,包含 deadline,需要完成的工作,在后台数据可测时,再来完成,不写的话有时候真的脑子短路,有时候半天都不记得当时是准备怎么弄的,尤其在开发量大的时候,原谅我是一个容易脑子短路的人,-_-。

使用常量

常见使用宏,const 常量,枚举等来定义常量,避免将一个数字或者是字符串重复写多次,而是定义成常量,便于统一管理,也减少出错的几率

推荐两篇关于常量的博客: 宏定义的黑魔法如何正确定义常量

#define

宏大家应该都不陌生,这里不展开赘述,请看上面的博文,我在去年看了宏定义的黑魔法这篇博文之后,曾经一度超级喜欢用宏,不管是字符串,方法,还是高度,动画时长这一类常量,我都喜欢用宏来定义,直到我看见了后面的如何正确定义常量这篇博客,我才清醒一点。

const 常量

现在使用的多得是 const 常量

在方法体内使用

static const CGFloat KCellHight = 126.f;

在类文件中使用, 在.m 文件中

const CGFloat KXRBtnSendHeight = 44;

如果需要提供给外部使用,使用 extern 修饰:

只需要在.h 中使用 extern 外部声明即可

extern const CGFloat KXRBtnSendHeight;/**< send按钮高度 */

枚举

在判断 table 的 section,row,控件的 tag,或是点击的 index,或是自己定义的 type 时,不要直接使用数字判断,如果类型多,使用枚举,少,可以使用上文中的宏或是const 常量

typedef enum : NSUInteger {
    XRTypeRegular = 10,
    XRTypeSimple = 20,
} XRType;

在判断 type 时,使用这样的语法,这是最基本的,看到直接 == 10这样的代码,没有办法忍

if(type == XRTypeRegular)

使用 Category 或是基类

这个部分不是很好给出代码实例,要实例的话想想当初做各级员工结算工资的课程设计吧,只作简要说明。

在逻辑比较繁杂,某个类代码量非常庞大时,可以考虑使用基类,将公有的属性和方法在基类中实现,自己在使用时只需要关注一些单独的逻辑即可,可以大大提高代码效率。

使用 category 是对某个类进行一些简单的扩展,在 category 中定义的方法等同于类的方法,是一样的,为了让功能划分更纯粹一些,一言以蔽之,强迫症。。

给出一个小场景:比如我定义了一个 UITableViewCell 的类,在 A,B,C 的视图控制器中样式都是一样的,但是在D 的视图控制器中需要对它进行一些改造,这样的话就可以在 D 的类中加上一个 Category来进行操作,在 D 中直接调用这个方法即可

// DViewController.h
@interface DViewController{
}

@interface ModuleCell(diff)
-(void)diffTheCellByParam:(id)param;
// DViewController.m
@implementation DViewController

@end
#pragma mark - 
@implementation ModuleCell(diff)
-(void)diffTheCellByParam:(id)param{
    // Do something
}

使用 MVC


MVC 模式是最常见的模式,而且在学习的第一时间就有接触,可能有些人看到这儿觉得,你这不是废话?这谁不知道。

但是我发现在 Objective-C 这个大家庭中,这个模式是遵守的最差的,相信你们一定见过在 ViewController 中写完所有的数据处理,UI 渲染,视图跳转各类动画的经典案例,因为我们就是这类型创造者,新手应该都是这样过来的(只是说明是一个大概率事件,很多资深其他平台开发者转过来时这方面是做的非常好的)。

  1. 把数据的处理(获取,筛选,排序等)工作放在 Model 中,所谓 Model,新建一个继承自 NSObject(一般是 NSObject) 的类,用来处理数据,直接调用即可;

  2. 把视图的渲染放在 View 中(简单的视图加载可直接在 Controller 中完成),在遇到比较繁杂,需要几百行代码来完成时,如果你是用 xib或是 storyboard 配合代码,这部分无需这么严格,公用的视图必然是放在 View 中了;

  3. 视图控制器 Controller 中只用来调用数据,显示数据,视图的加载,跳转等工作。

视图内容在繁杂时可以考虑使用多个视图控制器联合控制一个页面,如 Apple 的 TabBarController 的工作机理。

将视图以 AddChildViewController 的方式添加到当前视图。

在 A 控制器中添加 B 控制器的视图,这样 A 同时包含了 A 和 B 的视图,B 视图中得 UI 逻辑依然在 B 中进行处理

BViewController *secondVC = VCFromSB(storyboardPatient, @"XRPatientAllVC");
[self.view addSubview:secondVC.view];
[self addChildViewController:secondVC];
[secondVC didMoveToParentViewController:self];// 将B 视图的 UI 响应事件移到 A 中,如果不这样操作,只要点击B 视图中得按钮或是滚动 table 就会崩溃

案例不是太好写,要写得好长一篇文章了,我还得想一项目,可以参考这部分文章:更轻量的 ViewControllers

代码规范

代码规范这事儿 各人有各人的习惯,不多说,但是你得有个规范,别想咋就咋,到时候害的是自己Over

噢,还有件事儿,OC 的代码跟写文章一样这事儿我们都知道,每次都被后端工程师过来吐槽也是醉了,在写参数超过2个的方法时,大家按照冒号对个齐,会好看很多,我也不是逼你这样做,你就随意感受下吧

最后,多复用,多重构,多写注释,祝大家都有一份整洁有条理的代码。

© 著作权归作者所有

芳仔小脚丫
粉丝 929
博文 80
码字总数 74805
作品 0
闵行
程序员
私信 提问
加载中

评论(16)

芳仔小脚丫
芳仔小脚丫 博主

引用来自“张宏新”的评论

你好。请问文中提到的“方法分区”中的"#pragma mark“是什么编辑器里面的功能啊?我平时工作时使用source insight,可惜source insight好像没有这个功能。
这个是 XCode 的功能
张宏新
张宏新
你好。请问文中提到的“方法分区”中的"#pragma mark“是什么编辑器里面的功能啊?我平时工作时使用source insight,可惜source insight好像没有这个功能。
十一岁的加重
十一岁的加重


/**< */ 这样写的好处是,不管是用self访问还是直接用下划线访问都会有提示,

/** */这样只有用self才有,下划线就没提示了
芳仔小脚丫
芳仔小脚丫 博主

引用来自“七槿年华一颗心”的评论

/*!
* @Author joanfen, 15-05-13 14:01:51
* @method POST
* @see XRClass
* @brief 链接解析
*
* @param linkAddressStr 链接地址
*/


这个@see 和 @method是自动生成的,还是自己添加的

自己加的。
七槿年华一颗心
/*!
* @Author joanfen, 15-05-13 14:01:51
* @method POST
* @see XRClass
* @brief 链接解析
*
* @param linkAddressStr 链接地址
*/


这个@see 和 @method是自动生成的,还是自己添加的
芳仔小脚丫
芳仔小脚丫 博主

引用来自“请叫我何大大”的评论

引用来自“芳仔小脚印”的评论

引用来自“请叫我何大大”的评论

/**< */我用这个注释为什么显示不出来?

< 和注释要有一个空格

大神竟然真的在,我以为这么久都没人管了。。。谢谢大神妹纸13

唉,就是没有什么时间写博客了5
请叫我何大大
请叫我何大大

引用来自“芳仔小脚印”的评论

引用来自“请叫我何大大”的评论

/**< */我用这个注释为什么显示不出来?

< 和注释要有一个空格

大神竟然真的在,我以为这么久都没人管了。。。谢谢大神妹纸13
芳仔小脚丫
芳仔小脚丫 博主

引用来自“请叫我何大大”的评论

/**< */我用这个注释为什么显示不出来?

< 和注释要有一个空格
请叫我何大大
请叫我何大大
/**< */我用这个注释为什么显示不出来?
芳仔小脚丫
芳仔小脚丫 博主

引用来自“hi_areo”的评论

大侠是怎么看待xib和stroyboard的使用?
你们在开发中会不会有争议项目中是否要使用xib和stroyboard。
毕竟好多ui效果不是拖拽一个控件就可以实现,还需要很多编码去美化

视情况而定,xib,sb,代码都有
腾讯云通信账号登录集成-Java签名工具类

最近使用腾讯云通信,忍不住要吐槽,若大的腾讯,居然连个写Java的人都没有,要不要这么轻视Java,连个像样点的Java版ServerSDK都不提供,只显示个“敬请期待”。 实在忍受不了管方提供的签名...

6pker
2016/12/23
594
0
(android)微信中MMAlert(半透明底部弹出菜单)的应用介绍

真谛的精力和的精力是社会的支柱。若是大师时常用过微信或者用过iphone,就会发明有种从底部弹出的半透明菜单,这种菜单风&#26684;精美并且用户体验杰出,先看一下结果。 真正的友情从来不会...

vane_
2013/05/11
2.8K
0
设计模式系列(二)——模板方法模式

概念: 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。(维基百科) 理解概念: 定义中提...

江戸川
2018/07/08
11
0
编程:休息片刻的好处

原文作者 Axel Rauschmayer 是一位居住在德国慕尼黑的自由软件工程师。他在这篇博文列举了在编程期间休息片刻的一些好处。 你会更精明而不是更卖力地工作。我曾经为了一个功能的实现而卖力工...

小编辑
2011/11/07
2K
6
收拾收拾

收拾收拾

李岩飞
2017/01/16
3
0

没有更多内容

加载失败,请刷新页面

加载更多

链表中环的入口节点

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路: public ListNode EntryNodeOfLoop(ListNode pHead) { if (pHead == null || pHead.next == null) ...

Garphy
6分钟前
2
0
Spring5 源码分析-容器刷新-invokeBeanFactoryPostProcessors()方法

上一篇:Spring5 源码分析-容器刷新-prepareBeanFactory()方法 该方法主要完成以下功能: 1.实例化ConfigurationClassPostProcessor,并调用ConfigurationClassPostProcessor.postProcessBe...

特拉仔
6分钟前
3
0
为什么MySQL用B+树做索引

索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。...

小致Daddy
32分钟前
4
0
网站前台的三级联动数据封装

我在进行项目时候遇到了一个进行数据封装的一个功能,进行数据的封装的功能也挺复杂,来回试了好几十种方法.最后使用的是这种方法. 使用一个pojo进行封装两个数据,一个是list一个是实体类. 具体...

小天丶羽
34分钟前
4
0
创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA的SPI FLASH、硬件加密芯片

TL437xF-EVM是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA设计的开发板,底板采用沉金无铅工艺的4层板设计,尺寸为240mm*130mm,它为用户提供了SOM-TL437xF核心板的测...

Tronlong创龙
36分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部