解惑

解己之惑,解人之惑

2006年12月 (第4页共6页)

如何解决问题

对于新手而言,最大的问题可能就是遇到问题完全没有头绪,特别是程序出错的时候,简单的说一下我解决问题的方式。

  1. 首先就是看错误信息,发生错误,一般都会有一些错误信息,在控制台或者日志里面,要仔细的看那些错误信息,有时候错误信息的提示已经指出了问题的所在,如果是一堆的调用堆栈,最重要的就是最开始的错误信息和caused by的那个错误信息。通过这个方式我们至少可以解决20%的问题。
  2. 如果是自己写的或者公司其他同事的代码出错,那么就要从错误堆栈信息里面找自己公司代码的那些行了,并且重新浏览一遍那些代码,思考可能的出错原因并进行调试。一定要知道如何使用IDE进行调试。
  3. 如果不是公司的代码出错,而是使用的服务器或者第三方组件出错,那么就直接把出错信息贴到google里面搜索下其他人出现的相同问题,并找到可能和你一样的问题。
  4. 如果是第三方的代码出的问题,并且是比较简单的开源组件,看看相关的源代码也是一个选择。
  5. 如果还不能搞定,那么找公司的其他同事帮忙,特别是你认为对所出现的问题比较熟悉的人。当然,你应该首先判断是哪方面的问题。
  6. 最后就是上论坛提问题,期望有人遇到过相同问题,或者是高手帮你分析问题并提示你如何确定问题。
  7. 最后一招就是修改实现方式,绕过问题,有些是服务器、OS的限制,使用其他的方法搞定吧。

再见,棒约翰

今天逛街的时候老婆听从了她的同事的意见去试了一下棒约翰,结果很失望,这是我们第一次,也是最后一次吃帮约翰了。
以前老婆都是吃必胜客的,帮约翰和必胜客比较起来,好像完全没有优势,店面的装潢上肯定是大大的不如,使用的餐具也不好,据Bruce讲,有些店还是使用的朔料盘子;据说棒约翰的优势是便宜,我没有感觉到,9寸的超级棒约翰要63,比必胜客的超级至尊的58还贵一些;最后是质量,店面里面的资料说都是使用的最好的材料,但是没有感觉到,连量似乎也少一些。
今天两个人吃了一百,超级棒约翰和腊肠的组合、BBQ鸡翅、热巧克力和雪碧。我们在必胜客一般也就是70多,不过我们一般都是匹萨叫一个饮料,另外总会有一些优惠券可以用。

见识Ruby及编程语言杂谈

今天总算是见识到了Ruby,给我的感觉是好像和PHP很像,功能还是很完善的,但是我还是不喜欢,因为我讨厌记那么多的语法,原来一头扎进Java就是欣赏Java的语法简单好记。现在想想,其实我也使用学习过很多编程语言,我写过一千行有效代码的语言就有:

  • Basic
  • C
  • C++
  • Perl
  • 汇编
  • Java
  • Shell

如果再算上VB、VC、Pro*c之类的改造过的语言,也算不少了。
在这些语言中,我印象最深的就是Perl和Java,Perl也是很好的脚本语言,印象中也是弱类型,类型转换也很简单,另外就是我从它学会了正则表达式。

全面自动测试

今天参加了QA的一个演示,演示的是他们基于Watir的测试框架,这样加上我做的单元测试框架,我们就可以全面的进行自动测试了,使用我的单元测试框架,可以测试EJB和Action,进行的是白盒测试,而使用QA的测试框架,可以测试页面的功能,进行的是黑盒测试。

代码覆盖要求类更大?

刚刚看了下代码覆盖的结果,发现如果一个类太小,那么覆盖率很容易达不到要求,一般而言,代码覆盖率要求85%左右,但是如果一个类只有十几行代码,特别是再包含一些try catch语句,那么代码覆盖率很容易只有70%以下,因为有时候很多try catch只是JAVA要求进行处理,程序实际运行不可能出那些异常。
虽然这样考虑有点舍本逐末的嫌疑,但是在有硬性指标的时候,这个也是一个需要考虑的因素。

打算造一个大轮子

有感于这次单元测试框架的设计实现过程,决定慢慢的造一个大轮子:一个自己的web框架,初步计划是自己用,不考虑太通用,目的就是简单快捷的创建web应用,可以很方便的增加功能,基本上就是像ror一样简单快捷。
当然这个框架不会全部重写,肯定会基于现在的一些开源的组件搭建。但是肯定会排除spring和hibernate,因为这两个对于我而言是很大的轮子了。我需要的功能相对简单,我更喜欢基于规则而不是基于配置,很多东西其实没有必要配置,定义一套规则遵循就可以了。
初步拟定可能要使用到的一些组件是:

  • OGNL
  • prototype.js
  • overlib.js

代码覆盖帮助发现BUG

今天无意中又浏览了一下代码覆盖的结果,竟然让我无意中发现了一个用其它方法可能不会发觉的BUG。
代码片断如下:
    /**
     * This method is performance key point of this framework.
     * @see org.mockejb.interceptor.AspectSystem#findInterceptors(java.lang.reflect.Method, java.lang.reflect.Method)
     */
    public List findInterceptors(Method proxyMethod, Method targetMethod)
    {
        List resultList = new ArrayList();
        List otherResult = find(proxyMethod, targetMethod, otherAspectList);
        resultList.addAll(otherResult);
        if (proxyMethod != null)
        {
            String proxyMethodString = proxyMethod.toString();
            String targetMethodString = targetMethod.toString();
            List aspect = CacheUtil.getBeanAspects(proxyMethodString + "-" + targetMethodString);
            if (aspect != null)
            {
                resultList.addAll(aspect);//168
            }
            else
            {
                if (isARMethod(proxyMethodString, targetMethodString))
                {
                    String beanName = getBeanName(proxyMethodString, targetMethodString);
                    if (beanName != null)
                    {
                        List aspects = (List) beanAspectMap.get(beanName);
                        if (aspects != null)
                        {
                            aspect = find(proxyMethod, targetMethod, aspects);
                            CacheUtil.putBeanAspects(proxyMethodString, aspect);
                            resultList.addAll(aspect);
                        }
                    }
                }
            }
        }
        return resultList;
    }

注意标记为168的那一行,那个地方是Cache的功能,但是代码覆盖报告指出它没有被执行过,也就是那个Cache从来没有生效,因为原来的cache的key只是proxyMethod.toString(),后来为了在初始化的时候屏蔽ejbPostCreate的执行加了一些Aspect,但是ejbPostCreate和ejbCreate的proxyMethod是一样的,只是targetMethod不同。
这个BUG只影响性能,所以其它的方法是不可能发现问题的。

上海将强制推行数字电视?

今年十月去大连办理二代身份证的时候发现大连已经强制推行数字电视了,每家一个机顶盒,今天从和我同住的小胖那里获知明年上海也可能要强制推行数字电视,每家两个机顶盒,里面可能会集成电子商城和公共事业费缴费业务。和IPTV不同,这个数字电视走的是有线电视的网络,是东方有线推行的。值得欣慰的是费用方面可能和原来的有线电视持平,差不多在13块一个月,我不知道中国现在为什么要这样大张旗鼓的搞数字电视,可能还是想多捞一些钱吧。这个数字电视推行以后,可以扩展很多功能,电视也和电脑一样,变成了一个互动平台,而非现在的只能接受信号的终端,依托这个平台,东方有线可能的盈利渠道就要大得多,很多时候它也不用自己去搞,像移动一样,它也可以搞SP之类的东西而坐收渔利。
为了可能的盈利前景,中国在硬件投入上的手笔越来越大了。

使用Command分离可能的递归依赖

在完成这个EJB单元测试框架的CMP的时候,核心应该就是成功使用Command模式,框架在初始化的时候会自动初始化需要使用的Entity Bean,包括Entity Bean之间的依赖关系,但是如果在初始化的时候,一个Entity Bean依赖另外一个还没有初始化的Entity Bean,而所依赖的那个Entity Bean又依赖这个Entity Bean,就会形成循环依赖。我使用Command模式,讲这个依赖关系放到一个Command里面,然后在一个Entity Bean的基本属性初始化完成以后再执行Command队列初始化那些关系,就不会形成循环依赖了。

代码如下:
阅读全文

使用分类提高速度

这个是我做这个单元测试框架最大的感受,原来的代码存在两个使用大List的地方,一个是MockEJB自己带的AspectSystemImpl,它把所有的Aspect放在一个List然后查找匹配的,后来我修改了实现,按照不同的Bean放到不同List再用一个Map分类,一举提高20倍速度,然后我又修改了原来Command队列的实现,使用同样的原理,也提高了30%的性能。
所以如果你的代码中也使用到了List之类的集合,添加到里面的东西比较多,要进行比较或者某种查找,那么进行简单的分类可能是提高性能的关键。分类功能简单的使用一个HashMap就可以了。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑