学习
实践
活动
专区
工具
TVP
写文章
专栏首页進无尽的文章一次模块重构的总结

一次模块重构的总结

前言

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

场景说明和重构设计

效果图中的功能为一个上报的模块,该模块需要填写的内容非常的多,上传的字段大约有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方法” 其实没有重写父类的,因为方法写的都不对。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://www.jianshu.com/u/aef519a9dde7复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 关于重构的总结

    重构是对软件内部的一种调整,目的是在不改变软件可观察行为的前提下,提高可理解性,降低其修改成本。

    陨石坠灭
  • Seata RPC 模块的重构之路

    RPC 模块是我最初研究 Seata 源码开始的地方,因此我对 Seata 的 RPC 模块有过一些深刻研究,在我研究了一番后,发现 RPC 模块中的代码需要进...

    张乘辉
  • 代码重构的场景总结

    重构可以是修改变量名、重新安排目录这样简单的物理重构,也可以是抽取子函数、精简冗余设计这样稍许复杂的逻辑重构。但均不改变现有代码的功能。

    lyb-geek
  • atframework的etcd模块化重构

    最近在抽时间整理之气的游戏服务器框架和解决方案里atsf4g-co,现在的架构是使用etcd的是atproxy。简单得说就是服务集群是分组的,每个分组有分组代理...

    owent
  • 记一次对Makefile的重构

    如果你不了解 Makefile 的话,那么推荐看看阮一峰的文章「Make 命令教程」。本文通过一个重构的例子带你写出味道更好的 Makefile,让我们开始吧!

    LA0WAN9
  • 页面重构中的模块化思维

    由 Ghostzhang 发表于 2009-06-21 21:24 更新于 2021-12-10 14:45

    GhostZhang
  • CSS模块的注释——页面重构中的模块化设计(六)

    从前面的内容我们已经知道,样式是可以分成各个模块去写的,如何表示各个模块的作用及它们之间的关系呢?CSS的注释是不二的选择。

    GhostZhang
  • 记又一次对Makefile的重构

    我平常有一个习惯,就是不断看以前写的代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变​ 1%,那么日积月累就是质变:前些天我们写过一次对 Makef...

    LA0WAN9
  • 如何来一次说干就干的重构 (流程篇)

    随着公司业务的爆炸式的增长,需求规模和用户规模也迅速地膨胀起来,这样给系统的三高(高性能、高并发、高可用)以及扩展性、可维护性都带来了考验。而旧系统因为早期设计...

    Fundebug
  • 代码自动生成在重构中的一次探索

    EventBus 已经火了很长一段时间了。最近我们项目决定引入 EventBus,替换我们播放器现在的事件总线框架,以解决我们存在的一些问题。

    吴涛
  • 继承──页面重构中的模块化设计(三)

    前面我们了解了 样式的作用域的分类 和 栏目级作用域 。在权值中,还有一个很重要的因素,需要做下补充,起因是这样的,有个同学在CSS森林群里问了个问题:根据样式...

    GhostZhang
  • 数字货币,货币体系的又一次重构

    “2019金融改革与创新高级论坛暨北京大学曹凤岐金融发展基金第八届颁奖仪式”10月19日在京举办。中国银行原行长、人大财经委委员李礼辉出席并发表演讲。

    互融云
  • 模块化的核心思想──页面重构中的模块化设计(四)

    有不少同学觉得前面的内容过于简单了,对于 样式的作用域的分类 、 栏目级作用域 、 继承 等内容的确十分基础,不过基础还是很重要的。下面就一起进入这个系列真正的...

    GhostZhang
  • 一次线上讨论的总结

    efonfighting
  • python中常用的模块的总结

    1、 模块和包 a.定义: 模块用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件。(例如:文件名:t...

    coders
  • 样式的作用域──页面重构中的模块化设计(一)

    很久没有更新blog了,这段时间实在是发生了很多的事,累身累心。但还是有很多想做的事,比如更新merceCSS、把一直以来所总结的有关模块化的内容整理出来跟大家...

    GhostZhang
  • 栏目级作用域──页面重构中的模块化设计(二)

    在《样式的作用域──页面重构中的模块化设计(一)》中,我将样式的作用域分为了三个部分:公共级(全局)、栏目级(局部公共)、页面级。公共级(全局)容易理解,即影响...

    GhostZhang
  • 基类、扩展类──页面重构中的模块化设计(五)

    基类 和 扩展类 是这个系列的主要内容,上一篇《 模块化的核心思想──页面重构中的模块化设计(四) 》中只是简单提了一下,我们再深入的来了解下它们。

    GhostZhang

扫码关注腾讯云开发者

领取腾讯云代金券