组件化之路的尝试

最新因为使用pod私有库来进行开发,将所有模块拆分成各个Private Pod,它的Podfile目录结构类似这样:

123
pod 'PrivateKit'pod 'ModuleA'pod 'ModuleB'

其中PrivateKit里面包含多个通用库,其中包含:RequestKit网络请求库(将所有请求看作一个对象),
ConfigurationKit(包含通用的样式以及配置信息等),第三方需要引用的库如:AFNetworking,SDWebImage等。

这样所有的业务模块可以进行拆分,业务模块可以选择依赖性于这个PrivateKit。这样的好处无疑是解耦模块业务之间的开发,将大的一个工程拆分成无数个小的子工程,适合多人协作的开发方式,每个开发人员无须深入理解多个业务模块之间的关系,只需要设计输出和输入的接口,这是比较理想的情况。

在这个道路上进行尝试,那其中首当要解决的问题就是去模块化的耦合,我们设想一下,如果ModuleB的初始化需要根据ModuleA用户选择和计算出的结果来进行判断,那就必须先ModuleA的一些Model传递给B,这样势必会进行耦合,所以优先考虑这个的解决方案。首先会想到的自然是加中间层,所有的一切都是通过这个中间件路由,一开始的构想是这样的:

又或者这样:

这样满足了我们之前的要求,解除了模块之间的直接关联,我们只增加了Mediator这样一个类去做,仔细观察上面这个图之后,会发现Mediator的作用显然被放大了,模块之间与Mediator的耦合越来越重,ModuleA与ModuleB的耦合是没有。如果方向上是正确的话,我们需要尝试去解决模块和Mediator之间的问题,尝试之后,觉得还是增加一个协议,来减轻他们之间的耦合关系,想象的是这样:

既然这样做的话,看起来是挺好,模块之间都遵循同一个协议,至于如何通过Mediator去打开Module,我们还缺少一层映射关系,目前从图中看不出有任何关系,所以就必须设置代理或者target,又或者回到之前的老路,在Mediator去注册,通过协议和open方法来执行。想想都不是一个好的方案,于是尝试另一种方式,在运行时,通过查找target就是具体的实例对象,来调用其中的方法完成模块之间的依赖性。将protocol通过引用一个新的类来代替,这个类叫做Behaviour,每个module中的每个page又或者是每个控制器都有一个扩展的行为来进行模块之间的功能,这个扩展行为我们定义为Behaviour类,这个是一个抽象类,让子类去说明自己是属于哪个类的扩展行为。
之后将它所有的扩展行为,通过Mediator的Catagetory去映射。这样我就没有必要一定要去遵守Mediator的Protocol。catagetory通过查看Behaviour的拥有者来映射这层关系。它似乎是这样

CHMediator GitHub地址

期间有一小插曲,可以通过performSelector来runtime机制,但不能处理多个参数,为了处理多个参数传递的映射,最后使用valist去接收参数,选择使用NSInvocation去执行和接收返回值,但在跳转Cotroller报出了很多野指针的错误,在僵尸模式调试下,发现竟然是

1
[ModuleAViewController release]: message sent to deallocated instance 0x7fbb67312410

这样的可能就是在控制器dealloc时候找不到了,其实是NSInvocation接收返回对象会被释放两次(由于ARC模式下NSInvocation并没有管理接收对象的原因),最后使用指针对象接收返回值,然后在用(__bridge id)转换成对象。

原文:大专栏  组件化之路的尝试

原文地址:https://www.cnblogs.com/chinatrump/p/11615047.html

时间: 2024-10-23 18:00:28

组件化之路的尝试的相关文章

蘑菇街 App 的组件化之路

在组件化之前,蘑菇街 App 的代码都是在一个工程里开发的,在人比较少,业务发展不是很快的时候,这样是比较合适的,能一定程度地保证开发效率. 慢慢地代码量多了起来,开发人员也多了起来,业务发展也快了起来,这时单一工程开发模式就会显露出一些弊端 耦合比较严重(因为没有明确的约束,「组件」间引用的现象会比较多) 容易出现冲突(尤其是使用 Xib,还有就是 Xcode Project,虽说有 脚本 可以改善) 业务方的开发效率不够高(只关心自己的组件,却要编译整个项目,与其他不相干的代码糅合在一起)

Android 组件化之路 资源冲突问题

比如我现在有3个模块:app模块,user模块,me模块,其中app模块依赖user模块和me模块. 然后我在user模块和me模块的strings.xml中都定义了greet字符串: // user模块 <resources> ... <string name="greet">Hello!</string> ... </resources> // me模块 <resources> ... <string name=&q

iOS 组件化方案

概述 近一年iOS业界讨论组件化方案甚多,大体来说有3种. Protocol注册方案 URL注册方案 Target-Action runtime调用方案 URL注册方案据我了解很多大公司都在采用,蘑菇街 App 的组件化之路(http://limboy.me/tech/2016/03/10/mgj-components.html)蘑菇街的Limboy在这篇博客中做了很详尽的阐述 Target-Action runtime调用方案Casa在 iOS应用架构谈 组件化方案(http://casatw

iOS架构组件化

前言 本文简书地址:http://www.jianshu.com/p/2d89f55fc2c4 当一个App只有几个人开发的时候,很容易就会在一个单项目中开发.但当App开发人数越来越多,甚至几百人,十几个不同BU都在协调开发同一个App的时候,就必须对架构进行组件化,才能方便开发.本文主要基于手机淘宝的一次架构探索:手机淘宝客户端架构探索实践,基于此文进行的一些学习和探索,写一篇文章给自己梳理一下. 组件化的目的 首先,第一个问题,为何需要组件化? 如果依旧是单工程项目,或者是多工程引入同一个

组件化开发的一些思考

看了limboy和Casa的文章,关于组件化开发,整理了一下思路. 1.为什么要进行组件化开发? 一个产品,在最开始的时候,由于业务简单,一般是直接在一个工程里开发.这种方式,在产品起步阶段,是没有问题的,也能够有效的保证开发效率.但随着业务的不断发展,代码量不断增多,开发团队不断壮大,最后的模块间关系会发展成如下图所示: 从上图中可以看到,这种单一工程开发模式存在一些弊端: 模块间耦合严重(模块是指较大粒度的业务功能.比如说微信,我们根据首页Tab,可以分为四大模块:会话.通讯录.发现.我).

Atlas-手淘组件化框架的前世今生和未来的路

今天手淘技术团队宣布正式开源它们的容器框架Atlas,项目地址: https://github.com/alibaba/atlas 同时他们还推出了项目官网,上线了技术文档: http://atlas.taobao.org/ 下面让Atlas团队来介绍下该项目的历史.原理和未来. Atlas是什么 Atlas是古希腊神话中的天神,是波士顿动力公司的机器人,借助搜索引擎,得以发现这个名词背后许许多多的含义.在手机淘宝,Atlas是一个扎根于Android客户端的一个组件化容器框架,相比神话中用手和

2015前端组件化框架之路(转)

https://github.com/xufei/blog/issues/19 1. 为什么组件化这么难做 Web应用的组件化是一个很复杂的话题. 在大型软件中,组件化是一种共识,它一方面提高了开发效率,另一方面降低了维护成本.但是在Web前端这个领域,并没有很通用的组件模式,因为缺少一个大家都能认同的实现方式,所以很多框架/库都实现了自己的组件化方式. 前端圈最热衷于造轮子了,没有哪个别的领域能出现这么混乱而欣欣向荣的景象.这一方面说明前端领域的创造力很旺盛,另一方面却说明了基础设施是不完善的

2015前端组件化框架之路

特别声明:本文转自@民工精髓的<2015前端组件化框架之路>.谢谢@民工精髓的分享!著作权归作者所有. 编辑推荐: 掘金是一个高质量的技术社区,从 CSS 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货. 点击链接查看最新前端内容,或到各大应用市场搜索「 掘金」下载APP,技术干货尽在掌握中著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.原文: http://www.w3cplus.com/components-in-webapp.html ? w

【转】前端组件化框架之路

1. 为什么组件化这么难做 Web应用的组件化是一个很复杂的话题. 在大型软件中,组件化是一种共识,它一方面提高了开发效率,另一方面降低了维护成本.但是在Web前端这个领域,并没有很通用的组件模式,因为缺少一个大家都能认同的实现方式,所以很多框架/库都实现了自己的组件化方式. 前端圈最热衷于造轮子了,没有哪个别的领域能出现这么混乱而欣欣向荣的景象.这一方面说明前端领域的创造力很旺盛,另一方面却说明了基础设施是不完善的. 我曾经有过这么一个类比,说明某种编程技术及其生态发展的几个阶段: 最初的时候