发现共同抽象和机制可以在很大程度上帮助我们理解复杂系统
在工作中很多工程师抱怨他们的系统很凌乱,毫无章法可言,即使花费很长时间也很难理清系统的脉络。在评估一个需求时,要在杂乱无章的代码中找好久才能找到相关的需求改点,然而真正需要改动的代码可能只有一行而已,这样的无序在很大程度上是系统缺少代码组织结构造成的。
代码的格式关系倒代码的可读性,因此需要遵从一定的规范包括缩进,水平对齐,注释格式等。关于代码格式可能会因为语言和个人的偏好而不同,但是一个团队最好选定一种格式,因为一致性可以减少复杂度。
空行在代码中起到的概念区隔作用,每个空白行都
是一条线索,提示你下一组代码表示的是不同的概念或功能
//弹窗动画类型
typedef NS_ENUM(NSInteger, CMBCWindowAlertType) {
CMBCWindowAlertNone, //无动画
CMBCWindowAlertWithAlpha, //Alpha渐变0~1
CMBCWindowAlertWithScale, //Scale渐变0~1(基于视图中心)
CMBCWindowAlertFromTop, //顶部向下
CMBCWindowAlertFromLeft, //左侧向右
CMBCWindowAlertFromBottom, //底部向上
CMBCWindowAlertFromRight, //右侧向左
CMBCWindowAlertFromTabBar, //tabbar向上
CMBCWindowAlertFromNaviBar, //导航栏向下
};
//弹窗优先级类型
typedef NS_ENUM(NSInteger, CMBCWindowAlertPriorityType) {
CMBCWindowAlertPriorityStart = 0,
CMBCWindowAlertPriorityOne,
CMBCWindowAlertPriorityTwo,
CMBCWindowAlertPriorityThree,
CMBCWindowAlertPriorityEnd //结束标志,可在该选项前面扩展优先级
};
//弹窗位置类型
typedef NS_ENUM(NSInteger, CMBCWindowAlertLocationType) {
CMBCWindowAlertLocationFirst, //第一页,tabbar的第0个VC,如:首页
CMBCWindowAlertLocationSecond, //第二页,tabbar的第1个VC,如:生活圈
CMBCWindowAlertPriorityThird, //第三页,tabbar的第2个VC,如:财富
CMBCWindowAlertPriorityFour, //第四页,tabbar的第3个VC,如:我
CMBCWindowAlertLocationAll, //所有页面,tabbar的所有VC
};
若删掉空格代码的可读性就会弱很多
//弹窗动画类型
typedef NS_ENUM(NSInteger, CMBCWindowAlertType) {
CMBCWindowAlertNone, //无动画
CMBCWindowAlertWithAlpha, //Alpha渐变0~1
CMBCWindowAlertWithScale, //Scale渐变0~1(基于视图中心)
CMBCWindowAlertFromTop, //顶部向下
CMBCWindowAlertFromLeft, //左侧向右
CMBCWindowAlertFromBottom, //底部向上
CMBCWindowAlertFromRight, //右侧向左
CMBCWindowAlertFromTabBar, //tabbar向上
CMBCWindowAlertFromNaviBar, //导航栏向下
};
//弹窗优先级类型
typedef NS_ENUM(NSInteger, CMBCWindowAlertPriorityType) {
CMBCWindowAlertPriorityStart = 0,
CMBCWindowAlertPriorityOne,
CMBCWindowAlertPriorityTwo,
CMBCWindowAlertPriorityThree,
CMBCWindowAlertPriorityEnd //结束标志,可在该选项前面扩展优先级
};
//弹窗位置类型
typedef NS_ENUM(NSInteger, CMBCWindowAlertLocationType) {
CMBCWindowAlertLocationFirst, //第一页,tabbar的第0个VC,如:首页
CMBCWindowAlertLocationSecond, //第二页,tabbar的第1个VC,如:生活圈
CMBCWindowAlertPriorityThird, //第三页,tabbar的第2个VC,如:财富
CMBCWindowAlertPriorityFour, //第四页,tabbar的第3个VC,如:我
CMBCWindowAlertLocationAll, //所有页面,tabbar的所有VC
};
注意!!!!
如果在每一行代码后面都加一个空行,这样空行就失去了意义,其结果是和没有空行一样的。
简单的原则:
将概念相关的代码放在一起,相关性越强,彼此之间的距离应该越短。
- 类名采用大驼峰形式,既首字母大写的驼峰,例如:SDWebImage YYModel
- 方法名采用小驼峰的形式,既首字母小写,方法名一般为动词,与参数组成动宾结构- (void)cancelAllDownloads
- 常量命名的字母全部大写,单词之间用下划线连接,例如FACE_DEFAULT_OUTPUT_IMAGE_WIDTH
- 枚举类以 typedef NS_ENUM 开头,异常类使用NSException 结尾
1. 异常处理
很多应用系统因为没有统一的异常处理规范,增加了认为的复杂性,具体体现在两个方面。
代码中到处充斥着异常捕获的try/catch的代码,扰乱了代码的结构,把错误的处理与正常的流程混为一谈,严重影响代码的可读性
异常处理不统一,有的场景对外直接抛出异常,有的场景对外直接返回错误码,这种不一致性让服务的调用方摸不着头脑。增加服务的使用成本和沟通成本。
针对以上问题我建议在业务系统中设置两个异常,分别是BizException(业务异常)和SysException(系统异常),
1. 错误码
错误码并没有统一的约定,错误码管理混乱会给后续的系统维护(特别是在理清系统业务脉络和问题定位上)带来很多麻烦。
错误码非常重要,一定要在系统搭建之初就制定好相应的规范,否则当系统上线后,系统的错误码已经对前端或者外部系统进行透出,在重构的可能性很小。
规范对于架构来说至关重要,从某种意义上来说,架构就是一组约束,遵从了这些约束,才能符合架构的要求:反之架构将失去意义,例如打算采用前后端分离的架构,但又不想遵守前后端分离的约束,允许部分的前端模块代码仍在后端维护,那么这个架构就是去了意义。
架构应遵循相同的分层原则,类似模块化思想和分包机制。
破窗效应是犯罪心理学中一个著名的理论,
环境中的不良现象如果被放任存在,就会使人仿效,甚至变本加利。
任何一种已经存在的不良现象都在传递着一种信息,会导致不良现象无限扩展,同时必须高度警觉哪些看起来偶然的,个别的,轻微的,“过错”,如果对过错不闻不问,熟视无赌,反应迟钝或纠正不力,就会纵容更多的人“去打烂更多的窗户”,极有可能演变成“千里之堤,溃于蚁穴”的恶果。
在软件工程中,“破窗效应”可谓是屡见不鲜,面对一个混乱的系统和一段杂乱无章的代码,往往会加入更多垃圾的代码,这也彰显了规范和重构的价值。首先我们要有一套规范,并尽量遵守规范,不要做第一打破第一扇窗的人;其次发现有“破窗”,要及时地修复,不要让事情进一步恶化。整洁的代码需要每一个人的精心守护。需要整个团队都具备一些工匠精神。
混乱会造成复杂,有序会减少复杂度。制定规范是为了从无序走向有序,减少认知成本。在软件开发过程中,大到体系结构和应用框架规范。小到代码格式和空行的约定,都在一定程度上影响着复杂程度。
要记住,留给公司一个方便维护,整洁优雅的代码库,是我们技术人员的最高使命,也是我们对公司做出的最大技术贡献。