关于存储层总是放在底层的思考

过去我们想到3层模型、领域分层,然后总想到存储层总放在底层,或许不是只是单单的存储层。

这种思考定势是先入为主,还是自然习惯呢?这里我提出一种假设,若果存储层(数据库)只是一个页面,所有持久化都认为是一种单纯的输出,这是一种怎样的情况呢?或者有人会问“存储层”并不存在所谓的“请求”,它是被动方,是的,但我们能不能想象成是一个“阉割”的页面呢?

试想这么一个抽象:除去业务系统运算外,其他都是输入输出。(是一种脱离数据库为中心思维,也算是函数思维的一种表现)

于是乎我们有了跟以前结构不同的两层结构,而这种结构可以很轻易地将进行拓扑扩展。

或与还是有人不能很明白这结构,那么具个更贴近现实的例子:

JSP -> Action -> Service -> ... -> Dao/Repository

这是很常见的传递方式,那么若果如下呢:

JSP/Action <->
//---------------- Service/Logic
Dao/Repository <->

可能会有人说这跟过去没什么两样,这当然,因为我们没有改掉过去对每层的定义。可能甚至会有人认真看会发现不合理的地方,毕竟,这只是一个引子。其实有经验的人应该会发现,Service/logic不再调用其他东西,而是单纯地被调用。是的,这就是引入函数思维的地方,Service是逻辑表达的地方,一旦调用其他技术,肯定会被入侵,我着重说:肯定,别抱有妄想。“调用”意味着“要处理”,也就引来了与业务逻辑无关的技术处理。

过去我们常喊要领域纯净,不让其他技术入侵,能让他实现DSL描述,我想不改变现有框架是不可能实现的(或者改变现有定义)。

若想纯净,则可能要发生如下变化:

JSP <->
//---------------- Action <-> Service/Logic
Dao/Repository <->

或者变种(即把service不再为逻辑表达的地方,而是单纯的技术Service)

JSP/Action <->
//---------------- Service <-> Logic
Dao/Repository <->

而代码书写的变化是:所有事务都只是在更新状态,而不存在计算,让计算纯净话,这样的话,神马云等都轻易引入。过去“osiv是反模式”,今天可否说“事务service是反模式呢”。

关于monad在这里的意义,可能会有更深的探讨,以后再说。待续神马的没有了,以上。

你是说领域层相当于中间件,把一种IO流,转换成另一种IO流
用户输入的IO流是无序的,领域层处理过的IO流是有序的,有序的IO流可以序列化之后存储在NoSql中,也可以传递给另一个中间件继续处理

2012-10-23 19:06 "@gameboyLV"的内容
用户输入的IO流是无序的,领域层处理过的IO流是有序的 ...

这个有点意思。呵呵

2012-10-23 19:06 "@gameboyLV"的内容
你是说领域层相当于中间件,把一种IO流,转换成另一种IO流
用户输入的IO流是无序的,领域层处理过的IO流是有序的,有序的IO流可以序列化之后存储在NoSQL中,也可以传递给另一个中间件继续处理 ...

这种比喻不完全准确,用户输入只是单纯的Command,并不一定直接交由领域处理。有序无序都不是领域管的,它只单纯地运算,觉得有序无序需要考虑的,应该在进入领域前就准备好。当然中间件这样的比喻还是比较接近。领域逻辑处理的是从一种状态到另一种状态,若果以实体来说的话,就是从之前的实体到之后的实体(注意,不一定是同一个),这种方式,领域就是真正的与存储无关,它只负责事件发生,领域说:“恩,之前是那样,于是,之后是这样,足够了,存不存,或者你想对之后怎么弄都与我无关了”。

发现标题不怎么对内容,回过头来才发现

2012-10-24 10:32 "@wee"的内容
可以参考下http://www.slideshare.net/debasishg/qconny-12Domain Modeling in a Functional World

另外最好自己实践下,一个简单的想法很难有深入讨论 ...

先非常感谢。

不过我这篇目的也是在打破过去的某种固定思维,同时尝试适度改变来适应新的思想。若果真要深入讨论,那么可能要全部转成函数思维开始讨论,而且论题也就不会是对过去架构的怀疑了——又想要纯正的,又要引入的矛盾,会不会是某种固定思维引发呢?

BTW:在这里开纯函数讨论贴,感觉氛围有点不适合。

首先欣赏你有这样的想法,目前DDD也在不断融入所谓函数式编程的思想,DDD eXchange

这里也许不适合讨论纯函数,但有很多人都应该对函数式编程或者理论感兴起,应该会有不少共鸣。