`
javatar
  • 浏览: 1680259 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

FreeMarker代码质量真的很差

    博客分类:
  • HTTL
阅读更多
这里说的版本是:FreeMarker 2.3.10 (April 20, 2007)

freemarker.core.TemplateElement 第101行:
    public TemplateSequenceModel getChildNodes() {
        if (nestedElements != null) {
            return new SimpleSequence(nestedElements);
        }
        SimpleSequence result = null;
        if (nestedBlock != null) {
            result.add(nestedBlock);
        } 
        return result;
    }

居然在SimpleSequence result = null;后直接调用result.add(nestedBlock);
这行代码永远空指针异常!

freemarker.core.StopException 第84行:
    public void printStackTrace(PrintStream ps) {
        String msg = this.getMessage();
        ps.print("Encountered stop instruction");
        if (msg != null & !msg.equals("")) {
            ps.println("\nCause given: " + msg);
        } else ps.println();
        super.printStackTrace(ps);
    }

if (msg != null & !msg.equals("")) 没有用 短路与“&&” 而是 “&”,
当msg == null时, msg.equals("")总是会被调用,总是空指针异常!
else语句一点作用都没有。

freemarker.template.ObjectWrapper 第77行
ObjectWrapper DEFAULT_WRAPPER = DefaultObjectWrapper.instance;

freemarker.template.DefaultObjectWrapper 第70行
static final DefaultObjectWrapper instance = new DefaultObjectWrapper();

其中,DefaultObjectWrapper 是 ObjectWrapper 的子类。
他居然在父类静态块初始化过程中调用子类初始化方法,
晕倒,子类怎么能在父类之前实例化,这只会使构造失败,经常出一些莫明其妙的错误。

太多了,诸如此类问题用FindBugs就能查出几十个,
还有N多没用到的变量,方法,内部匿名类,到处乱七八糟,
不知道作者怎么对得起这么多用户。

同样的方法检查Spring和Hibernate,所有代码都写很严谨,也没有任何无用代码。
很无语...
分享到:
评论
29 楼 javatar 2013-08-22  
shinwell 写道
经查代码发现,楼主发现的几个问题在FreeMarker 2.3.20(27 June 2013 released)中已经修复,其中上门提到的ObjectWrapper已经变成一个接口。


嗯,知道,当时就已经提交给FreeMarker的作者了。
28 楼 shinwell 2013-08-19  
经查代码发现,楼主发现的几个问题在FreeMarker 2.3.20(27 June 2013 released)中已经修复,其中上门提到的ObjectWrapper已经变成一个接口。
27 楼 dualface 2007-08-22  
cnpollux 写道
幸好这是老外写的。要是国人写的,会不会又被骂个狗血喷头?


必然的啦。。。。。
26 楼 javatar 2007-08-22  
通用组件的设计与应用程序最大的不同就是其API导出后是不可以改变,因为向前兼容是组件生存的根本,如果API设计很差,也只好遗臭万年,如果扩展性设计不好,第三方无法进行扩展,当遇到特殊问题,用户只能眼巴巴等着作者在下一个版本加入此功能,如果作者没时间或力所不及,那就只好发点唠骚了事,牛点的可以自己修改源代码,但却无法再使用新版本修复的一些问题。
25 楼 zengjinliang 2007-08-21  
本来想下来用用的,想不到那么多问题,汗~~~
24 楼 cnpollux 2007-08-21  
幸好这是老外写的。要是国人写的,会不会又被骂个狗血喷头?
23 楼 geszJava 2007-08-21  
喜欢velocity,freemark没有怎么用过,不过看到这两段代码,感觉很失败.完全就是刚毕业的新手写的.不管对用户影响大不大,这种不严谨的态度让人很失望.
22 楼 kevinming 2007-08-21  
楼主的钻研值得学习~
21 楼 together 2007-08-21  
代码确实很差劲.
一直在使用velocity,大小应用都还没出现过什么问题.
20 楼 hongliang 2007-08-19  
楼主精神可嘉!

不过回过头来说,这些代码都是internal的,对用户不可见,问题不像想象中的那么大。
19 楼 Classicning 2007-08-19  
觉得功能上还可以,可能代码里面还是比较粗糙的吧,加油加油啊
18 楼 javatar 2007-08-17  
Torr 写道
这些问题可以通过工具查出来. 要是设计上的问题, 那就很糟糕了. 呵呵

有一点很肯定, freemarker 的性能需要提升.


Freemarker 在设计上的缺陷更大,所有包都存在循环依赖,
你可以用JDepend试一下,所有包都是“感叹号”,
并且没有任何层次结构,更别说朝着稳定的方向依赖了,
REP, CRP, CCP, ADP, SDP, SAP等原则无一遵守。

其Visitor实现也很难扩展,这可能是Visitor通病。
主要领域对象的生命周期事件也没有。
宁愿每个对象做Wrapper,也不用总体装饰器或AOP拦截器,搞得Wrapper满天飞。
太多了,有空再总结。

还有我以前发的关于TemplateLoader的缺陷:
http://javatar.iteye.com/blog/80197

17 楼 hpq852 2007-08-17  
Torr 写道
这些问题可以通过工具查出来. 要是设计上的问题, 那就很糟糕了. 呵呵

有一点很肯定, freemarker 的性能需要提升.



Freemarker 就是一个典型的 Visitor 模式. 上面那些bug明显都是一些低级错误, 不影响使用就可以了.
16 楼 Torr 2007-08-16  
这些问题可以通过工具查出来. 要是设计上的问题, 那就很糟糕了. 呵呵

有一点很肯定, freemarker 的性能需要提升.
15 楼 nihongye 2007-08-16  
很好用的说,一些差的代码不会改变我对它的喜欢。楼主指出问题来值得称赞。
14 楼 sg552 2007-08-16  
一年前就听说FREEMAKER有很著名的BUG。

看来当初没学就对了。
13 楼 Garriot 2007-08-16  
DavidBauer 写道
freemarker.core.StopException 第84行:
    public void printStackTrace(PrintStream ps) {
        String msg = this.getMessage();
        ps.print("Encountered stop instruction");
        if (msg != null & !msg.equals("")) {
            ps.println("\nCause given: " + msg);
        } else ps.println();
        super.printStackTrace(ps);
    }

if (msg != null & !msg.equals("")) 没有用 短路与“&&” 而是 “&”,
当msg == null时, msg.equals("")总是会被调用,总是空指针异常!
else语句一点作用都没有。

貌似用这个"&"才是短路与吧



&&才是短路的,&是非短路。已测。
12 楼 fishinlove 2007-08-16  
本来还打算用FreeMarker 没有仔细读过源码,看来还是算了。
11 楼 DavidBauer 2007-08-15  
freemarker.core.StopException 第84行:
    public void printStackTrace(PrintStream ps) {
        String msg = this.getMessage();
        ps.print("Encountered stop instruction");
        if (msg != null & !msg.equals("")) {
            ps.println("\nCause given: " + msg);
        } else ps.println();
        super.printStackTrace(ps);
    }

if (msg != null & !msg.equals("")) 没有用 短路与“&&” 而是 “&”,
当msg == null时, msg.equals("")总是会被调用,总是空指针异常!
else语句一点作用都没有。

貌似用这个"&"才是短路与吧
10 楼 lszone 2007-08-15  
我也再尝试使用freemarker,不会代码真的这么差吧?

相关推荐

Global site tag (gtag.js) - Google Analytics