【iOS 开发】ViewController 减负记录

简介: 前言最近在重构一个以前写的老项目,在尝试给之前的 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 没有太多直接联系,那么下一个项目用到这些东西,直接把代码文件复制过去就可以了。

目录
相关文章
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
141 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
3月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
3天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
22 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
143 66
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
87 11
|
2月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
173 3
|
2月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
3月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
3月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
3月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
72 2

热门文章

最新文章