开源框架VS土制框架

真的没想到,现在还会出现是否应该使用开源框架的争论。说说我很久以来的看法,权作一笑:

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

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

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

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

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


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

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

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

[quote]那么,我们为什么要用开源框架[/quote]
为了赶时髦。:)
为了和外面的世界接轨,为了用标准开发,增加可移植性。
为了框架挈约杜绝不好的开发方式,使项目更容易维护。
为了各个项目组之间不再各自行事,都重复搞一套自己的轮子。
为了让员工积极性更高。
当然,最重要的是为了解决实际问题,更好更快速地完成任务,达成目标。像那个臭名昭著的数据库连接泄露问题,很简单地用一个拦截器就搞定了,还需要千方百计、想方设法吗?借鉴他人成果,减少自己无谓的工作量,提高项目开发效率,降低维护成本,这才最根本的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值