「 重构 -- 第一阶段的总结 」

今年刚开始的时候就想了很多,但是拖拖拉拉的到了五月才进行设想的第一步(嗯,没错…是今年目标的第一阶段…)



入职新公司一年多了,在需求的包围下业务代码咔咔的写了很多,写着写着..发现不对啊,这个还有那个我好想在哪见过一样的…这种搭讪的桥段让我决定先总结总结当前的的一些问题,然后学习如何重构。

问题归纳

所有人在尝试重构前都会遇到的几个大boss:
① 重复代码过多
举个简单的例子: 我们光一个轮播图样式就已经出现了3、4个以banner为后缀的文件。
② 结构定义不够规范
从整个页面结构这么大的角度而言就已经出现了好几套,改bug看别人写的结构还得想一想...
③ 新旧兼容问题
在业务发展一定阶段的时候,一定会遇到兼容的问题,新的结构摆在这里,但是为了兼容旧结构居然…无视新的结构,不采用一层抽象替换,而是直接使用旧的结构



总而言之,即便是业务代码也随着岁月积累了越来越多的问题,而且现在还在继续...所以一边学习一边决定走上重构的道路。

重构第一阶段

以拥有3、4个以banner为后缀文件的轮播图为例:


旧结构

当前业务同时在使用BannerView和BannerCell两种轮播图控件类型,而不同的业务在添加新功能时并不是在现有代码的基础上进行修改,反而是在不断的复制新的控件以满足新需求。

第一步: 创建抽象层
新结构

将通用部分进行抽象,每一个业务都只需要考虑不同的部分,减少了代码的重复性,也让整体的结构变得更加的清晰。

第二步:对象的多态性

以banner的size进行考虑,目前是直接使用判断语句来调整layout布局:
如果是A,就采用A关联的size,
如果是B,就采用B关联的size
.....
判断条件是最简单直接表达出类多态的效果,但是这里面涉及到我一直以来的困惑:

什么时候用判断条件?什么时候用对象的多态性?

就目前可以给的建议:

如果对象间差异性很大,也就是非通用性的部分已经到了新写一个对象的程度,就直接用多态性来做。

因为业务不只是在对size有差异,所以将判断语句移除替换成各个业务对象自己进行处理。

第三步:细节把控

① 提炼函数
如果在定义一个函数名时,左看看右看看无法完全覆盖当前函数的内容,那么就说明是时候提炼多个函数了


② 命名格式
首先,对于类中的私有函数可以在函数名前加一些标识符,如“_”或”p

- (void)initializeView {
    
    [super initializeView];
    
    self.clipsToBounds = YES;
    [self __initialWithScrollImageView];
    [self __initialWithNotification];
}

其次,对于一些参数或函数的命名不是越长越好,而是能明确的说明该参数在使用范围内是干啥的就行。
举个例子:

- (NSArray<NSString *> *)imageArray{}

乍看之下,这个方法…应该是想要得到所有的图片信息,返回值的数组中又是字符串..一番脑部小活动

- (NSArray <NSString *> *)imageUrls{}

但是,改成这样就很直接...拿的就是图片的Url,猜都不用猜。



③ Delegate和block
在一些小的控件中都会同时存在Delegate和block,是Delegate不能满足你还是block不够强大?
如果只是类中只会需要处理少量的外传以及参数很少的话,会优先考虑block;相反情况下则会以delegate为主,而delegate内部的方法命名也常是我很焦虑的一点:

@protocol MallIndexBannerScrollDelegate <NSObject>

@optional
- (void)bannerView:(MallBaseBannerView *)bannerView willDisplayCell:(UICollectionViewCell *)cell indexPath:(NSIndexPath *)indexPath;
- (void)bannerView:(MallBaseBannerView *)bannerView didSelectItemAtIndex:(NSInteger)index;
@end

大部分人会觉得应该去模仿官方的代理回调方法格式,道理是没有错,但是首先还是以自己的风格为主,其次减少无用参数的外传
④ 方法的迭代
功能的重构是不应该影响业务的使用,但经常会发生删除或者调整了某个方法,在检查没有完全覆盖的情况下可能导致崩溃或者无法点击等问题。
对于通用控件而言,可以使用deprecated声明

+ (NSArray *)allHUDsForView:(UIView *)view __attribute__((deprecated("Store references when using more than one HUD per view.")));

但是对于业务线内部使用的控件,除了及时检查,各个业务线中共享控件使用文档之外,好像也无法要求再多。

总结

刚开始看关于重构的一些资料和书,先拿轮播图小小的试水,还有一些类似灵活性、新旧逻辑兼容问题等慢慢来,动手前考虑好架构大方向。

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

推荐阅读更多精彩内容