关于ObjC代码耦合性的闲扯

作者: 秋刀生鱼片 | 来源:发表于2015-11-27 11:01 被阅读334次

综述

凡是维护过中型项目的iOS工程师都应该有过类似的体验:ViewController代码繁重、功能复杂、维护困难,整个工程寥寥几个ViewController就完成了整个项目的开发。每个控制器中都囊括了所有的页面布局、委托代理、网络请求、数据库操作和核心功能,这样的代码往往问题重重,修改起来牵一发而动全身,着实令人头疼。

为了应对这一系列的问题,苹果公司的工程师给我们提供了很多选择去更好的在项目工程中贯彻MVC的设计理念,例如使用从前的Interface Builder制作xib可视布局,现在已经内置到xcode里面,并且提供了更为强大Storyboard功能,来减少控制器中的页面样式布局代码量;再例如NSFetchedResultsController这样的类和CoreDataheUITableViewController的完美结合,大大减少类似构架项目的代码量,并且稳定高效。

这些技巧在objc.io上有一个专门的专题,推荐给大家对应中文站objc中国,感谢objc 中国项目组。

Storyboard与代码耦合性

如果放在两年前去讨论iOS工程要不要使用Stortboard进行布局,我们可能还会犹豫一下,很多iOS程序猿内心会有一种想把一切化为代码掌控在手中的想法,选择拒绝使用Storyboard或者更早的xib。但事到如今,iPhone、iPad的屏幕尺寸越来越多,工程里为了适配不同屏幕冗余代码越来越长的时候,Storyboard似乎成为了我们必须同时也是苹果公司在引导我们将要实践的方向。

iOS 6中的AutolayoutiOS 8中的Size Class,新技术的涌现正是为了应对更复杂的布局任务。有人可能会反驳说,自动布局也可以用纯代码完成呀。你说的没错,纯代码是可以完成,但其复杂程度远远不是重写Frame这么简单了,更灵活地将Storyboard和代码结合,才是比较完备的解决方案。

这里通过三个方面介绍通过使用Storyboard减小工程代码耦合性的途径:

  • IBDesignableIBInspectable
  • 预览Storyboard Preview
  • NSObjectRuntime Attributes

IBDesignable和IBInspectable

IBDesignableIBInspectable的出现为Storyboard提供了可视化使用高度自定义控件的方法,例子中我们在制作一个双行标签控件,用来显示日期和星期,命名为DateLabel,使用方法如下:

//IB_DESIGNABLE 标记
IB_DESIGNABLE @interface DateLabel : UIView

//IBInspectable 标记
@property (nonatomic, strong) IBInspectable NSString* dateLabelText;
@property (nonatomic, strong) IBInspectable NSString* weekLabelText;

@end

其中,IB_DESIGNABLE标记赋予我们的继承类DateLabel可以在界面编辑器里面实时渲染的特权。IBInspectable则赋予让界面编辑器可以设置或者预置View的参数dateLabelTextweekLabelText。具体不多介绍了,有点跑题,大家可以参见如何在iOS 8中使用Swift和Xcode 6制作精美的UI组件,同样适用于Objective-CSwift

引用上文介IBInspectable支持Int,CGFloat,Double,String,Bool,CGPoint,CGSize,
CGRect,UIColor,UIImage等类型的变量。

现在在Github上已经有一部分开源的UI控件使用了这项特性,如此一来,很多需要在代码中实现的控件自定义特性,都可以在Storyboard中完成,后者的优势也很明显:

  1. 所见即所得
  2. 剥离了ViewController中的定制View代码,减小耦合

预览Storyboard Preview

Storybord中提供了预览功能,可以预览其界面在各个尺寸设备上的真实显示效果。详见Xcode 6中学习Swift、CloudKit 和 Testflight,搜索Storyboard Preview

NSObject和Runtime Attributes

大家对这个概念再熟悉不过了,但大家有没有对他作为一个没有界面的控件在Storyboard作用产生过疑问呢。先来看下这篇文章 0代码ViewController的前言。

Storyboard中的NSObject可以是UITableViewDataSource,也可以是MapViewDelegate,连线一下,就能将原本在ViewController中写得最多的代理方法全部移出,并且,当你需要的时候,这些现成的代理方法,可以直接移到其他的项目中使用。

Runtime Attributes功能则可以在Storyboard中给参数写好初始值,但这里如果控件没有对应的参数的话,则会出现下面的报错。

Failed to set (xxx) user defined inspected property on (xxx): [<xxx 0xXXXXXXXX> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxx.

Storyboard小结

当你了解了Storyboard的基本原理,就会发现Storyboard是一个很好用的工具,是Model-View-Controller模型中Controller跳转逻辑和View初始化的实用载体,从根本上把Controller中的导航代码移出,把页面配置代码、触摸事件甚至协议委托方法分摊到其他实例中,各个类各司其职,整个项目的逻辑也变的更加清晰、更易维护。

转载请注明出处

相关文章

  • 关于ObjC代码耦合性的闲扯

    综述 凡是维护过中型项目的iOS工程师都应该有过类似的体验:ViewController代码繁重、功能复杂、维护困...

  • 全栈开发008 Spring开发 依赖注入

    依赖注入: 耦合具有两面性,一方面,紧耦合的代码难以测试,难以复用,而适当的耦合又是必须的,没有耦合的代码什么也做...

  • “高内聚,低耦合”

    什么是耦合(大量的重复代码,可读性不高): 软件工程中对象之间的耦合度就是对象之间的依赖性。耦合性是程序结构中各个...

  • 08.继承的优缺点

    继承优缺点 A:优点提高了代码的复用性提高了代码的可维护性 B:缺点:类的耦合性增强了开发的原则:高内聚低耦合内聚...

  • iOSApp组件化详解(从0到1实现一个完整的组件化项目)

    何为组件化 一种能够解决代码耦合的技术。项目经过组件化的拆分,不仅可以解决代码耦合的问题,还可以增强代码的复用性,...

  • 比butterKnife更简洁的注解框架

    一、框架简介: Annotation特点就是使代码更加简洁,降低代码的耦合性,提高代码的编译效率,提高开发...

  • 第 014 期 用适配器模式来降低耦合

    耦合指模块与模块之间关联的程度。两个模块的关联性强,称为高耦合,反之称为低耦合。 强耦合的代码是脆弱的,不容易复用...

  • Spring

    Spring的一切都是为了耦合性 高内聚 相同的功能代码放在一块 低耦合 模块与模块之间减少耦合 spri...

  • React开发-使用抽象+工厂实现状态机

    日常开发遇到的一些问题? 大量的if else 大量的switch case 代码阅读性差,扩展性差 代码耦合性强...

  • 迪米特法则——“高内聚、松耦合”思想的实现

    基础概念——“高内聚、松耦合” “高内聚、松耦合”是一个非常重要的通用的设计思想,以有效提高代码的可读性和可维护性...

网友评论

本文标题:关于ObjC代码耦合性的闲扯

本文链接:https://www.haomeiwen.com/subject/vdudhttx.html