`
fyting
  • 浏览: 215610 次
  • 性别: 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种混凝土反应柱,一为普通硅酸盐水泥与粗砂制作的混凝土,二为复合硅酸盐水泥与粗砂制作的混凝土,三为复合硅酸盐水泥与红粘土制 作的...

    ansys maxwell

    ansys maxwell

    matlab基于不确定性可达性优化的自主鲁棒操作.zip

    matlab基于不确定性可达性优化的自主鲁棒操作.zip

    pytest-2.8.0.zip

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    信息安全课程实验C++实现DES等算法源代码

    信息安全课程实验C++实现DES等算法源代码

    基于知识图谱的医疗诊断知识问答系统python源码+项目说明.zip

    环境 python >= 3.6 pyahocorasick==1.4.2 requests==2.25.1 gevent==1.4.0 jieba==0.42.1 six==1.15.0 gensim==3.8.3 matplotlib==3.1.3 Flask==1.1.1 numpy==1.16.0 bert4keras==0.9.1 tensorflow==1.14.0 Keras==2.3.1 py2neo==2020.1.1 tqdm==4.42.1 pandas==1.0.1 termcolor==1.1.0 itchat==1.3.10 ahocorasick==0.9 flask_compress==1.9.0 flask_cors==3.0.10 flask_json==0.3.4 GPUtil==1.4.0 pyzmq==22.0.3 scikit_learn==0.24.1 效果展示 为能最简化使用该系统,不需要繁杂的部署各种七七八八的东西,当前版本使用的itchat将问答功能集成到微信做演示,这需要你的微信能登入网页微信才能使用itchat;另外对话上下文并没

    一个高品质的音乐共享和流媒体轻量音乐程序网站在线音乐源码

    一个高品质的音乐共享和流媒体轻量音乐程序网站在线音乐源码,是创建您自己的音乐流媒体网站的最佳方式! 最新版本: 添加插件系统,现在开发人员可以为程序制作插件并在更新后保留您的自定义设置。 固定的2 个以上的小错误。 安装所需:nginx/apache,mysql5.6+,php7+ 搭建说明:看源码内详细说明

    实现的金融风控贷款违约预测python源码.zip

    实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip

    麦肯锡—xx数码公司发展战略咨询报告.ppt

    麦肯锡—xx数码公司发展战略咨询报告.ppt

    FT-Prog-v3.12.38.643-FTD USB 工作模式设定及eprom读写

    FT_Prog_v3.12.38.643--FTD USB 工作模式设定及eprom读写

    基于sklearn实现线性回归模型对波士顿房价进行预测源码.zip

    基于sklearn实现线性回归模型对波士顿房价进行预测源码.zip

    pytest-3.5.0.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pytest-4.5.0.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于相干衍射成像模拟的matlab源码.zip

    基于相干衍射成像模拟的matlab源码.zip

    基于CS的远程监控系统软件项目(免费提供全套java开源项目源码+论文)

    项目介绍 背景 在当今的数字化时代,远程监控系统已经成为企业和个人必不可少的工具。随着物联网(IoT)技术的发展,监控系统的需求不断增加,不仅仅局限于视频监控,还包括数据监控、设备状态监控等。基于CS(Client-Server)架构的远程监控系统应运而生,旨在提供高效、实时、可靠的监控服务,帮助用户实现远程管理和控制。 目的 基于CS的远程监控系统软件项目旨在为用户提供一个综合性的监控平台,通过该平台,用户可以实时监控各类设备和数据,实现远程控制和管理,提高工作效率,降低运营成本。同时,该系统还可以用于安全防护、生产过程监控等多种场景,具有广泛的应用前景。 模块说明 前端模块 前端模块是用户与系统交互的界面,负责展示监控数据和接收用户指令。前端模块的主要功能包括: 用户登录与认证:通过安全的登录机制,确保只有授权用户才能访问系统。 实时数据展示:以图表、仪表盘等形式展示实时监控数据,包括视频流、传感器数据等。 报警通知:当监控系统检测到异常情况时,前端模块会通过弹窗、声音等方式通知用户。 远程控制:用户可以通过前端界面对设备进行远程控制,例如开关设备、调整参数等。

    网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面.zip

    网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面.zip

    matlab基于标签歧义的深度标签分布学习.zip

    matlab基于标签歧义的深度标签分布学习.zip

Global site tag (gtag.js) - Google Analytics