为什么要组件化?

  • 运用体积越来越大
  • 事务代码耦合越来越多
  • 代码量增加
  • 不易于功用复用

组件化的优缺陷

长处

  1. 事务分层、解耦,易于维护代码
  2. 便于各个事务功用拆分、抽离,实现真实的功用复用
  3. 事务阻隔,利于跨团队开发代码操控和版本风险操控的实现
  4. 组件化对代码封装性、合理性都有一定的要求,提升开发人员的规划能力

缺陷

  1. 增加开发人员的学习成本
  2. 增加了代码的冗余,组件化颗粒度越细,中间代码越多
  3. 增加了项目的复杂度

组件化计划有哪些?对应的优缺陷?

  • Target-Action: CTMediator

    Target-Action这个计划是根据ObjCruntimecategory 特性动态获取模块,例如通过NSClassFromString 获取类并创立实例,通过 performSelector + NSInvocation动态调用办法。

    首要每个模块需要装备Target和Category,其中Target是每个组件对应一个或者多个Target,Category是中间层Mediator的分类,运用分类的目的是为了让Mediator的事务代码分离,然后降低Mediator中的依靠和耦合性。

    中间层Mediator利用了runtime的反射机制,在Category中找到对应Target以及对应的Action进行调用组件

    长处

    • 解耦,只存在组件依靠中间层(单向依靠)
    • 利用 Category 能够清晰声明的接口,进行编译查看
    • 一致处理了一切组件间调用进口,方便办理

    缺陷

    • 每个组件有对应的Category中间件,代码量增加
    • 有硬编码问题,界说的String
  • URL Scheme: JLRoutes、MGJRouter

    JLRoutes全局会保存一个Map,这个Map会以scheme为Key,JLRoutes为Value。所以在routeControllerMap里边每个scheme都是仅有的。

    在每个JLRoutes里边都保存了一个数组,这个数组里边保存了每个路由规矩JLRRouteDefinition里边会保存外部传进来的block闭包,pattern,和拆分之后的pattern。

    长处

    • 服务器能够动态操控页面跳转,能够一致处理页面问题之后的错误处理,能够一致三端(iOS、Android、H5)的恳求方式

    缺陷

    • URL短链接分布注册,导航的硬编码较多
    • Class的load办法进行注册,太多对启动App时主线程有影响
    • 内存常驻比较严重,一切的url、class、实例,block必须提早注册
  • Protocol:BeeHive

    各个模块间从直接调用对应模块,变成以Service的方式,避免了直接依靠。App生命周期的分发,将耦合在AppDelegate中的逻辑拆分,每个模块以微运用的方式独立存在。

    长处

    • 协议接口规范,遵循依靠反转准则
    • 无硬编码

    缺陷

    • 短少一致调度层,组件办法调用分散,难于会集办理
    • 架构的灵活性不够高

项目中的组件化

架构的根底-五大准则

  1. 单一功用准则:目标功用要单一,不要在一个目标里边增加许多功用
  2. 开闭准则:扩展是敞开的,修正是关闭的
  3. 里氏替换准则:子类目标是能够代替基类目标的
  4. 接口阻隔准则:接口的用途要单一,不要在一个接口上根据不同入参实现多个功用
  5. 依靠反转准则:办法应该依靠笼统,不要依靠实例。iOS开发便是高层事务办法依靠于协议。

怎么划分组件的上基层联系?

  • 与事务无关的根底组件,比如网络恳求、图片加载等
  • 通用的功用组件,比如账号、统计埋点、付出、共享等
  • 日常迭代的事务组件

组件规划严格执行五大准则进行规划。