我在项目开发中做了些什么
在项目开发中,如何使你的项目架构更加的清晰? 如何写出写出优雅的代码?在调试阶段如何快速的定位到类?等,一系列的问题都都是每个开发人员要认证思考的问题。本文记录了自己在开发过程中的一些技巧和习惯。有问题的地方或者您有更好的观点,欢迎大家指出。
项目架构
-
项目架构按模块来划分主结构
image.png
-
代码结构
image2.png
-
资源结构
image3.png
定义基类
在项目中定义一个基类几乎是必不可少的:
(1) 在基类中可以帮我们做一些常规的事情,如统计、bavbar的常规定义和一些常规手势的定义;
(2)在调试阶段帮助我们定位的调试神器,我们知道在项目做的非常大的时候,我们改一个bug可能才需要1分钟,然而找到这个问题所在的类可能需要花更多的时间,我们可以在基类中打印每一个类的名称如:
//打印类名
- (void) printCurrentClassName {
DLog(@"================ %@", [self className]);
}
我们通过搜索就可以快速的定位该类,进行问题的处理。
封装
在项目具有具有共性的都可以进行抽离封装起来对外暴露接口,代码最大成都的复用。
-
抽离公共数据源
如:在项目中我们会大量用到tableview视图,可以把 Data Source 和其他 Protocols 分离出来,放到单独的一个类中。具体实现请看objc中国构建更轻量级的viewcontroller。 -
公共view
在项目开发中,对公共view进行封装能有效的提高项目的开发效率。
关于界面的布局
-
视图创建 在延展中定义出一套便捷的创建视图的方法,这样带代码更加简洁,也能提高编程效率
image.png
-
视图布局
一直使用massory来进行布局,massory布局中的问题
(1)在使用Masonry添加约束之前,需要在addSubview之后才能使用,否则会导致崩溃。
(2)在添加约束时初学者经常会出现一些错误,约束出现问题的原因一般就是两种:约束冲突和缺少约束。对于这两种问题,可以通过调试和log排查。
(3)代码在量有点多表达不够直观
除此之外,massory可以说是布局利器。基于上述问题,自己也在封装一些和布局有关的东西,待全部完成之后再放出来吧
函数式编程
函数式编程的优点:
- 增强代码可读性 把代码逻辑封装成函数,代码是在描述要干什么,而不是怎么干,让读代码变成一种享受;
-
代码好维护 把函数当成变量来用,关注于描述问题而不是怎么实现,减少对变量状态的维护
函数式编程立志于用函数表达式消除有状态的函数,以及for/while循环,所以,在函数式编程的世界里是不应该用for/while循环的,而要改用递归(递归的性能很差,所以,一般是用尾递归来做优化,也就是把函数的计算的状态当成参数一层一层的往下传递,这样语言的编译器或解释器就不需要用函数栈来帮你保存函数的内部变量的状态了)。
重构“箭头型”代码
箭头型代码即指if-else嵌套的代码,箭头型代码看起来美观,但代码但可读性低,嵌套过深的话,维护成本会变得更高。
对于 if-else 语句来说,一般来说,就是检查两件事:错误 和 状态。
我们可以从以下几个方面进行优化箭头型代码:
-
使用 Guard Clauses 。 尽可能的让出错的先返回, 这样后面就会得到干净的代码。
-
把条件中的语句块抽取成函数。 有人说:“如果代码不共享,就不要抽取成函数!”,持有这个观点的人太死读书了。函数是代码的封装或是抽象,并不一定用来作代码共享使用,函数用于屏蔽细节,让其它代码耦合于接口而不是细节实现,这会让我们的代码更为简单,简单的东西都能让人易读也易维护,写出让人易读易维护的代码才是重构代码的初衷!
-
对于出错处理,使用try-catch异常处理和RAII机制。返回码的出错处理有很多问题,比如:A) 返回码可以被忽略,B) 出错处理的代码和正常处理的代码混在一起,C) 造成函数接口污染,比如像atoi()这种错误码和返回值共用的糟糕的函数。
-
对于多个状态的判断和组合,如果复杂了,可以使用“组合状态表”,或是状态机加Observer的状态订阅的设计模式。这样的代码即解了耦,也干净简单,同样有很强的扩展性。
做到了这些,可以让你的代码level上升一个层次,这样别人读你代码的时候也是一种享受。
这是我目前在项目中处理的一些事情,新的技术不断出现,文章持续更新~
最后感谢