面试系列:
- iOS面试全解1:基础/内存管理/Block/GCD
- iOS面试全解2:Runloop
- iOS面试全解3:Runtime
- iOS面试全解4:KVC/KVO、通知/推送/信号量、Delegate/Protocol、Singleton
iOS面试全解5:网络协议 HTTP、Socket
iOS面试全解6:CoreAnimation/Layer
iOS面试全解7:音频/视频
iOS面试全解8:启动优化、性能优化、App后台保活、崩溃检测
iOS面试全解9:编程思想、架构、组件化、RAC(当前位置
)
一、基础概念
1)对象
:(Object) 可以对其做事情的一些东西。一个对象有状态、行为和标识三种属性。
2)类
:(class) 一个共享相同结构和行为的对象的集合。
定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为)。举例来说,“狗”这个类会包含狗的一切基础特征,
例如它的孕育、毛皮颜色和吠叫的能力。类可以为程序提供模版和结构。一个类的方法和属性被称为“成员”。
3)封装
:(encapsulation):
第一层意思:将数据和操作捆绑在一起,创造出一个新的类型的过程。
第二层意思:将接口与实现分离的过程。
4)继承
: 类之间的关系,在这种关系中,一个类共享了一个或多个其他类定义的结构和行为。继承描述了类之间的“是一种”关系。
子类可以对基类的行为进行扩展、覆盖、重定义。
5)组合
: 既是类之间的关系也是对象之间的关系。在这种关系中一个对象或者类包含了其他的对象和类。组合描述了“有”关系。
6)多态
: 类型理论中的一个概念,一个名称可以表示很多不同类的对象,这些类和一个共同超类有关。
因此,这个名称表示的任何对象可以以不同的方式响应一些共同的操作集合。
7)动态绑定
: 也称动态类型,指的是一个对象或者表达式的类型直到运行时才确定。通常由编译器插入特殊代码来实现。与之对立的是静态类型。
8)静态绑定
: 也称静态类型,指的是一个对象或者表达式的类型在编译时确定。
9)消息传递
: 指的是一个对象调用了另一个对象的方法(或者称为成员函数)。
10)方法: 也称为成员函数,是指对象上的操作,作为类声明的一部分来定义。方法定义了可以对一个对象执行那些操作。[1]
11)聚合
:又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物组装体,从而简化对复杂事物的描述。
12)关联
:是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。
13)粒度控制
:一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详查每一部分的具体的细节:考虑某部分的细节时则暂时撇开其余的部分。着就是粒度控制原则
14)行为分析
:显示世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为旺旺相互依赖交织
面向对象 的思想已经涉及到软件开发的各个方面。如:
OOA:面向对象的 分析
(Object Oriented Analysis)
OOD:面向对象的 设计
(Object Oriented Design)
OOP:面向对象的 编程
(Object Oriented Programming)
AOP:面向切面
编程(Aspect Oriented Programming的)
1、OOA:面向对象分析方法(Object Oriented Analysis)
是确定需求或者业务的角度,按照面向对象的思想来分析业务。例如:OOA只是对需求中描述的问题,进行模块化的处理,描述问题的本质,区别每个问题的不同点相同点,确定问题中的对象。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。
OOA模型由两部分组成:
1、5个层次:主题层、对象类层、结构层、属性层、服务层
2、5个活动:标识对象类、标识结构、定义主题、定义属性、定义服务。
在这种方法中定义了两种对象类之间的结构:
一种称为分类结构
:就是所谓的一般与特殊的关系。比如类别 categroy UI、NS等
一种称为组装结构
:反映了对象之间整体与部分的关系。比如 network、协议protocol、单列singleton、data存取、下载、音频视频 等
OOA在定义属性的同时,要识别实例连接。实例连接是一个示例与另一个实例的映射关系。
OOA在定义服务的同时,要识别消息连接。当一个对象需要向另一个对象发送消息时,它们之间就存在消息连接。
OOA中的5个层次和5个活动继续贯穿在OOD(面向对象设计)过程中。
需求中描述的问题
---> 本质、不同点、相同点
---> 问题中的对象
---> 进行模块化的处理
2、OOD:面向对像设计方法(Object-Oriented Design)
是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。
OOD的目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(interface)的后面,让它们只通过接口相互交流。比如说,如果用OOD的方法来设计一个服务器-客户端(client-server)应用,那么服务器和客户端之间不应该有直接的依赖,而是应该让服务器的接口和客户端的接口相互依赖。
这种依赖关系的转换使得系统的各部分具有了可复用性。还是拿上面那个例子来说,客户端就不必依赖于特定的服务器,所以就可以复用到其他的环境下。如果要复用某一个程序块,只要实现必须的接口就行了。
OOD模型由4个部分组成:
1、设计问题域
2、设计人机交互
3、设计任务管理
4、设计数据管理
3、OOP:面向对象编程(Object Oriented Programming)
是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
OOP 达到了软件工程的三个主要目标:重用性
、灵活性
和扩展性
。
为了实现整体运算,每个对象都能够:接收信息
、处理数据
和向其它对象发送信息
。
4、 AOP:面向切面编程(Aspect Oriented Programming)
通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是 函数式编程 的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离
,从而使得业务逻辑各部分之间的 耦合度 降低,提高程序的可重用性,同时提高了开发的效率。
iOS中面向切片编程一般有两种方式 :
- 一个是直接基于runtime 的method-Swizzling
- 还有一种就是基于NSProxy
NSObject寻找方法顺序:本类->(父类-)>(动态方法解析)-> 消息转发;NSproxy顺序:本类->消息转发
引用文章
NSProxy简介 | 大专栏
NSProxy类的了解
二、编程思想
在开发中我们也不能太依赖于某个框架,否则这个框架不更新了,导致项目后期没办法维护,比如之前Facebook提供的Three20框架,在当时也是神器,但是后来不更新了,也就没什么人用了。因此我感觉学习一个框架,还是有必要了解它的编程思想:
1、面向过程
:处理事情以过程为核心,一步一步的实现。
2、面向对象
:万物皆对象
3、响应式编程思想
:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
• 代表:KVO 的运用。
4、链式编程思想
:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)
• 链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)
• 代表:masonry
框架。
• 模仿masonry,写一个加法计算器,练习链式编程思想。
5、 函数式编程思想
:是把操作尽量写成一系列嵌套的函数或者方法调用。
• 函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)
• 代表:RAC:ReactiveCocoa
。
• 用函数式编程实现,写一个加法计算器,并且加法计算器自带判断是否等于某个值.
ReactiveCocoa编程思想
ReactiveCocoa 结合了几种编程风格:
函数式编程
(Functional Programming)
响应式编程
(Reactive Programming)
函数响应式
(FRP)
所以,你可能听说过ReactiveCocoa被描述为函数响应式编程(FRP)框架。
以后使用RAC解决问题,就不需要考虑调用顺序,直接考虑结果,把每一次操作都写成一系列嵌套的方法中,使代码高聚合
,方便管理。
UI设计模式:
MVC:(Model、View、Controller)
MVP:(Model View Presenter)
MVVM: (Model View ViewModel)
- Model:用了存储数据
- View:UI视图
- Controller:视图控制器,连接 View 和 Model
- Presenter:主持者,通过向View传model数据进行交互,解除了view与model的耦合,使得view或model有更强的复用性。使用delegate而不用block做回调。
MVVM是一个UI设计模式。它是MV模式集合中的一员。MV模式还包含 MVC、MVP等。这些模式的目的在于将UI逻辑与业务逻辑分离,以让程序更容易开发和测试。其中 ViewModel
的主要职责是处理业务逻辑并提供 View 所需的数据,这样 VC 就不用关心业务,自然也就瘦了下来。ViewModel 只关心业务数据不关心 View
,所以不会与 View 产生耦合,也就更方便进行单元测试。
MVVM模式依赖于数据绑定
,由于iOS没有数据绑定框架。但幸运的是ReactiveCocoa可以很方便的实现这个,所以ReactiveCocoa是实现MVVM的最佳方式。不通过ReactiveCocoa也可以实现MVVM一样可以实现。
二、组件化
1、组件化有什么好处?
- 1、业务分层、解耦,使代码变得可维护;(化解技术债风险)
- 2、有效的拆分、组织日益庞大的工程代码,使工程目录变得可维护;
- 3、便于各业务功能拆分、抽离,实现真正的功能复用;
- 4、业务隔离,跨团队开发代码控制和版本风险控制的实现;
- 5、模块化对代码的封装性、合理性都有一定的要求,提升开发人员的设计能力;
- 6、在维护好各级组件的情况下,随意组合满足不同客户需求;(组装之前的多个业务组件模块,即可快速迭代出一个全新App)
2、你是如何组件化解耦的?
-
2.1、分层
基础功能组件:按功能分库,不涉及产品业务需求,跟库Library类似,通过良好的接口拱上层业务组件调用;不写入产品定制逻辑,通过扩展接口完成定制;
基础UI组件:各个业务模块依赖使用,但需要保持好定制扩展的设计
业务组件:业务功能间相对独立,相互间没有Model共享的依赖;业务之间的页面调用只能通过UIBus进行跳转;业务之间的逻辑Action调用只能通过服务提供;
-
2.2、中间件
- target-action
- URL-block
- protocol-class
3、为什么 CTMediator 方案优于基于 Router 的方案?
Router的缺点:
注册URL并不是充分必要条件,会造成不必要的内存常驻。维护注册列表繁琐,调用被弃用要及时删除;但是使用runtime不存在注册过程,维护成本就降低了。
非常规对象(不能被字符串化到URL中的对象,例如UIImage)无法参与本地组件间调度。 在本地调用中使用URL的方式其实是不必要的,如果业务工程师在本地间调度时需要给出URL,那么就不可避免要提供params,在调用时要提供哪些params是业务工程师很容易懵逼的地方。
为了支持传递非常规参数,蘑菇街的方案采用了
protocol
,这个会侵入业务。由于业务中的某个对象需要被调用,因此必须要符合某个可被调用的protocol,然而这个protocol又不存在于当前业务领域,于是当前业务就不得不依赖public Protocol
。这会影响将来业务的迁移。
CTMediator的优点:
调用时,区分了
本地应用调用
和远程应用调用
。本地应用调用为远程应用调用提供服务。组件仅通过
Action
暴露可调用接口,模块与模块之间的接口被固化在了Target-Action
这一层,避免了实施组件化的改造过程中,对Business
的侵入,同时也提高了组件化接口的可维护性。方便传递各种类型的参数。
4、基于CTMediator的组件化方案,有哪些核心组成?
1、CTMediator
中间件:集成就可以了
2、模块Target_%@
:模块的实现及提供对外的方法调用Action_methodName
,需要传参数时,都统一以NSDictionary*
的形式传入。
3、CTMediator+%@
扩展:扩展里声明了模块业务的对外接口,参数明确,这样外部调用者可以很容易理解如何调用接口。
未完待续。。。
引用文章:
//===========" 安居客的设计者:刘坤 "=============
Casatwy作者
iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案
iOS应用架构谈 网络层设计方案
iOS应用架构谈 本地持久化方案及动态部署
iOS应用架构谈 组件化方案
跳出面向对象思想(一) 继承
1:iOS应用架构谈 view层的组织和调用方案
strategy模式