一次模块重构的总结

前言

由于当时项目进度赶得紧,功能相对简单,代码写的随意,到后来的多次小改大改,改到最后以至于不得不重构的地步,
业务逻辑已经相当的复杂,维护起来很是吃力。于是就产生了重构的想法,重构时才发现很多不合理的设计。

写出一个庞然大View,再加上复杂的逻辑代码,这一块的代码很可能就演变成了谁都不敢动的禁区。
另外说一下: 一个ViewController类的有效代码超过500行,这个ViewController就会变得难以维护。

场景说明和重构设计

效果图中的功能为一个上报的模块,该模块需要填写的内容非常的多,上传的字段大约有80-90个,分为多个模块区,
每个模块中都可能使用到上述的这五个类型的控件,
自定义控件化后整个上报模块的页面布局和值的赋值和读取都变得非常清晰简单。
而且本文中的时间的选择、照片的选择、多选框的选择在工程中都是在 BaseViewController中统一处理的,这也是为了复用而做的处理。
#import <UIKit/UIKit.h>
@interface BaseItem : UIView

@property(copy,nonatomic)NSString *itemTitle;//标题
@property(copy,nonatomic)NSString *itemText;
@property(copy,nonatomic)NSString *itemNo;
@property(assign,nonatomic)BOOL isMust;//是否是必填子段

- (void)setLeftStarImage;
- (void)setRightUnit :(NSString *)unitName;
@end
  • BaseItem 是基础父类,定义公共的方法入口
  • BaseItemForText 是文本输入控件,可设置文本框右侧的单位
  • BaseItemForPopView 是下拉弹框控件
  • BaseItemForSelectTime 是点击底部弹出日期选择,选择后展示日期的控件
  • BaseItemForSelectImage 是点击拍照或者选择相册中相片的控件
  • BaseItemForMoreSelect 多选弹框控件
[self.leftLabel setSingleLineAutoResizeWithMaxWidth:Scale_X(150)];//自动根据内容设定宽度。

不同子类通过重写 BaseItem 的公共属性的 set、get 方法来达到初始化组件或者获取所需提交数据等
这一步中把转化的逻辑都写在了自定义控件内部,对外只暴露公共入口,使外部的调用非常的简单。

简化必填子段验证

- (BOOL)backEmptyKeyWarn;
{
    for (int i = 0; i<25; i++) {
        if (baseItem[i].superview) {
            if (baseItem[i].isMust && NilStr(baseItem[i].itemText) ) {
                return NO;
            }
        }
    }
    return YES;
 }

原来的逻辑设置:

1.没有控件话,页面都是基本UILabel、UIButton 等贴的,而且控件之间由于一开始很简单,没有完全相对布局,里面有很多绝对坐标。
2.绝对布局对于需要根据选择的内容不同动态隐藏或者展示某块区域,某个大的模块来说是非常的不友好,大量的硬编码(y值的硬计算)使得修改和维护起来很是吃力。
3.在VC【众多自定义视图是 VC 的View的子视图】中定义所有自定义视图的下拉弹框的数据源和处理所有自定义视图的交互事件,使得代码耦合度更大,不符合开闭原则,很容易造成一处修改,误使其他模块出错的现象。
4.上报时需要一个个判断是否为空来验证必填参数是否已经填写。
5.参数的收集和初始化赋值的时候都是一个一个对应着设置,不同视图需要不同操作,很是麻烦和易错。

重构后

1.绝对布局全部换成相对布局,这样在后续新需求时添加、删除页面元素更方便修改。
2.每个小控件和大的自定义视图都自动设置自身高度,省去手动计算定值高度的麻烦。
3.隐藏/展示某个控件或者自定义视图时可以直接设置其高度,在需要改变的地方调用统一的刷新方法刷新整体布局。
4.每个自定义视图处理自己的下拉弹框的数据源初始化和交互事件,使得职责更加的内聚合。
5.通过 for 循环即可验证必填参数的自定义控件是否为空,节省了一大坨代码并使验证的逻辑更加简明易懂。
6.由于父类的存在,设置统一赋值、取值的公共方法入口,使得对自定义控件的赋值、取值都是一致和简单的。

心得总结

重构中你只能通过设计把逻辑变得更易懂和更易维护及扩展,但是无法减少已有的逻辑,该有的逻辑还是无法省去的。

【1】注释

  #pragma mark------ XXXX---------


清晰的注释对代码的逻辑梳理有非常大的帮助。而且个人固定的代码风格也有助于代码逻辑的理解,没有固定风格的代码随心所欲的写法是很让人头疼的。

【2】类的命名和方法的命名都可以通过名称达到归类和易于理解的效果。

【3】代码复用:

1.公共组件,工程中多处调用。
2.继承,在父类中统一处理。
3.抽象成类中的公用方法,多处调用。

【4】纯代码写页面中,所有的代码布局都应该是 相对布局,可以使用 SDAutolayout 实现完全自动布局,里面有 SC 和 Cell的自动布局,都是设置底部依据试图,设置边距即可。
使用SDAutolayout 可以彻底解决所有情景下的高度自适应问题,而不单单是 cell的高度自适应问题。

PS:重构中一定要注意低级错误。自己在这上面浪费了很多时间和精力。

第一个控件的 get 方法重写时写错了,其他的都是拷贝第一个的,结果一直没有调用子类“重写的get方法” 其实没有重写父类的,因为方法写的都不对。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,799评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,699评论 2 59
  • 以前在历史课本上看到的李斯都是正面的形象,但今天看到了李斯的一些故事,改变了我对他的印象,让我看到了,他...
    张怡YouZi阅读 566评论 3 1
  • 写在前面:看过了那么多童话,也是不能浪费,但是你也别嫌弃我的图。 在广袤的蓝天下, 生活着一只兔子, 一只只要有胡...
    默默roserest阅读 892评论 0 1
  • 2018年5月9日 星期三 晴 雷震早上难得在楼下等着,程昱看他一副踌躇满志的样子,不由对着他多看几眼...
    米垛阅读 1,970评论 45 55