解惑

解己之惑,解人之惑

作者:cherami (第52页共82页)

PHP的函数返回值

本来就是想修改下header.php,让我的标签列表以及分类列表的标题更好一些,因为原来的标签文章列表的标题和站点首页的是一样的,在搜索引擎收录信息里面都是一样的,不好区分,这么一个简单的功能,本来以为一分钟可以搞定的,结果因为不熟悉PHP的语法,足足弄了半个小时才搞定。原理很简单,就是取得页面的URI的值,然后判断是否包含/tag/或者/category/:
<?php if ( strpos($_SERVER["REQUEST_URI"],’/tag/’)==0 ) { ?> &raquo; 标签 &raquo; <?php  echo(urldecode(substr($_SERVER["REQUEST_URI"],5))); } ?> <?php if ( strpos($_SERVER["REQUEST_URI"],’/category/’)==0 ) { ?> &raquo; 分类 <?php } ?>
问题是strpos在没有匹配的时候返回FALSE,而PHP不是强类型语言,有匹配返回但是是第一个匹配的时候,返回的是0,而在弱类型的时候,FALSE的等价值就是0,所以上面的判断就是错的。
后来看下了手册里面,注意到里面特别提到了===判断,就是进行强类型检查的,所以修改为:
<?php if ( strpos($_SERVER["REQUEST_URI"],’/tag/’)===0 ) { ?> &raquo; 标签 &raquo; <?php  echo(urldecode(substr($_SERVER["REQUEST_URI"],5))); } ?> <?php if ( strpos($_SERVER["REQUEST_URI"],’/category/’)===0 ) { ?> &raquo; 分类 <?php } ?>

问题搞定。

我的持久层规范

昨天说了我的这个大轮子的大致情况,就是尽量保持简单,而配置最多的可能就是持久层和Action的配置,我的框架会完全取消这两个的配置,先说说持久层的情况。

  1. 类名和表名直接关联,关系是类名前带 t_
  2. 类的成员和表字段直接关联,名称完全一致,全部的表都需要一个名字为ID的主键,类型为long,由系统自动在插入的时候产生
  3. 表关联根据类之间的关联决定,如果两个类对对方都是直接引用,就是一对一,如果一个是直接引用,例外一个是集合,则是一对多,如果两边都是集合,就是多对多,对于集合的成员,其成员名是类名加s。多对多的表名是t_加两个类名,中间用_分隔,字段名就是类名加_id,如果是一对多,则外键名就是类名加_id
  4. 类型现在是自动匹配,也就是数据库的类型和类中的对应字段的类型是匹配的
  5. 主键的值在系统初始化的时候会从数据库表中读取最大值,然后缓存在系统中,每次加一
  6. 缓存的大小根据系统启动时数据库对应表的记录数决定,记录数小于一千的缓存100%,一千到一万的缓存50%,一万以上的缓存10%,十万以上缓存1%
  7. 类名可以分布在多个包中,配置文件配置都有那些包可以存放这些持久化对应的类,类名不可重复

根据这个规则,我完全取消了持久层的配置,对于新项目,这个规则的要求并不高,符合绝大部分的需要。至于查询,目前还没有完全想好,但是我考虑的是大部分的简单情况,只提供一个简单的对象表达式语法,复杂的查询还是使用SQL。

具体的例子:
阅读全文

KISS

记得最开始学习Java的时候就被它的KISS原则深深吸引了,因为那个时候正在为c++的各种语法而头疼。做了这么多年的Java开发,也感觉Java确实在语法和跨平台上符合它的这个原则,现在,Java的内容扩展越来越广,学习Java,使用好Java越来越需要对OO、设计模式、敏捷开发等深入理解并实践。
随着struts、spring和hibernate在国内的普及,越来越多的人得到提高,当然,我们也看到了以EasyJF为代表的国内开源力量的发展,在那些通用框架的基础上,他们期望能够进一步简化,实际上,我也在做这个工作,虽然我很欣赏spring和hibernate的灵活性,但是那么多的配置文件也是一个很头疼的事情,根据我自己的经验,很多应用没有必要进行配置,根据一定的规则就可以直接得到配置,为什么还要配置呢?即使是使用JDK5的新特性元数据进行简单配置我也感觉不是很必要,所以,我开始了我的大轮子计划,为自己定制一个最精简,最快速(性能和开发速度)的框架,在验证自己的设计能力的同时也可以强迫自己去学习别人的代码(但是不会全部照搬,也不会过度设计,需要的时候再重构),而且,这个框架我打算几乎完全自己构建,能够自己写的一定自己写,目前为止只使用了log4j和cglib这两个第三方的包,连连接池都是自己写的。在构造这个大轮子的过程中,我会把自己的心得体会写下来和大家交流。

使用ThreadLocal消除循环依赖

昨天刚刚说了在用Cglib完成我的持久层的设计,我实现了一个通用的clone方法,但是有一个问题,因为我在后台保留了一个和数据库记录对应的对象,其他的部分要使用的时候都是从那个记录clone一个出来,为了防止潜在的修改,必须进行深度clone,刚开始我就是用了一个简单的递归clone,但是不行,在存在关系的时候就会无休止的clone下去,最后StackOverflowError了。本来想把刚刚创建的保存下来标记一下,但是多线程不太好处理,最后想到的就是使用ThreadLocal,把刚刚clone出来还未进行深度clone的那个对象保存到ThreadLocal,如果它的关系类clone的时候需要使用对应的记录就直接返回那个引用而不是再clone,这样就不会StackOverflowError了。

IT行业的流动率

一般的IT公司的流动率都是非常的高的,我第一家公司是东软,去的是一个刚刚成立的部门,有80多人,我是刚做满了2年走的,而这个时候,和我一起去的人已经走了70%以上了,第二家公司是个刚刚成立的新公司,只有6个人,我做了半年就走了,我前脚刚走,又有两个人走了。从网上搜索到的消息看,IT公司的流动率有25%,和我经历的这些公司差不多。不过,有些公司也是例外,例如我现在的公司,我已经做了两年了,从我刚开始进这个公司到现在,真正走的人只有4个(其中一个走了半年又回来了),公司一共有30多个人,在这两年中,新招的人有8个,所以现在这个公司的流动率是非常的低的,当然,这个也得益于公司的宽松体制,因为公司不考勤,工作的进度安排比较合理,公司的整体氛围也不错。呵呵,不过很巧的是这走的几个人,都是我所在的组的头,第一个走的,是原来我这个组的组长,后来提拔为经理,但是后来还是自己出去创业去了,第二个走的就是接替他的新组长,做了一个月,第三个走的就是接替第二个的组长,做了一个月的组长也走了,第四个因为刚刚买房压力可能比较大,刚刚走。

使用Cglib

现在在做我的持久层,本来是打算现在就做延迟加载的,但是考虑到刚开始没有太大的必要,这个框架的定位还是快速开发,开发小型的应用,所以先完全加载,这样比较简单。不过还是先做了接口,开始使用的是JDK带的Proxy类,但是它只能创建Interface,不能扩展类,后来想到Cglib应该是做这个的,大致看了下,使用也很简单,就先写了一个简单的,目前只是延迟克隆(clone),因为我对数据库记录对应的对象只保留一个主要的,其他部分要使用,返回的是一个深度克隆的对象,现在使用Cglib返回一个增强的实例,保存了对那个数据库对象的引用,只有在对那个对象进行写操作的时候才进行真正的克隆并且把变化保存到克隆的对象,然后调用对象的save方法才会进行持久化并替换原来的对象,还不知道这样会有多大的性能提高,但是不会有太大的坏处。

类型转换和自动装箱

这段时间还在完成我的大轮子计划的持久化部分,本来想利用原来做的EJB单元测试的代码,结果发现自己还是对很多API不熟悉。我要将ResultSet的结果转换为Java的类型,本来是打算用一个工具类来转换的,结果发现ResultSet.getObject()返回的就是Java的类型。另外一个发现就是通过反射,JDK其实会自动为你进行装箱拆箱操作,如果传入的参数是Integer类型,而方法的实际类型是int,JDK会自动转换,反之也是一样,返回的结果是Integer,实际返回的是int,JDK也会自动转换,当然,这个JDK是1.4,不是JDK1.5。

银行

昨天到建行把借的钱暂时存成通知存款,去之前打电话问了一下,建行的通知存款只能在柜台办理,这个和交行比起来太不方便了,因为交行的多媒体终端机可以非常方便的转换为通知存款或者定期,同时也可以通过多媒体终端机撤销通知存款,然后直接把钱转成活期,而建行非要先从存折或者卡里面把钱取出来弄成一张凭证(搞得跟银票似的)。从这一点上将建行比交行差远了,但是为什么那么多人都是用建行得服务呢?因为借我钱的那些人全部都是用的建行。

RSS阅读和人类会变得更加的愚蠢

前两天写了把文章发到JR和只发到这个BLOG的巨大反差,wf说确实如此,而且要劳烦他自己在浏览器里面输入我的BLOG的地址,这个确实是一个问题,我就想到了KESO以前推荐的RSS的阅读方式,但是我不想安装一个RSS阅读器,这样也不方便,还是使用在线的方式比较好,不需要进行同步。搜索了一下,发现gougou的排名靠前,就试了下,结果很糟糕,因为它实在是太慢了。后来又想到google的个性化主页,也提供这个功能,但是现在好像自己添加一个内容比较麻烦,要从一堆地址里面选择,很可能还没有。刚刚又试了下,发现最上面的那个搜索框后面有一个小字链接:按网址添加,呵呵,出来的就是我需要的。为什么google要这样设计呢?我最开始用个性化主页的时候添加内容更方便,因为那个时候默认就是按照地址添加的(那个时候可能还没有多少人用,现在的那个内容选择列表可能没有内容),现在用的人多了,一个地址被我们添加的次数多了就出现在那个列表里面了?可惜我这个人不喜欢看那些新闻,最多看看标题知道有些什么事情发生了。然后我就想到一个很严肃的问题:是不是google认为人越来越懒惰或者愚蠢?他们更喜欢选择而不是输入?更喜欢阅读而不是写作?之所以这么想,是因为刚好我昨天看了一个电影,名字就是蠢蛋进化论,说人类到了2505年IQ降到惨不忍睹的境地,都只会做爱和暴力之类的了。那个电影另外的一些细节也值得我们深思,那就是广告遍地,一个40多寸的电视屏幕,只有之间不到20寸的地方是内容,边上被几十个闪动的小广告块占据;人们穿的衣服也全部被小广告占据;各个政府机构全部被商业公司收购。
技术的发展导致人们的生活越来越容易,越来越傻瓜化,IQ高的人好像也确实越来越不愿生育或者生活的压力更大(IQ高可能不是很会赚钱),希望人类不会慢慢的又成为动物。

待掌握的Eclipse快捷键

昨天整理了下我常用的Eclipse快捷键,今天看了下别人整理的,发现还有些需要掌握的:

  • Ctrl+D:删除光标所在行
  • Ctrl+K:将光标停留在变量上,按Ctrl+K键可以查找到下一个同样的变量
  • Shift+Ctrl+K:和Ctrl+K查找的方向相反
  • Shift+Ctrl+X:将所选字符转为大写
  • Shift+Ctrl+Y:将所选字符转为小写
  • Ctrl+M:快速对当前视图最大化
  • Ctrl+O:在代码中打开类似大纲视图的小窗口
  • 双击左括号(小括号、中括号、大括号),将选择括号内的所有内容。
  • Ctrl+1:光标停在某变量上,按Ctrl+1键,可以提供快速重构方案。选中若干行,按Ctrl+1键可将此段代码放入for、while、if、do或try等代码块中。
  • F3:打开声明该引用的文件

最后是一个可能不会常用的快捷键,如果掌握了这些想掌握的快捷键的话:CTRL+SHIFT+L:列出快捷键列表。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑