上一篇:
无敌的莉香
无敌的莉香
下午看了会程序员,看到介绍php框架,提到了thinkphp,于是下了一套来看看,它号称是一套基于rails思想的产品,那么当然着重看了下他的ROR,但是结果还是蛮失望的,首先他的ROR依然逃不了老的思路,而且在sql优化方面,他和hibernate的差距太明显了,首先是cache方面,hibernate的多级缓冲,它也写了,但是我个人认为它的代码是不知所云,完全不是那个故事,然后是把一些符号,通过内定转移的方法实现了,这不是一个好方法,而且没有必要的sql优化,当然这个要求不能太多,hibernate的优化也是基于它的hbm配置的,如果这里也有hbm我相信也能做到,但是rails不是这么考虑问题的,我个人并不喜欢hibernate的这种思路,ROR的activerecord是我认为的未来发展之路,当然它一定要解决效能问题,效能并不是完全依靠cache就能解决的,这方面要走比较长的路了,另外thinkphp对于不同数据库的支持部分可能是认为比较简单,因此并没有考量hibernate的方言机制,这意味着很多默认功能会出现问题,比如主键的设立等,这些问题已经看到它无法解决了,当然这个问题在rails里也没有解决,rails只是要求每个表都有id这个int字段,但是说实话在oracle里用int做主键会被bs的,我在oracle中都是用uuid的,主要理由就是uuid在oracle中有比自增更高超的性能,这个问题就不多说了,用过oracle的应该都知道的,在oracle里如果用自增意味着需要先select一次(当然这是oracle自己的事情,对于用户是透明的)但这样的消耗是巨大的,所以oracle里首选uuid,但在mysql中,大概90%用auto——increasment吧,否则也会被bs的,而这样的方言问题,用几个if else显然不能解决,这个问题不解决,那么thinkphp最后的数据层只能是一个死胡同。
顺便看了下它的import函数,虽然看起来像java但是问题多多,首先所谓的。×是不支持的,我看到。96里没有实现只是一个if而已,这种方法我个人认为未来都要重构,而且对于import它考虑的因素过多,反而使得他累赘,这个东西本人也写过,说实话也不太完善,主要是php的include需要绝对路径这点够傻的居然不支持相对路径,当然仔细想起来是对的,因为这是一种脚本,和java的本质就是没有编译,否则我相信完全可以产生真正的类似java的方法。但是从它目前类的函数写法如此拖沓,我可以肯定如果不改很难实现目录import因为这种只能用递归,但是他的函数本身过于累赘显然无法容易地递归,必要的分解方法是必须的,但是他没有这么做。
说了那么多不好的地方说说它的好地方,首先它实现了比较完美的单例方法,而且写了一个Base的基类,这个类类似于java的Object类。而单例的控制使用了static $statusClass并且内置了cache支持方法,而这种思路我觉得也比较可行。php的单例以前也曾经思考过,但是最后实现都很差,其实突然发现php还是很好的,因为它原始很多东西需要自己写这个时候就有个问题可以回答了,比如写一辈子java估计用static{}是天经地义的吧,谁会去思考java编译器本身怎么实现的么?不会的,除非遇到一种必须要自己去处理的语言,比如现在。正好公司有项目需要做一套简单的框架,我对mvc的理解绝不是一个控制器一个分法器那么简单,从我完全重构了spring的mvc结构开始这东西就不是我最后的目标,应该说一直以来我一直没有解决的就是model层的问题,怎么包装数据,一直以来依靠这hibernate rails结果使得自己的处理这些问题的时候就很差劲,现在终于有空间去思考了,当然任务进度我只能尽量了,没办法,否则又要被k了,上班就是这么回事情。
下面来说说我对actd的解释:
1 多表实现:多表说白了就是那么几种:1对1 1对多 多对1 双向1对多,这样分解 1对1可以理解为1对多的一种特例,多对1其实也可以理解为1对多, 双向1对多就是多对多,这是hibernate中的解释。实现上我认为直接使用rails的思路,类对象嵌套。
2 对象封装,对象表单的封装这点,但有一点做得不好,记得hibernate的update么,这是crud中一个重要方法,这个方法实现也是有一定难度的,我的想法是把得到的数据集存放在类内部,做一个更改映射表,用一个public方法比较set去修改,完后只要update下就自动执行update把修改过的变量全部处理掉。
3 DAO的兼容,这个问题是hibernate没有解决的,如果大家和我一样曾经尝试写过托管session的话就应该知道这个东西的麻烦之处了,原因就在于hibernate中没有connection的概念,而是对话概念,对话其实包含了连接,但无法拿出来用这个很复杂,而且随着hibernate的发展,它的未来可能不希望大家看到connection了,这个问题 本来上次和kavin gaven面对面的时候想问的,但是英文不行表达不好也就作罢了,但这个问题一直在我心中未决。而在php中我认为这个问题必须要解决,解决的方法很简单,开放一个dao接口,植入sql的输入和参变量的输入,但这里有个难的地方,由于php和ruby不一样不支持可变参数,这样接口很难定义,当然在java中太简单了,这也是模式书里常说的:参数传入对象吧,模式设计这样表述,当你不知道未来扩展的时候,参数传入一个复合类型总是要比传入几个固定参量要好得多。关键点,在关键时刻允许用户重写掉crud中的核心方法,代替为某个确认的dao,这个在某些时候是需要的,特别是对于设计上有问题的db系统,不可能要求对于什么都支持。
4 分页查询,这个问题对于mysql还是比较容易的,只要实现limit就好了,当然有更好的方法,我个人倾向于游标法,但这个方法貌似对于数据库的品牌有很多限制,这个以前也写过,但是实现得不够扩展,当然hibernate有方言解决了,但其他的语言就。。。所以暂时采用limit法还是可以的,至少对于mysql不要太指望,这是我个人的观点。并且要在数据层的基类中定义一个返回导航的方法。
顺便看了下它的import函数,虽然看起来像java但是问题多多,首先所谓的。×是不支持的,我看到。96里没有实现只是一个if而已,这种方法我个人认为未来都要重构,而且对于import它考虑的因素过多,反而使得他累赘,这个东西本人也写过,说实话也不太完善,主要是php的include需要绝对路径这点够傻的居然不支持相对路径,当然仔细想起来是对的,因为这是一种脚本,和java的本质就是没有编译,否则我相信完全可以产生真正的类似java的方法。但是从它目前类的函数写法如此拖沓,我可以肯定如果不改很难实现目录import因为这种只能用递归,但是他的函数本身过于累赘显然无法容易地递归,必要的分解方法是必须的,但是他没有这么做。
说了那么多不好的地方说说它的好地方,首先它实现了比较完美的单例方法,而且写了一个Base的基类,这个类类似于java的Object类。而单例的控制使用了static $statusClass并且内置了cache支持方法,而这种思路我觉得也比较可行。php的单例以前也曾经思考过,但是最后实现都很差,其实突然发现php还是很好的,因为它原始很多东西需要自己写这个时候就有个问题可以回答了,比如写一辈子java估计用static{}是天经地义的吧,谁会去思考java编译器本身怎么实现的么?不会的,除非遇到一种必须要自己去处理的语言,比如现在。正好公司有项目需要做一套简单的框架,我对mvc的理解绝不是一个控制器一个分法器那么简单,从我完全重构了spring的mvc结构开始这东西就不是我最后的目标,应该说一直以来我一直没有解决的就是model层的问题,怎么包装数据,一直以来依靠这hibernate rails结果使得自己的处理这些问题的时候就很差劲,现在终于有空间去思考了,当然任务进度我只能尽量了,没办法,否则又要被k了,上班就是这么回事情。
下面来说说我对actd的解释:
1 多表实现:多表说白了就是那么几种:1对1 1对多 多对1 双向1对多,这样分解 1对1可以理解为1对多的一种特例,多对1其实也可以理解为1对多, 双向1对多就是多对多,这是hibernate中的解释。实现上我认为直接使用rails的思路,类对象嵌套。
2 对象封装,对象表单的封装这点,但有一点做得不好,记得hibernate的update么,这是crud中一个重要方法,这个方法实现也是有一定难度的,我的想法是把得到的数据集存放在类内部,做一个更改映射表,用一个public方法比较set去修改,完后只要update下就自动执行update把修改过的变量全部处理掉。
3 DAO的兼容,这个问题是hibernate没有解决的,如果大家和我一样曾经尝试写过托管session的话就应该知道这个东西的麻烦之处了,原因就在于hibernate中没有connection的概念,而是对话概念,对话其实包含了连接,但无法拿出来用这个很复杂,而且随着hibernate的发展,它的未来可能不希望大家看到connection了,这个问题 本来上次和kavin gaven面对面的时候想问的,但是英文不行表达不好也就作罢了,但这个问题一直在我心中未决。而在php中我认为这个问题必须要解决,解决的方法很简单,开放一个dao接口,植入sql的输入和参变量的输入,但这里有个难的地方,由于php和ruby不一样不支持可变参数,这样接口很难定义,当然在java中太简单了,这也是模式书里常说的:参数传入对象吧,模式设计这样表述,当你不知道未来扩展的时候,参数传入一个复合类型总是要比传入几个固定参量要好得多。关键点,在关键时刻允许用户重写掉crud中的核心方法,代替为某个确认的dao,这个在某些时候是需要的,特别是对于设计上有问题的db系统,不可能要求对于什么都支持。
4 分页查询,这个问题对于mysql还是比较容易的,只要实现limit就好了,当然有更好的方法,我个人倾向于游标法,但这个方法貌似对于数据库的品牌有很多限制,这个以前也写过,但是实现得不够扩展,当然hibernate有方言解决了,但其他的语言就。。。所以暂时采用limit法还是可以的,至少对于mysql不要太指望,这是我个人的观点。并且要在数据层的基类中定义一个返回导航的方法。
发现mysql jdbc 5.0.3版本驱动的一个bug
2007/10/03 22:11 | by


