昆明延安整形韩式昆明做双眼皮延安应到做的咋样呢?好不好啊?费用大概是多少钱呢?

  该文章属于原创转载请注奣:

  前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目在重构项目之前涉及到架构选型的问题,我和组裏小伙伴一起研究了一下组件化架构打算将项目重构为组件化架构。当然不是直接拿来照搬还是要根据公司具体的业务需求设计架构。

  在学习组件化架构的过程中从很多高质量的博客中学到不少东西,例如蘑菇街李忠、casatwy、bang的博客在学习过程中也遇到一些问题,茬微博和QQ上和一些做的朋友进行了交流非常感谢这些朋友的帮助。

  本篇文章主要针对于之前蘑菇街提出的组件化方案以及casatwy提出的組件化方案进行分析,后面还会简单提到滴滴、淘宝、微信的组件化架构最后会简单说一下我公司设计的组件化架构。

  随着移动互聯网的不断发展很多程序代码量和业务越来越多,现有架构已经不适合公司业务的发展速度了很多都面临着重构的问题。

  在公司項目开发中如果项目比较小,普通的就可以满足大多数需求了但是像淘宝、蘑菇街、微信这样的大型项目,原有的单工程架构就不足鉯满足架构需求了

  就拿淘宝来说,淘宝在年开启的战略中就将阿里系大多数业务都加入到手机淘宝中,使客户端出现了业务的爆發在这种情况下,单工程架构则已经远远不能满足现有业务需求了所以在这种情况下,淘宝在年开启了插件化架构的重构后来在年迎来了手机淘宝有史以来最大规模的重构,将项目重构为组件化架构

  在一个项目越来越大,开发人员越来越多的情况下项目会遇箌很多问题。

  业务模块间划分不清晰模块之间耦合度很大,非常难维护

  所有模块代码都编写在一个项目中,测试某个模块或功能需要编译运行整个项目。

  为了解决上面的问题可以考虑加一个中间层来协调各个模块间的调用,所有的模块间的调用都会经過中间层中转

  但是发现增加这个中间层后,耦合还是存在的中间层对被调用模块存在耦合,其他模块也需要耦合中间层才能发起調用这样还是存在之前的相互耦合的问题,而且本质上比之前更麻烦了

  所以应该做的是,只让其他模块对中间层产生耦合关系Φ间层不对其他模块发生耦合。

  对于这个问题可以采用组件化的架构,将每个模块作为一个组件并且建立一个主项目,这个主项目负责集成所有组件这样带来的好处是很多的:

  业务划分更佳清晰,新人接手更佳容易可以按组件分配开发任务。

  项目可维護性更强提高开发效率。

  更好排查问题某个组件出现问题,直接对组件进行处理

  开发测试过程中,可以只编译自己那部分玳码不需要编译整个项目代码。

  方便集成项目需要哪个模块直接通过集成即可。

  进行组件化开发后可以把每个组件当做一個独立的app,每个组件甚至可以采取不同的架构例如分别使用、、等架构,根据自己的编程习惯做选择

  蘑菇街通过实现中间层,由進行组件间的消息转发从名字上来说更像是“路由器”。实现方式大致是在提供服务的组件中提前注册,然后在调用方组件中通过调鼡下面是调用方式。

  是一个单例对象在其内部维护着一个格式的注册表,通过这个注册表来保存服务方注册的以及使调用方可鉯通过映射出,并通过对服务方发起调用

  是所有组件的调度中心,负责所有组件的调用、切换、特殊处理等操作可以用来处理一切组件间发生的关系。除了原生页面的解析外还可以根据URL跳转H页面。

  在服务方组件中都对外提供一个在中声明当前组件所提供的所有功能,这样其他组件想知道当前组件有什么功能直接看即可。每一个都对应着一个调用方可以通过对发起调用。

  在组件内部實现的注册工作以及对外提供服务的代码实现。在注册的时候需要注意注册时机应该保证调用时对应的已经注册。

  蘑菇街项目使鼡作为版本控制工具将每个组件都当做一个独立工程,并建立主项目来集成所有组件集成方式是在主项目中通过来集成,将所有组件當做二方库集成到项目中详细的集成技术点在下面“标准组件化架构设计”章节中会讲到。

  下面代码模拟对详情页的注册、调用茬调用过程中传递参数。参数传递可以有两种方式类似于Get请求在后面拼接参数,以及通过字典传递参数下面是注册的示例代码:

  通过方法传入的参数,对详情页已经注册的方法发起调用调用方式类似于请求,地址后面拼接参数

  也可以通过字典方式传参,提供了带有字典参数的方法这样就可以传递非字符串之外的其他类型参数,例如对象类型参数

  有的时候组件间调用过程中,需要服務方在完成调用后返回相应的参数蘑菇街提供了另外的方法,专门来完成这个操作

  通过下面的方式发起调用,并获取服务方返回嘚返回值要做的就是传递正确的和参数即可。

  这时候会发现一个问题在蘑菇街组件化架构中,存在了很多硬编码的URL和参数在代碼实现过程中编写出错会导致调用失败,而且参数是一个字典类型调用方不知道服务方需要哪些参数,这些都是个问题

  对于这些數据的管理,蘑菇街开发了一个页面这个页面统一来管理所有的和参数,和都使用这一套可以保持统一性。

  在项目中存在很多公囲部分的东西例如封装的网络请求、缓存、数据处理等功能,以及项目中所用到的资源文件蘑菇街将这些部分也当做组件,划分为基礎组件位于业务组件下层。所有业务组件都使用同一套基础组件也可以保证公共部分的统一性。

  为了解决方案中硬编码以及字典参数类型不明确等问题,蘑菇街在原有组件化方案的基础上推出了方案方案由两部分组成,进行组件间通信的类以及协议类

  通過中间件进行消息的调用转发,在内部维护一张映射表映射表由之前的变成。

  在中间件中创建文件服务方组件将可以用来调用的方法都定义在中,将所有服务方的都分别定义到文件中如果协议比较多也可以分开几个文件定义。这样所有调用方依然是只依赖中间件不需要依赖除中间件之外的其他组件。

  方案中每个组件需要一个MGJModuleImplement此类负责实现当前组件对应的协议方法,也就是对外提供服务的實现在程序开始运行时将自身的注册到中,并将反射为字符串当做

  Protocol方案依然需要提前注册服务,由于方案是返回一个并将反射為对象再调用方法,这种方式不会直接调用类的内部逻辑可以将方案的注册,都放在类对应的中或者专门建立一个类。

  创建类当莋组件对外公开的类并在中定义协议,由类实现协议中定义的方法完成对外提供服务的过程。下面是协议定义:

  遵守协议并实现萣义的方法外界通过获取的并实例化为对象,调用服务方实现的协议方法

  的协议注册方法,注册时将反射为字符串当做存储的將实现协议的当做值存储。通过取的时候就是通过从中将映射出来。

  调用时通过从中映射出注册的将获取到的实例化,并调用实現的协议方法完成服务调用

  蘑菇街是和混用的方式,两种实现的调用方式不同但大体调用逻辑和实现思路类似。在不能满足需求戓调用不方便时就可以通过的方式调用。

  在进入程序后先使用对服务方组件进行注册。每个对应一个的实现中的代码就是组件對外提供的服务,调用方可以通过调用这个服务

  调用方通过调用方法,并将被调用代码对应的传入会根据查找对应的实现,从而調用组件的代码进行通信

  调用和注册时,有一个字典用来传递参数这样的优势就是参数类型和数量理论上是不受限制的,但是需偠很多硬编码的名在项目中

  蘑菇街组件化方案有两种,和的方式但都需要进行操作。注册的是注册的是,注册表是一个类型的芓典而字典的拥有者又是一个单例对象,这样会造成内存的常驻

  下面是对两种实现方式内存消耗的分析:

  首先说一下方案可能导致的内存问题,由于会对代码块内部对象进行持有如果使用不当很容易造成内存泄漏的问题。

  自身实际上不会造成很大的内存泄漏主要是内部引用的变量,所以在使用时就需要注意强引用的问题并适当使用修饰对应的变量。以及在适当的时候释放对应的变量。

  除了对外部变量的引用在代码块内部尽量不要直接创建对象,应该通过方法调用中转一下

  对于协议这种实现方式,和内存常驻方式差不多只是将存储的对象换成对象。这实际上是存储的类对象类对象本来就是单例模式,所以不会造成多余内存占用

  casatwy组件化方案可以处理两种方式的调用,远程调用和本地调用对于两个不同的调用方式分别对应两个接口。

  远程调用通过代理方法傳递到当前应用后调用远程接口并在内部做一些处理,处理完成后会在远程接口内部调用本地接口以实现本地调用为远程调用服务。

  本地调用由方法负责但调用方一般不直接调用方法。会对外提供明确参数和方法名的方法在方法内部调用方法和参数的转换。

  casatwy提出的组件化架构

  casatwy是通过类实现组件化的在此类中对外提供明确参数类型的接口,接口内部通过方法调用服务方组件的、由于類的调用是通过主动发现服务的,所以服务方对此类是完全解耦的

  但如果类对外提供的方法都放在此类中,将会对造成极大的负担囷代码量解决方法就是对每个服务方组件创建一个的,并将对服务方的调用放在对应的中这些都属于中间件,从而实现了感官上的接ロ分离

  casatwy组件化实现细节

  对于服务方的组件来说,每个组件都提供一个或多个类在类中声明方法。类是当前组件对外提供的一個“服务类”将当前组件中所有的服务都定义在里面,通过主动发现服务

  在中的所有方法,都只有一个字典参数所以可以传递嘚参数很灵活,这也是casatwy提出的去化的概念在的方法实现中,对传进来的字典参数进行解析再调用组件内部的类和方法。

  casatwy为我们提供了一个Demo通过这个可以很好的理解casatwy的设计思路,下面按照我的理解讲解一下这个

  打开后可以看到文件目录非常清楚,在上图中用藍框框出来的就是中间件部分红框框出来的就是业务组件部分。我对每个文件夹做了一个简单的注释包含了其在架构中的职责。

  茬中定义远程调用和本地调用的两个方法其他业务相关的调用由完成。

  在中定义的的为其他组件提供了一个获取控制器并跳转的功能,下面是代码实现由于casatwy的方案中使用的方式进行调用,所以涉及到很多硬编码字符串的问题casatwy采取定义常量字符串来解决这个问题,这样管理也更方便

  下面是组件中提供的服务,被定义在类中这些服务可以被通过的方式调用,这个过程就叫做发现服务

  茬中对传递的参数做了处理,以及内部的业务逻辑实现方法是发生在内部的,这样就可以保证组件内部的业务不受外部影响对内部业務没有侵入性。

  在大型项目中代码量比较大需要避免命名冲突的问题。对于这个问题casatwy采取的是加前缀的方式从casatwy的中也可以看出,其组件的命名为可以区分各个组件的。被调用的命名为可以区分组件内的方法与对外提供的方法。

  casatwy将类和方法的命名都统一按照其功能做区分当做前缀,这样很好的将组件相关和组件内部代码进行了划分

  从我调研和使用的结果来说,并不推荐使用方案首先方案的代码量就比方案的要多,调用和注册代码量很大调用起来并不是很方便。

  本质上来说方案是通过类对象实例一个变量并調用变量的方法,并没有真正意义上的改变组件之间的交互方案但的方案却通过的方式改变和统一了组件间调用方式。

  并且没有对嘚支持不能直接处理来自的调用,在灵活性上就不如的方案

  我并不推荐方案,这套方案实际上是一套很臃肿的方案虽然为提供叻很多,但实际上组件间的调用逻辑都耦合在了中间件中同样,和方案存在一个相同的问题就是调用代码量很大,使用起来并不方便

  在方案中存在很多硬编码的问题,例如、以及参数名都是硬编码在中间件中的这种调用方式并不灵活直接。

  但casatwy提出了去化的想法我觉得这在组件化中传参来说,是非常灵活的这点我比较认同。相对于的话也采用了去化的传参方式,而不是直接传递模型对潒组件化传参并不适用传模型对象,但组件内部还是可以使用的

  方案是一套非常轻量级的方案,其中间件代码总共也就两百行以內非常简洁。在调用时直接通过调用调用起来很简单,我推荐使用这套方案作为组件化架构的中间件

  最强大的一点在于,统一叻远程调用和本地调用这就使得可以通过的方式,进行任何允许的组件间调用对项目运营是有很大帮助的。

  这三套方案都实现了組件间的解耦和都是调用方对中间件的耦合,是中间件对组件的耦合都是单向耦合。

  在三套方案中服务方组件都对外提供一个戓,在文件中统一定义对外提供的服务组件间通信的实现代码大多数都在里面。

  但三套实现方案实现方式并不同蘑菇街的两套方案都需要注册操作,无论是还是都需要注册后才可以提供服务而casatwy的方案则不需要,直接通过调用

  在上面文章中提到了casatwy方案的,蘑菇街方案的和之后将统称为中间件,下面让我们设计一套组件化架构

  组件化架构中,需要一个主工程主工程负责集成所有组件。每个组件都是一个单独的工程创建不同的私有仓库来管理,每个组件都有对应的开发人员负责开发开发人员只需要关注与其相关组件的代码,不用考虑其他组件这样来新人也好上手。

  组件的划分需要注意组件粒度粒度根据业务可大可小。组件划分可以将每个業务模块都划分为组件对于网络、数据库等基础模块,也应该划分到组件中项目中会用到很多资源文件、配置文件等,也应该划分到對应的组件中避免重复的资源文件。项目实现完全的组件化

  每个组件都需要对外提供调用,在对外公开的类或组件内部注册对應的。组件处理中间件调用的代码应该对其他代码无侵入只负责对传递过来的数据进行解析和组件内调用的功能。

  每个组件都是一個单独的工程在组件开发完成后上传到仓库。主工程通过集成各个组件集成和更新组件时只需要即可。这样就是把每个组件当做第三方来管理管理起来非常方便。

  可以控制每个组件的版本例如在主项目中回滚某个组件到特定版本,就可以通过修改文件实现选擇主要因为其本身功能很强大,可以很方便的集成整个项目也有利于代码的复用。通过这种集成方式可以很好的避免在传统项目中代碼冲突的问题。

  对于组件化架构的集成方式我在看完bang的博客后专门请教了一下bang。根据在微博上和bang的聊天以及其他博客中的学习在主项目中集成组件主要分为两种方式――源码和,但都是通过来集成

  无论是用管理源码,还是直接管理集成方式都是一样的,都昰直接进行等操作

  这两种组件集成方案,实践中也是各有利弊直接在主工程中集成代码文件,可以看到其内部实现源码方便在主工程中进行调试。集成的方式可以加快编译速度,而且对每个组件的代码有很好的保密性如果公司对代码安全比较看重,可以考虑嘚形式

  例如手机QQ或者支付宝这样的大型程序,一般都会采取的形式而且一般这样的大公司,都会有自己的组件库这个组件库往往可以代表一个大的功能或业务组件,直接添加项目中就可以使用关于组件化库在后面讲淘宝组件化架构的时候会提到。

  对于项目Φ图片的集成可以把图片当做一个单独的组件,组件中只存在图片文件没有任何代码。图片可以使用和进行管理如果是就针对不同業务模块建立不同的,如果是就按照不同的模块分类建立不同的,将所有资源放在同一个组件内

  和两者相比,我还是更推荐用的方式因为自身提供很多功能(例如设置图片拉伸范围),而且在打包之后图片会被打包在文件中不会被看到。(现在也可以通过工具对文件進行解析获取里面的图片)

  使用,所有的资源文件都放置在一个中主工程可以直接引用这个,假设此名为:而这个的里面配置信息可以写为:

  主工程则直接在文件中加入:

  这样即可在主工程直接访问到中的资源文件(不局限图片,、、亦可在设置好配置信息即可)了。

  组件化开发可以很好的提升代码复用性组件可以直接拿到其他项目中使用,这个优点在下面淘宝架构中会着重讲一丅

  对于调试工作,可以放在每个组件中完成单独的业务组件可以直接提交给测试使用,这样测试起来也比较方便最后组件开发唍成并测试通过后,再将所有组件更新到主项目提交给测试进行集成测试即可。

  通过这样的组件划分组件的开发进度不会受其他業务的影响,可以多个组件并行开发组件间的通信都交给中间件来进行,需要通信的类只需要接触中间件而中间件不需要耦合其他组件,这就实现了组件间的解耦中间件负责处理所有组件之间的调度,在所有组件之间起到控制核心的作用

  组件化框架清晰的划分叻不同模块,从整体架构上来约束开发人员进行组件化开发实现了组件间的物理隔离。组件化架构在各个模块之间天然形成了一道屏障避免某个开发人员偷懒直接引用头文件,产生组件间的耦合破坏整体架构。

  使用组件化架构进行开发时因为每个人都负责自己嘚组件,代码提交也只提交自己负责模块的仓库所以代码冲突的问题会变得很少。

  假设以后某个业务发生大的改变需要对相关代碼进行重构,可以在单个组件内进行重构组件化架构降低了重构的风险,保证了代码的健壮性

  在方案中,是通过调用方法并传入來发起调用的鉴于协议名等固定格式,可以通过判断协议名的方式使用配置表控制和的切换,配置表可以从后台更新只需要将协议洺更改一下即可。

  假设现在线上的组件出现严重在后台将配置文件中原有的本地换成的,并更新客户端配置文件

  在调用时传叺这个的即可完成切换,判断如果传进来的是一个的就直接跳转而且可以传递参数给,只需要内部做参数截取即可

  使用组件化架構开发,组件间的通信都是有成本的所以尽量将业务封装在组件内部,对外只提供简单的接口即“高内聚、低耦合”原则。

  把握恏组件划分粒度的细化程度太细则项目过于分散,太大则项目组件臃肿但是项目都是从小到大的一个发展过程,所以不断进行重构是掌握这个组件的细化程度最好的方式

  如果通过等二进制形式,将组件集成到主项目中需要注意预编译指令的使用。因为预编译指囹在打包的时候就已经在组件二进制代码中打包好,到主项目中的时候预编译指令其实已经不再起作用了而是已经在打包时按照预编譯指令编码为固定二进制。

  对于项目架构来说一定要建立于业务之上来设计架构。不同的项目业务不同组件化方案的设计也会不哃,应该设计最适合公司业务的架构

  我公司项目是一个地图导航应用,业务层之下的核心模块和基础模块占比较大涉及到地图SDK、算路、语音等模块。且基础模块相对比较独立对外提供了很多调用接口。由此可以看出公司项目是一个重逻辑的项目,不像电商等偏展示

  项目整体的架构设计是:层级架构+组件化架构,对于具体的实现细节会在下面详细讲解采取这种结构混合的方式进行整体架構,对于组件的管理和层级划分比较有利符合公司业务需求。

  在设计架构时我们将整个项目都拆分为组件,组件化程度相当高鼡到哪个组件就在工程中通过进行集成,并通过统一所有组件间的通信

  组件化架构是项目的整体框架,而对于框架中每个业务模块嘚实现可以是任意方式的架构,、、等都是可以的只要通过将组件间的通信方式统一即可。

  组件化架构在物理结构上来说是不分層次的只有组件与组件之间的划分关系。但是在组件化架构的基础上应该根据项目和业务设计自己的层次架构,这套层次架构可以用來区分组件所处的层次及职责所以我们设计了层级架构+组件化架构的整体架构。

  我公司项目最开始设计的是三层架构:业务层 -> 核心層 ( + ) -> 基础层其中核心层又分为和两部分。但是这种架构会造成核心层过重基础层过轻的问题,这种并不适合组件化架构

  在三层架構中会发现,层并没有耦合业务逻辑在同层级中是比较独立的,职责较为单一和基础我们对层下沉到基础层中,并和基础层进行合并所以架构被重新分为三层架构:业务层 -> 核心层 -> 基础层。之前基础层大多是资源文件和配置文件在项目中存在感并不高。

  在分层架構中需要注意只能上层对下层依赖,下层对上层不能有依赖下层中不要包含上层业务逻辑。对于项目中存在的公共资源和代码应该將其下沉到下层中。

  在三层架构中业务层负责处理上层业务,将不同业务划分到相应组件中例如组件、导航组件、用户组件等。業务层的组件间关系比较复杂会涉及到组件间业务的通信,以及业务层组件对下层组件的引用

  核心层位于业务层下方,为业务层提供业务支持如网络、语音识别等组件应该划分到核心层。核心层应该尽量减少组件间的依赖将依赖降到最小。核心层有时相互之间吔需要支持例如经纬度组件需要网络组件提供网络请求的支持,这种是不可避免的

  其他比较基础的模块,都放在基础层当做基础組件例如、地图、加密算法等,这些组件都比较独立且不掺杂任何业务逻辑职责更加单一,相对于核心层更底层可以包含第三方库、资源文件、配置文件、基础库等几大类,基础层组件相互之间不应该产生任何依赖

  在设计各个组件时,应该遵循“高内聚低耦匼”的设计规范,组件的调用应该简单且直接减少调用方的其他处理。对于核心层和基础层的划分可以以是否涉及业务、是否涉及同級组件间通信、是否经常改动为参照点。如果符合这几点则放在核心层如果不符合则放在基础层。

  新建一个项目后首先将配置文件、、容器等集成到主工程中,做一些基础的项目配置随后集成需要的组件即可。项目被整体拆分为组件化架构后应用对所有组件的集成方式都是一样的,通过将需要的组件集成到项目中通过组件化的方式,使得开发新项目速度变得非常快

  在集成业务层和核心層组件后,组件间的通信都是由进行通信项目中不允许直接依赖组件源码。而基础层组件则在集成后直接依赖例如资源文件和配置文件,这些都是直接在主工程或组件中使用的第三方库则是通过核心层的业务封装,封装后由进行通信但核心层也是直接依赖第三方库源码的。

  组件的集成方式有两种源码和的形式,我们使用的方式集成因为一般都是项目比较大才用组件化的,但大型项目都会存茬编译时间的问题如果通过则会大大减少编译时间,可以节省开发人员的时间

  对于组件间通信,我们采用的方案因为现在已经佷稳定了,而且可以满足蘑菇街这样量级的需求证明是很好的,没必要自己写一套再慢慢踩坑

  的好处在于,其调用方式很灵活通过注册并在中处理回调,通过直接调用或者字典的方式进行调用由于通过拼接参数或字典传值,所以其参数类型没有数量限定传递仳较灵活。在通过调用后可以在中处理完成逻辑。

  有个问题在于在编写组件间通信的代码时,会涉及到大量的对于的问题,蘑菇街开发了一套后台系统将所有的需要的和参数名,都定义到这套系统中我们维护了一个表,内部按不同组件进行划分包含和传参洺以及回调参数。

  组件化架构需要注意路由层的安全问题方案可以处理本地及远程的调用,如果是程序内组件间的调用则不需要進行校验。而跨应用的调用则需要进行合法性检查。这是为了防止第三方伪造进行调用所以对应用外调起的进行的合法性检查,例如其他应用调起、服务器等

  在合法性检查的设计上,每个从应用外调起的合法都会带有一个在本地会对进行校验。这种方式的优势茬于没有网络请求的限制和延时。

  在项目中经常会用到代理模式传值代理模式在中主要分为三部分,协议、代理方、委托方三部汾

  但如果使用组件化架构的话,会涉及到组件与组件间的代理传值代理方需要设置为委托方的,但组件间是不可以直接产生耦合嘚对于这种跨组件的代理情况,我们直接将代理方的对象通过以参数的形式传给另一个组件在另一个组件中进行代理设置。

  协议嘚定义放在委托方组件的中代理方组件只引用这个文件,不耦合委托方内部代码为了避免定义的代理方法中出现耦合的情况,方法中鈈能出现和组件内部业务有关的对象只能传递系统的类。如果涉及到交互的情况则通过协议方法的返回值进行。

  可以在时传入一個参数在接触之后,我在想是不是可以把参数变为参数直接传一个信号过去。

  这种方式是可行的使用方式优点在于,相对于直接传字典过去更加灵活并且具备的诸多特性。但缺点也不少信号控制不好乱用的话也很容易挖坑,是否使用还是看团队情况了

  茬项目中经常会定义一些常量,例如通知名、常量字符串等这些常量一般都和所属组件有很强的关系,不好单独拆出来放到其他组件泹是这些变量数量并不是很多,而且不是每个组件中都有

  所以,我们将这些变量都声明在文件中其他组件只能引用文件,不能引鼡组件内部业务代码这样就规避掉了组件间耦合的问题。

  在项目中经常会用到页面如果能通过点击页面调起原生页面,这样的话囷的融合会更好所以我们设计了一套和交互的方案,这套方案可以使用的方式调起原生页面实现方式也很简单,并且这套方案和原本嘚跳转逻辑并不冲突

  通过自带创建一个页面后,可以通过调用下面的函数和通信调用时可以传入新的,这个可以设置为的

  通过刷新页面时,会调用下面的代理方法如果方法返回,则会根据协议进行跳转

  跳转时系统会判断通信协议,如果是等标准协议则会在当前页面进行刷新。如果跳转协议在中注册则会通过系统的方式调用到的系统代理方法中,在代理方法中调用则可以通过页媔唤起原生页面。

  在应用启动过程中通常会做一些初始化操作。有些初始化操作是运行程序所需要的例如崩溃统计、建立服务器嘚长连接等。或有的组件会对初始化操作有依赖关系例如网络组件依赖等。

  对于应用启动时的初始化操作应该创建一个来统一管悝启动操作,将初始化操作都放在里面包含创建根控制器等。其中有的初始化操作需要尽快执行有的并不需要立即执行,可以根据不哃操作设定优先级来管理所有初始化操作。

  项目中存在很多的模型定义那组件化后这些模型应该定义在哪呢?

  casatwy对模型类的观點是去化简单来说就是用字典代替存储数据。这对于组件化架构来说是解决组件之间数据传递的一个很好的方法。但是去的方式会存在大量的字段读取代码,使用起来远没有模型类方便

  因为模型类是关乎业务的,理论上必须放在业务层也就是业务组件这一层泹是要把模型对象从一个组件中当做参数传递到另一个组件中,模型类放在调用方和被调方的哪个组件都不太合适而且有可能不只两个組件使用到这个模型对象。这样的话在其他组件使用模型对象必然会造成引用和耦合。

  如果在用到这个模型对象的所有组件中都汾别维护一份相同的模型类,或者各自维护不同结构的模型类这样之后业务发生改变模型类就会很麻烦,这是不可取的

  如果将所囿模型类单独拉出来,定义一个模型组件呢

  这个看起来比较可行,将这个定义模型的组件下沉到基础层模型组件不包含业务,只聲明模型对象的类如果将原来各个组件的模型类定义都拉出来,单独放在一个组件中可以将原有各组件的层变得很轻量,这样对整个項目架构来说也是有好处的

  在通过进行组件间调用时,通过字典进行传值这种方式比较灵活。在组件内部使用层时还是用模型組件中定义的类。层建议还是用对象的形式比较方便不建议整体使用去化的设计。在接收到其他组件传递过来的字典参数时可以通过類提供的初始化方法,或其他转框架将字典转为对象

  我公司持久化方案用的是,所有模型的定义都在组件中则不需要再单独创建┅个模型组件。

  我公司项目是一个常规的地图类项目首页和百度、高德等主流地图导航一样,有很多添加在地图上的控件有的版夲会添加控件上去,而有的版本会删除控件与之对应的功能也会被隐藏。

  所以有次和组里小伙伴们开会的时候就在考虑,能不能茬服务器下发代码对首页进行布局!这样就可以对首页进行动态布局例如有活动的时候在指定时间显示某个控件,这样可以避免审核慢嘚问题又或者线上某个模块出现问题,可以紧急下架出问题的模块

  对于这个问题,我们设计了一套动态配置方案这套方案可以對整个进行配置。

  对于动态配置的问题我们简单设计了一个配置表,初期打算在首页上先进行试水以后可能会布置到更多的页面仩。这样应用程序各模块的入口都可以通过配置表来控制,并且通过控制页面间跳转灵活性非常大。

  在第一次安装程序时使用内置的配置表之后每次都用服务器来替换本地的配置表,这样就可以实现动态配置应用下面是一个简单设计的配置数据,中配置的是首頁的配置信息用来模拟服务器下发的数据,真正服务器下发的字段会比这个多很多

  对于服务器返回的数据,我们会创建一套解析器这个解析器用来将解析并“转换”为标准的控件。点击后的事件都通过进行跳转所以首页的灵活性和的使用程度成正比。

  这套方案类似于的方案从服务器下发页面展示效果,但没有功能那么全相对而言是一个轻量级的配置方案,主要用于页面配置

  除了頁面的配置之外,我们发现地图类一般都存在过大的问题这样在下载时很消耗流量以及时间。所以我们就在想能不能把资源也做到动态配置在用户运行程序的时候再加载资源文件包。

  我们想通过配置表的方式将图片资源文件都放到服务器上,图片的也随配置表一起从服务器获取在使用时请求图片并缓存到本地,成为真正的网络在此基础上设计缓存机制,定期清理本地的图片缓存减少用户磁盤占用。

  之前看过滴滴负责人李贤辉的技术分享分享的是滴滴客户端的架构发展历程,下面简单总结一下

  滴滴在最开始的时候架构较混乱。然后在.时期重构为架构使项目划分更加清晰。在.时期上线了新的业务线这时开始采用游戏开发中的状态机机制,暂时鈳以满足现有业务

  然而在后期不断上线顺风车、代驾、巴士等多条业务线的情况下,现有架构变得非常臃肿代码耦合严重。从而茬年开始了代号为的方案这套方案就是滴滴的组件化方案。

  滴滴的组件化方案和蘑菇街方案类似,将项目拆分为各个组件通过來集成和管理各个组件。项目被拆分为业务部分和技术部分业务部分包括专车、拼车、巴士等组件,使用一个管理技术部分则分为登錄分享、网络、缓存这样的一些基础组件,分别使用不同的管理

  组件间通信通过中间件进行通信,类似于担负起协调和调用各个組件的作用。组件间通信通过方法来进行对应的调用。内部保存一份的映射表通过找到并发起调用,的注册放在方法中进行

  滴滴在业务组件内部使用混合的架构,两种架构都是的衍生版本其中中的负责数据相关逻辑,例如订单状态、地址管理等数据处理通过Φ的给控制器瘦身,最后的代码量就很少了

  滴滴文章中说道首页只能有一个地图实例,这在很多地图导航相关应用中都是这样做的滴滴首页主控制器持有导航栏和地图,每个业务线首页控制器都添加在主控制器上并且业务线控制器背景都设置为透明,将透明部分響应事件传递到下面的地图中只响应属于自己的响应事件。

  由主控制器来切换各个业务线首页切换页面后根据不同的业务线来更噺地图数据。

  本章节源自于宗心在阿里技术沙龙上的一次技术分享

  淘宝客户端初期是单工程的普通项目但随着业务的飞速发展,现有架构并不能承载越来越多的业务需求导致代码间耦合很严重。后期开发团队对其不断进行重构将项目重构为组件化架构,淘宝囷两个平台除了某个平台特有的一些特性或某些方案不便实施之外,大体架构都是差不多的

  刚开始是普通的单工程项目,以传统嘚架构进行开发随着业务不断的增加,导致项目非常臃肿、耦合严重

  年淘宝开启"all in 无线"计划,计划将淘宝变为一个大的平台将阿裏系大多数业务都集成到这个平台上,造成了业务的大爆发

  淘宝开始实行插件化架构,将每个业务模块划分为一个子工程将组件鉯二方库的形式集成到主工程。但这种方式并没有做到真正的拆分还是在一个工程中使用进行,这样还会造成合并冲突、不好回退等问題

  迎来淘宝移动端有史以来最大的重构,将其重构为组件化架构将每个模块当做一个组件,每个组件都是一个单独的项目并且將组件打包成。主工程通过集成所有组件的实现业务之间真正的隔离,通过实现组件化架构

  淘宝是使用来做源码管理的,在插件囮架构时需要尽可能避免操作否则在大团队中协作成本是很大的。而使用进行组件化开发则避免了这个问题。

  在中可以通过很好嘚配置各个组件包括组件的增加和删除,以及控制某个组件的版本使用的原因,很大程度是为了解决大型项目中代码管理工具代码導致的冲突。并且可以通过配置文件轻松配置项目。

  每个组件工程有两个一个负责编译当前组件和运行调试,另一个负责打包先在组件工程做测试,测试完成后再集成到主工程中集成测试

  每个组件都是一个独立,可以独立开发、测试使得业务组件更加独竝,所有组件可以并行开发下层为上层提供能满足需求的底层库,保证上层业务层可以正常开发并将底层库封装成集成到主工程中。

  使用进行组件集成的好处在于在集成测试自己组件时,可以直接在本地主工程中通过使用当前组件源码,可以直接进行集成测试不需要提交到服务器仓库。

  淘宝四层架构(图片来自淘宝技术分享)

  淘宝架构的核心思想是一切皆组件将工程中所有代码都抽象為组件。

  淘宝架构主要分为四层最上层是组件(业务组件),依次往下是容器(核心层)中间件(功能封装),基础库(底层库)容器层为整个架构的核心,负责组件间的调度和消息派发

  总线设计:路由+服务+消息。统一所有组件的通信标准各个业务间通过总线进行通信。

  总线设计(图片来自淘宝技术分享)

  通过总线对三端进行了统一一个可以调起、、前端三个平台,产品运营和服务器只需要下发一套即可调用对应的组件

  路由可以发起请求也可以接受返回值,和差不多路由请求可以被解析就直接拿来使用,如果不能被解析就跳转页面这样就完成了一个对不存在组件调用的兼容,使用户手中比较老的版本依然可以显示新的组件

  服务提供一些公共服务,甴服务方组件负责实现通过进行调用。

  应用通过消息总线进行事件的中心分发类似于的通知机制。例如客户端前后台切换则可鉯通过消息总线分发到接收消息的组件。因为通过只是一对一的进行消息派发和调度如果多次注册同一个,则会被覆盖掉

  在组件囮架构的基础上,淘宝提出的概念可以通过已有组件,进行简单配置后就可以组成一个新的出来解决了多个应用业务复用的问题,防圵重复开发同一业务或功能

  即,容器即所有被集成到上,使每个组件的开发就像开发一样简单这样就做到了从巨型回归普通的輕盈,使大型项目的开发问题彻底得到了解决

  到目前为止组件化架构文章就写完了,文章确实挺长的看到这里真是辛苦你了。下媔留个小思考把下面字符串复制到微信输入框随便发给一个好友,然后点击下面链接大概也能猜到微信的组件化方案

  各位可以来峩博客评论区讨论,可以讨论文中提到的技术细节也可以讨论自己公司架构所遇到的问题,或自己独到的见解等等无论是不是架构师戓新入行的开发,欢迎各位以一个讨论技术的心态来讨论在评论区你的问题可以被其他人看到,这样可能会给其他人带来一些启发

  地址:蘑菇街和组件化方案,其上都给出了这里就贴出其地址了。

  好多朋友在看完这篇文章后都问有没有。其实架构是思想上嘚东西重点还是理解架构思想。文章中对思想的概述已经很全面了用多个项目的例子来描述组件化架构。就算提供了也没法把套在其他工程上用,因为并不一定适合所在的工程

  后来想了一下,我把组件化架构的集成方式简单写了个,这样可以解决很多人在架構集成上的问题我把放在我Github上了,用Coding的服务器来模拟我公司私有服务器直接拿来当工程中的。下面是地址麻烦各位记得点个star。

  組件化架构集成Demo

  由于简书排版并不是很好所以做了一个版的《组件化架构漫谈》,放在我上了上有文章目录,方便阅读下面是哋址。

  如果你觉得不错请把PDF帮忙转到其他群里,或者你的朋友让更多的人了解组件化架构,衷心感谢!

}

你好我想利用假期去白城做昆奣做双眼皮延安应到,目前需要帮忙解答一下白城哪个专家做昆明做双眼皮延安应到口碑不错求回复!

}

我要回帖

更多关于 昆明做双眼皮延安应到 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信