【iOS 开发】ViewController 减负记录

前言

最近在重构一个以前写的老项目,在尝试给之前的 ViewController 减负,尽量抽离代码到其他文件。
想记录一些东西,看看以后返回来再看能不能有更好的想法;而现在,可以作为一个检验当前代码是否需要优化的一个标准。


整合常量

以前喜欢在 ViewController 的顶部(class 外面)写一些全局变量,这样虽然可以写一次创建的代码,就可以在整个项目的任意地方使用。但是,基本上你不可能只有一个 ViewController,有了这种习惯之后,会让全局变量没有逻辑地分散在不同的代码文件里,不易于管理(甚至可能会出现同一个东西以不同的名字被创建了多次的情况),而且代码可读性会严重降低(因为你看见这个变量的时候,你可能并不知道它是全局的)。

解决起来其实很简单,我当前这个项目的缩写是 GM,于是我建了一个叫 GMConstants 的 Class,把所有之前的全局变量都放到这里,写成 <code>static let</code> 的形式。(除非你真的知道这样没问题,否则不建议写 <code>static var</code>,或创建 GMVariables Class,这样会导致你使用这些量的时候,依然不知道具体这些是什么,因为它们可能被更改过)

比如之前我设定了我这个 App 中使用的所有的灰色都应该是一样的,我写了一个 gmGreyColor 的常量,使用的时候,你可能并不记得这么一个东西是全局的,并且担心除了灰色,还有什么颜色,是不是还有个 gmBlackColor?甚至你可能写了一个意义相同的 gmGrayColor,仅仅是因为 grey 和 gray 同义。而现在,你的使用方式应该是 <code>GMConstants.greyColor</code>——一看便知是什么意思,而且按住 cmd 键,鼠标左击 GMConstants 关键词,你还可以看见你到底创建了几个类似这样的颜色。

当你想写全局变量,或者发现某个局部变量,在不同的地方被多次使用的时候,就该考虑这个问题了。


布尔标记

刚刚提到不建议以整合常量的方式来整合变量,不过后续又发现之前会用这样一种方式来处理逻辑:先写一个值为 <code>false</code> 的布尔变量,以此作为一种标记,后续根据情况来不断地修改该值为 <code>true</code> 或者 <code>false</code> ,来判断某些语句是否应该执行。

虽然目前认为这种方式并不是优雅的写法,因为这样一个布尔标记的作用范围太大了,虽然写代码的时候知道,某种情况 <code>true</code>,另一种情况 <code>false</code>,但以后修改的时候,就要求程序员有全局观才能尝试修改或移除这个标记。

暂时没有想到很好的修改方法,但是认为这种情况下,可以像之前整理 <code>static let</code> 一样来以 <code>static var</code> 的形式来整理这些布尔类型的标记,可能取 class 名为 GMMarks。

另外还可以自定义这些标记的 setter,比如

static var imageSelected:Bool = false

我们可以这样自定义 setter:

class func selectImage() {
    GMMarks.imageSelected = true
}
class func deselectImage() {
    GMMarks.imageSelected = false
}

语义更清晰易懂


UIView 耦合

self.view.addSubview(view1)
self.view.addSubview(view2)
self.view.addSubview(view3)

假如说在 ViewController 里面看到上面这样的代码,同时发现 view1、view2、view3 之间就是简单的一层一层叠加而已,那么我们或许可以向之前一样建一个叫做 GMViews 的 class,然后把这三个 view 的创建都放在

class func xxView (frame frame:CGRect) -> UIView

这样一个方法里面,使用时也很简单

let xxView = GMViews.xxView(frame: xx)
self.view.addSubView(xxView)

这个时候一定要注意,之前三个 view 在 ViewController 里面创建时,frame 是根据 self.view 这个 view 来写的,frame.origin 是一个 CGPoint,它表示的是相对于父级 view 的相对位置,而不是相对于你的 App 界面的绝对位置,所以抽离这部分代码的时候,确保你的各个 view 的 frame 写对(在支持横屏的时候,是不是还涉及其他问题)。


抽离方法命名问题

MVC 令人诟病的一点是,以前写在 Controller 里面的业务逻辑很臃肿,现在加个 <code>func</code> 关键字就抽离到 Model 里面,导致 Controller 不臃肿了,Model 反倒臃肿了。

所以如果想要从之前臃肿的 ViewController 里面抽离到代码到新的类,一定要注意 Model 的命名问题。

比如说我现在要清理缓存,清理缓存这种事情应该说和当前的 ViewController 是没什么耦合性可言的,完全可以把这部分代码剥离出来,那么如果这时候我根据清理的具体内容不同,抽象出了三个函数:

func clear1() {}
func clear2() {}
func clear3() {}

如果直接粗暴地把这三个方法填到一个叫做 GMTools 的类里面,把这些方法都加上 <code>class</code> 关键字,那么以后这个类会越来越杂乱,这和之前没什么分别。

较好的做法应该是把这个类叫做 GMClear,而且尽量调用方法的时候,让方法体内部的逻辑和现在的这个 App 本身没太大关系,把和现在的 App 有直接关系的部分作为参数,让使用者传参调用。

这样下来,或许你可以在这个项目结束的时候,拥有几个可能叫 GMClear、GMSave、GMShare 的类,而且这些类里面的方法和你现在这个 App 没有太多直接联系,那么下一个项目用到这些东西,直接把代码文件复制过去就可以了。

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,537评论 18 399
  • 你很好,是我不够好,我配不上你。 你根本不知道我到底是怎么的一个人。我没那么好,而且我做了一些我自己也无法原谅的事...
    公子不世阅读 230评论 0 0
  • 周末和几个朋友出去吃饭,因为是周末路上的车并不多,道路不拥挤,二十分钟的车程就到了目的地。 一下车...
    顾紫阅读 352评论 0 1