0%

架构

1.MVC, MVP, MVVM

这些都是架构的演变,按照MVC->MVP->MVVM,变化方向是让View能适应不断的变化,而Model尽量保持不变。

业务在Model中。由于网站的三层设计和这个有点混淆,网站三层设计UI、BLL、DAO,对应关系是UI(View+Controller), BLL+DAO(Model)。在DDD的设计中,核心业务也是在Model中,下面的DAO是支撑服务。中台设计中,业务是一个个核心微服务,DAO是支撑服务(PASS),实际存储是IASS。这些划分是按照不同的方面划分的,有联系但是不是同一个东西。
未来的架构是微服务或者是Service Mesh,都是一个目的:功能服务化,更加有弹性。

1.1 MVC

Model,View,Controller,虽然实现了分离,但是不够明确,View可以读取Model让View包含了一部分业务,耦合不够松散
MVC

1.2 MVP

对MVC做出了一些改进,让View不可以访问Model,而是通过Presenter来通信。缺点是Presenter和View的耦合关系,Presenter需要控制View的渲染。

1.3 MVVM

在MVP的基础上,让Presenter变成了VM(View-Model),核心是让View<->和ViewMode绑定了,隐藏了View的UI更新细节和ViewModel的值设置细节。
代表: WPF, Angular, React(一般不是双向绑定,而是单向绑定), Vue。

在选择架构的时候,不一定要照搬,而是要按照需求,技术,业务场景进行衡量。

比如Android为什么要用MVP,而不用MVC?那是因为Activity中不能写太多业务代码,不然维护困难。

https://blog.csdn.net/lmj623565791/article/details/46596109
https://www.cnblogs.com/xishuai/p/microservices-and-service-mesh.html

2.React

React使用了单向绑定,一是让React能专注于View,二是JS的单线程机制,不太适合大而全的功能(ViewModel本身也需要设计),而是可插拔的机制。所以React出来之后,有人设计出Flux的单向更新机制,再之后的Redux。

React,RN的架构应该是什么样的呢?MVC or MVVM。因为用了Redux,所以倾向于MVVM。View更新由Redux的connect来更新:props->render(),但是交互一块,没有绑定,使用action->reducer/saga来更新Redux。所以我觉得Mobx的适用场景可能就包括业务太多,ViewModel太大而不适合放到一个Redux的根中。

TODO:
https://segmentfault.com/q/1010000007039430
https://www.jianshu.com/p/dd61bff449a8
https://blog.csdn.net/yisuowushinian/article/details/79045058
https://www.cnblogs.com/vpersie2008/p/5771041.html

2.DDD

业务逻辑也可以写在应用层,但就不是领域驱动了,而是脚本驱动。

领域建模,切记不要以人为中心,要区分什么是系统的使用者,什么是模型中业务逻辑的参与者;如果认为某某行为是某个人做的,就把这个行为设计到人这个模型上,那就犯了以人为中心的错误了;在模型中,我们应该表达的是消息被创建并发送出去了,然后人只是这个消息模型的一部分,就是作为发送者,同样,消息接受者也是消息的一部分;实际上,消息是一个聚合根,聚合根的最根本意义是封装业务规则,那么消息的业务规则是什么呢?就是,一个消息必须至少要有一个发送者,以及接受者信息,还要有消息的标题内容等;不然这个就不是消息了;另外,发送消息显然是应用层的一个职责;那么应用层代表什么,就是代表系统;所以,我们要明白人与系统的关系;人使用系统,系统提供外部功能,系统内部有领域模型;
领域建模只对我们所关心的信息和业务规则进行建模。你既然设计了消息这个模型,就要充分考虑清楚这个模型的业务规则是什么;这个就是DDD一直强调的聚合根要有true invariants,也就是把真正的不变性封装到模型中

[不错的文章,评论也不错]http://www.cnblogs.com/xishuai/p/3820041.html#!comments

3.RN的Model

  • 尽量不用class而用interface,class会被编译,interface不会,减少代码体积。
  • 好像最后还是失血模型,因为变化最大的还是逻辑,放到模型中总是不能保障低耦合。然后封装处理函数到一个Object中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    export interface CustomContestMakeSession {
    id: string,
    gamesIds: string[],
    invitedFriends: string[],
    // more..
    }

    export const CustomeContestManager = {
    buildSubmitData:(session: CustomContestMakeSession) => {
    const submitData = {}
    submitData.id = session.id
    submitData.gameIds = session.gameIds
    submitData.invitedFriends = session.invitedFriends
    submitMaxParticipant = submitData.invitedFriends.length + 1
    // more ...
    return submitData
    },
    }

    // in Component
    const { session } = this.props
    const submitData = CustomContestManager.buildSubmitData(session)