`
fyting
  • 浏览: 215801 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

开源框架VS土制框架

    博客分类:
  • Java
阅读更多
真的没想到,现在还会出现是否应该使用开源框架的争论。说说我很久以来的看法,权作一笑:

引用
版权问题

很多Java开源项目都使用ApacheLicence2.0或者LGPL,商业软件中使用完全没有问题。

引用
开发人员积极性问题

普通的开发人员,都更愿意学习流行的框架,也就是说积极性更高。说实话,对员工的发展也更好(找工作更容易)。有的时候,就会有人抱怨为什么不用Spring啊这些,然后有的人要么会偷偷使用,要么会搞一个稀奇古怪的自己的东西,很影响项目开发,维护。

引用
维护问题

维护自制的框架需要工作量,由谁去维护成为一个问题。修改过程中,避免BUG出现,保证不影响以前的客户端代码也是一个问题。

引用
可移植性问题

自制的东西很少遵守标准开发,如果再加上满地的静态方法和丑陋的设计,想要进行单元测试都是空话,想修改后不出BUG是不可能的,当然,想要移植就更加困难。尤其是满地的DBConnectionManager、ConnectionPool、DBUtils,再加上遇到同名不同包的情况(几个相同名字的连接管理类,存放在不同的包,但连接不同的数据库),想不改出问题很难。一个标准的javax.sql.DataSource接口就那么难实现?
说到移植性,又顺便说下普通的IOC原则,看看下面这个简单的代码就知道了:
public class UserDao{
    public void createUser(User user){
        Connection conn = DBConnectionManager.getConnection();
    }
}

移植的时候,除了DAO,是不是还需要把DBConnectionManager这个东西给带过去?再看看下面这样的:
public class UserDao{
    private DataSource dataSource;
    public void setDataSource(DataSource dataSource){
        this.dataSource = dataSource;
    }

    public void createUser(User user){
        Connection conn = this.dataSource.getConnection();
    }
}

现在UserDao的实现只依赖DataSource这个接口,移植的时候,直接修改DataSource配置,传入不同DataSource就是了。单元测试就更加简单,手动setDataSource就行。
而前面那个代码怎么单元测试?DBConnectionManager容易替换吗?是不是还需要修改DBConnectionManager的源代码?那要是在jar包里面呢,又怎么修改?移植就更麻烦了,要是移植到的系统已经有个相同名字的DBConnectionManager,但需要取连接的却是另外一个叫做DBUtils的类(一个项目中连接多个数据库很常见吧?),又怎么办?很多时候,用静态方法都不得不手动修改代码,就祈祷全文替换不要出错误吧。
第二种实现看似代码长度增加了,多了个setDataSource方法,可想想,如果还有其他的editUser,deleteUser,代码长度谁更有优势,是不是还需要每次都去调用这个恶心的长长的DBConnectionManager?
这个是DAO,当然不需要单元测试,其他service代码里的什么静态工厂引用就会遇到单元测试问题了。


引用
性能和稳定性问题

开源框架的开发人员基本都是高手,一般是每个公司最好的程序员。像Rod Johnson、Gavin King等人,比起一般公司里的开发人员,根本不在一个档次,甚至根本没必要拿来比。当然,SourceForge上粗制劣造的开源项目也不少,但这种东西注定了不会流行,流行的都是开源项目中的佼佼者。甚至可以说,开源项目强烈影响和冲击了各种标准,Spring和Hibernate,彻底颠覆了旧的EJB2,然后才有了更加先进的EJB3(JSR-220),而其中的JPA(Java Persistence API),更是Hibernate的一个子集。实在不能把开源框架的性能和稳定性作为质疑的条件,难道自己制造的框架就一定比开源的更稳定?难道自制的框架都有很完备的测试?在质疑的同时,是否对这些开源项目有过较深入的了解,或者说是否使用过?是否真正知道使用后的好处与坏处?如果根本不了解,又如何能质疑它们?
自己不去了解就永远也不知道是否有性能问题,也许根本不存在呢?稳定性?说实话,我更怀疑根本没有经过单元测试就制造出来了的代码。

引用
嗯,看上去不错,用熟练了可能也很好,但这些框架都需要一个熟悉的过程,需要代价。

这是一个伪命题,为什么呢。说这些话的人都是搞了一套自己的框架,对于他们来说,使用其他框架当然需要学习。但对于公司其他人来说,使用这些自制的框架也需要学习,遇到稀奇古怪的问题也很郁闷,如果开发这个框架的人不在公司,只能自己从代码中慢慢找错误。这个是有切身体会的,很郁闷,不客气地说,很多自制的代码基本上比开源的差了不止一个档次,不容易跟踪到错误根源。

引用
那好,从别的框架取出好的部分,消化后转换为自己的代码。

FT。首先需要自己维护,麻烦。文档要重新写,麻烦。转换过程中不一定像开源框架那样有完整的测试(单元测试,集成测试),容易出错。最重要的问题,看似自己消化掉了,转换为了自己所理解的。但是没有参与“消化”的程序员,面对被“消化”掉重新构造出来的代码,难道就不需要消化了吗?像StringUtils这种东西,jakarta-commons-lang有一大堆方法了,再自己去写相同功能的就实在没有必要。自己写的web框架,就更容易漏洞百出了,自己写的就是比WebWork好?我相信,每个人都比Richard Oberg、Lightbody等人牛。

引用
那么,我们为什么要用开源框架

为了赶时髦。:)
为了和外面的世界接轨,为了用标准开发,增加可移植性。
为了框架挈约杜绝不好的开发方式,使项目更容易维护。
为了各个项目组之间不再各自行事,都重复搞一套自己的轮子。
为了让员工积极性更高。
当然,最重要的是为了解决实际问题,更好更快速地完成任务,达成目标。像那个臭名昭著的数据库连接泄露问题,很简单地用一个拦截器就搞定了,还需要千方百计、想方设法吗?借鉴他人成果,减少自己无谓的工作量,提高项目开发效率,降低维护成本,这才最根本的。
分享到:
评论
1 楼 halk 2009-04-16  

相关推荐

    土制状态机在工作流引擎中的应用

    NULL 博文链接:https://ahuaxuan.iteye.com/blog/505124

    论文研究 - 生土的NaOH活化:NaOH含量对干燥动力学的影响及其建模

    这项工作旨在确定氢氧化钠浓度对用生黏土制得的砖的干燥动力学的影响,并对该动力学进行建模。 结果表明,由于缺乏游离水,干燥动力学受水的扩散控制。 干燥时间随NaOH含量的增加而线性增加,而体积收缩率则下降,...

    硅藻土制备介孔SiO2气凝胶 (2013年)

    采用响应面法对由硅藻土制取水玻璃的工艺进行优化,进而选择最佳工艺参数在常压干燥下成功合成了SiO2气凝胶材料。试验结果表明:当碱硅比为3∶10,NaOH溶液浓度为10%,反应温度为90℃时,水玻璃模数测定值与SiO2溶出...

    不同材料的生态混凝土对污水净化效果的比较 (2011年)

    为比较不同材料所制成的多孔混凝土对有机污水净化的效果,采用了不同的材料来制作3种混凝土反应柱,一为普通硅酸盐水泥与粗砂制作的混凝土,二为复合硅酸盐水泥与粗砂制作的混凝土,三为复合硅酸盐水泥与红粘土制 作的...

    数据预处理之基于统计的异常值检测

    matlab+数据预处理+统计+异常值+检测+适用维度较小的数据 基于统计的异常值检测是一种利用统计学原理和技术来识别数据集中异常值或离群点的方法。这种方法通过考察数据集的统计特性来发现与其他样本显著不同的观测值。我们可以利用几种常见的方法,包括3σ(sigma)准则、Z分数(Z-score)和Boxplot(箱线图)。

    2021-2022中国中东欧智慧教育学术会议报告集-25页(1).pdf

    2021-2022中国中东欧智慧教育学术会议报告集-25页(1)

    基于形态学的权重自适应图像去噪.zip

    MATLAB是MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 【主页资源】 遗传算法、免疫算法、退火算法、粒子群算法、鱼群算法、蚁群算法和神经网络算法等常用智能算法的MATLAB实现,包含TSP、LQR控制器、结合量子算法、多目标优化、粒子群等matlab程序。 MATLAB计算机视觉与深度学习实战项目:直方图优化去雾技术、基于形态学的权重自适应图像去噪、多尺度形态学提取眼前节组织、基于分水岭算法的肺癌分割诊断、基于harris 的角点检测(可以直接用matlab自带的函数)、基于K均值的据类算法分割(算法时间有点久)、 区域生长算法进行肝部肿瘤分割(原始分割精度不高)、matlab编写的图像处理相关算法代码及算法原理等等。

    基于STM32微控制器的数据采集系统的固件

    目前实现的功能: 示波器 伏特计 逻辑分析仪(实验性) PWM测量 PWM输出 基于DDS(直接数字合成)的发生器 功能的选择取决于所选的目标。在小型器件上,由于外设约束或引脚排列有限,仅实现了功能子集。 固件还可以在不同的配置之间切换。例如,和 .Voltmeter + PWMOscilloscope + PWM 固件通过虚拟 COM 端口(USB CDC 类)直接或使用 UART 转 USB 桥接器与 PC 应用程序通信。 如何运行固件 您可以在发布部分下载已编译的二进制文件,并通过 ST-Link(或任何其他调试器)或通过 USB 设备固件更新 (DFU) 下载

    An open-source HDL register code generator fast enough to run in

    vhdl

    B2141 确定进制.cpp

    B2141 确定进制

    bootstrap模板-moban6820.rar

    bootstrap模板

    岗位管理体系5大要素全解读.pdf

    岗位管理体系5大要素全解读.pdf

    php+mysql社区交流系统(系统)

    随着计算机网络的不断发展,网页逐渐融入人们的生活。快速及时的新闻浏览,五彩缤纷的网上信息,使网络与人们的生活息息相关,于是世界上又出现了第三媒体——Internet。它打破了地域限制,真正使信息得以共享,改变了人们的工作和生活方式。官方网页是企业和个人的宣传自己的重要手段,各大公司和个人主页包括演艺圈艺人,作家,大学生等,纷纷创建自己的主页和Web站点,向全世界宣告自己的存在,展示自己的产品、服务及个人爱好等等。我的系统由:会员登录、会员注册、论坛等之类的组合而成的。

    【技巧】人才盘点体系构建最佳实践.docx

    【技巧】人才盘点体系构建最佳实践.docx

    9471 - Uruk-hai Army.mpd

    9471 - Uruk-hai Army.mpd

    编译原理大作业:类似C语言的编译器设计与实现-支持加减乘除转换 print 输出转换 if 条件转换 赋值语句转换

    编译原理 大作业 基本功能:类 C 语言编译为汇编语言 支持语法: 1. 加减乘除转换 2. print 3. 输出转换 4. if 条件转换 5. 赋值语句转换 具体实现原理 源文件——词法分析——语法分析——三元式生成——目标代码生成 词法分析——预处理(识别)——分类——得到结果 语法分析——基本转换——相关语法分析 主要模块 词法分析模块-词法分析.cpp 语法分析模块-语法分析.cpp 使用模块-源.cpp 函数声明-header.h

    10240 - UCS Red Five X-wing Starfighter.mpd

    10240 - UCS Red Five X-wing Starfighter.mpd

    7307 - Duel in the Air.mpd

    7307 - Duel in the Air.mpd

    B2111 基因相关性.exe

    B2111 基因相关性

    6844 - Seismologic Vehicle.mpd

    6844 - Seismologic Vehicle.mpd

Global site tag (gtag.js) - Google Analytics