NH自动变成PersistentGenericList

备忘一下:

一个RelationType=List的NH 持久化的集合属性,我把它扩展为自己的接口IListX,则必须在声明改属性的时候用这个接口,而且我发现不能用自己的实现了该接口的类来容纳这个属性。调试后才发现,原来原因是在save()操作后,NHibernate会把原来自己的类变成PersistentGenericList<T>类,所以必须用一个能存放它这个PersistentGenericList<T>类的东西在声明这个属性。(Set当然也类似)。 但我又想实现自己的一些filter方法所以使用了IListX,所以,不得不修改NHibernate的代码让PersistentGenericList<T>也实现这个接口。这样才能容纳得下。。。

 

 

Decorator设计模式

虽然设计模式分得太细会有过度的趋势,Decorator某种程度上也是一种facade模式。

但是实现起来还是比较漂亮的。

http://www.jdon.com/designpatterns/decorator.htm

这个链接的文章刚好看到的,有一个实现。虽然和上述不同,没有把成员_list 也声明为接口,而是声明为类(我改写成接口了)。

http://forum.castleproject.org/viewtopic.php?t=1770&postdays=0&postorder=asc&start=15&sid=bf7718924c8bbc6a99bacde207393932

而后面那个人的class ARList<T> : List<T>, IList<T> 的方法就不是Decorator。它没有一个内部的List<T>。这样

However, now ALL of List<T>’s methods are visible, including stuff not just in IList<T>, hence broadening what must be overridden.

但是如果我不Override,而是继续用List<T>的其他可见的方法难道不行?也许是List<T>的其他方法有些依赖Add/Remove方法的会出现问题。

另外,他们讨论的IList<T>似乎是NH的Generic而不是.net的IList<T>,要注意using指令里指定的到底是哪一个。

继续研究中…

update: IList就是System.Collection.Generic的,NH里虽然使用IList接口,但是有自己的PersistGenericList类(大概是这个名字),而它只是实现了IList接口,却不是List<T>继承出来的。所以不能直接从NH的持久化类转成List<T>.只能用Decorator,而且_list必须用接口声明才能接收NH的List<T>()出来的集合。

Cohesion&Coupling

http://www.infoq.com/news/2008/04/soa-cohesion

高内聚,低耦合不是什么新鲜东西(曾经某人的签名档)。如果吧低耦合和WebService或者SOA关联起来。那么这篇文章就是高内聚和低耦合的一场争论。

JIm Webber首先说高内聚高耦合是不好的,但低内聚低耦合的系统也同样不好扩展。进而他提出WebService不能太松散,必须要反映一个真实的商业需求才有存在的意义。换句话说更细的划分是没有意义的。(这倒是某人说过的,不能把所有的方法都封装成WebService,要在现实世界中存在的东西才有WebService)

而JJ提出内聚是过去的标准,现在要用全新的眼光来看SOA,就要提倡低耦合。

讨论还在继续。而他们显然都认为内聚和耦合不能并存或者说不能同时发展。似乎这两者必然是此消彼长的。为什么呢?如果确定一个明确的边界,就不能同时着力于两者吗?

也许是不能的。因为边界不明确。即使是文章开始部分Steve提出的三种“好”的内聚,在现实世界中也不是永恒稳定的,变成“坏”的内聚的情况随时可能发生。那么软件重构就不可避免。如何能快速地适应呢?如果一开始就把最有可能变成“坏”的内聚的“好”内聚们低耦合化,或者说WebService化,也就是分开来。是不是会好一点呢?

http://udidahan.weblogs.us/2008/04/23/visual-cobol-enterprise-processes-and-soa/

但还是那句话,边界不是确定的。某人的文章又搞出个Enterprise Process和Business Process的区别。这足以说明,很多东西完全在乎你怎么看。你可能在做低耦合的时候,破坏了一个东西的内聚性;又或者在内聚一些东西的时候,忽视了它们间低耦合的可能性。两者的结果都是代码很难改: 前者的产物是一堆分散的代码,改一个简单的过程要同时变很多地方,虽然有重构工具的帮忙,也很难说不改错一两个。后者的产物是一份自成一体的超级代码,也许没几个人能看懂,更不用说改了,而且多人团队的话还存在一个版本同步的问题。

 

这两种情况可以说都是常见的头疼的状况。有没有银弹呢?我想,只有在开发者事先已经对这种边界有一定的正确预期的情况下,事先的一些假设不能被打破。那么内聚是好的,否则。。。。至于耦合那种不良后果,虽然可以说是没有内聚好的结果。但世事逻辑相类者众,只要有了耦合和重用,那么很可能就有从新组合优化的空间的存在。。。。说来说去,还是没有一个简单的答案。。。。。