近期被外派帮助国内某公司做政府某部门OA系统。听说他们那有个成熟的java框架,使用了非常长时间,抱着学习的态度,我进入这个公司。当我熟悉了一周后,留下了非常多疑问,而这些疑问,也诱发了这次关于“抽象”这个问题的思考。大家和我一起来研究研究这些疑问。

1,概览:

初步接触这个系统。公司的技术总监,就和我们交流了这个框架,依照总监的话就是“这个就是个简单的ssh框架,没什么!”,事实证明。尽管看似简单,可是还是有不少的点能够研究的!

疑问:

随着对框架的深入。我们产生了几个疑问。踢给了总监:

(1)既然用了hibernate。为什么还大量使用了原生sql?

(2)对基础操作的封装为什么大量使用了聚合,继承基本没实用?

(3)前台为什么没用框架。而是一些技术的组合?

很感谢我们的总监,无私的回答了这些问题:

总监答案:

(1)关于sql与hql的选择,当初他们做了不同的尝试,发现:hql尽管封装的好。可是有几个缺点:速度慢,效率低,难处理复杂表。

基于这些,他们选择了部分hql部分sql,对于这些。我们对于单表且简单的操作用hql,对于单表复杂或者多表的操作使用原生的sql,通过这样平衡面向对象和效率之间的问题!

(2)关于继承,他们也考虑过,可是继承实现的关系太强,假设过多的使用继承就会造成类的功能过于多,而聚合是个不错的解决方式。这样再扩充或者改变的时候。就会方便一些!

(3)前台框架他们也实用过一些,可是他们认为自己写,更有兼容性。用主要的html搭建的页面兼容性更好,而在一些诶须要特殊效果的地方。则使用一些ext的控件。这样也是个非常好的选择!

2。深入:


随着我写了一些代码,我发现总监的想法非常丰满。可是显示非常骨感!对于我的第一个疑问,我是比較允许总监的意见的,在一些特殊须要的场合,做特殊的处理,这是种非常好的平衡。我们设计一个框架的时候。这样的平衡也是要考虑的,我们的封装绝不是隔绝最基础的实现,而是在基础的实现上。做了封装,对我们常规的操作有一个系统的抽象和封装!

可是第二个问题,我是持久自己的一些看法的。对于继承的强关系,这的确是个问题,可是这不是阻碍我们使用的问题,在抽象这个层面,继承其技术基础一直为我们提供最优质的服务,我们回想以下向对象的三个特征:封装,继承,多态。

这三者相互作用相互碰撞才有了我们的面向对象的思维!

我们再看看这种设计经验:多组合,少继承,低耦合。高内聚。这里我们要澄清,少继承是在一定的范围内说的。在保证内聚性方面。继承是个比較好的选择,我们看看我们的java类哪个不是继承了object这个类,这也间接的说明了问题!并且在编码中。我发现,不用继承,我会写非常多反复的代码。我就不如针对同的业务抽象不同的父类,这样,降低了至少70%的工作!

对于第三点,我想说。前台的框架的选择是个头疼的故事,可是还是有非常多经典的额框架是我们一直用的,起码我们不就一直在用jquery吗?而今的框架已经越来越简单且强大了一味的闭门造车,我想,这个时代,已经不是那个时代了!

顺便吐槽一下,公司没有网啊,整个楼层仅仅有三台公用电脑能够上网,每天还限制为2g流量,亲,这是21世纪吗?我是不是穿越了!

3,改造:

吐槽了这么多,事实上。我还是对这个框架比較惬意的,尽管这样和那样的问题依旧不少,可是我发现这些都不影响他的适用性,在经过我给它动了个小手术后,他的代码量已经大幅下降了,适当的使用继承这个利器,我们就是在为自己创造时间。

总结:

观察身边的程序员们,我们是不是常常这么做,从别人那copy下他的代码。然后改几个属性,功能就万事大吉了。假设有了新任务,按我们要凭借这自己超强的记忆力,修改我们全部copy的代码。然后在从新做一边单元測试!

我们提出一个观点:一个框架搭建好之后,不论什么地方的封装,都是一个高智慧含量的复制!



        这就又牵扯一个话题了。究竟什么是复制?人copy和维护代码是一种极其昂贵的成本。而让机器自己copy维护代码是节省了千万倍成本的复制!人的作用如今来看,就在于抽象和总结了,底下的。简单的复制性活动交给机器,就像如今的3d打印一样,这是个革命,已经不是技术的革命了,而是思想的革命。智慧生物要发挥它应有的作用。copy是不须要智慧的,就交给机器吧!

这是我们这个时代的潮流。

谈抽象1——无脑copy等于自杀的更多相关文章

  1. CodeForces 909E Coprocessor(无脑拓扑排序)

    You are given a program you want to execute as a set of tasks organized in a dependency graph. The d ...

  2. 【原】无脑操作:express + MySQL 实现CRUD

    基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...

  3. Go语言及Web框架Beego环境无脑搭建

    [原]Go语言及Web框架Beego环境无脑搭建 本文涉及软件均以截至到2013年10月12日的最新版本为准 1. 相关软件准备: 1) go1.2rc1.windows-386.msi,对应32位w ...

  4. 【原】无脑操作:eclipse + maven搭建SSM框架

    网上看到一些Spring + Spring MVC + MyBatis框架的搭建教程,不是很详细或是时间久远了,自己动手整一个简单无脑的! 0.系统环境 1)Windows 10 企业版 2)JDK ...

  5. 计蒜客 无脑博士 bfs

    题目链接无脑博士的试管们 思路:直接模拟倒水过程即可,但是需要记忆判断当前的情况是否已经处理过.dfs和bfs都ok AC代码 #include <cstdio> #include < ...

  6. 【原】无脑操作:ElasticSearch学习笔记(01)

    开篇来自于经典的“保安的哲学三问”(你是谁,在哪儿,要干嘛) 问题一.ElasticSearch是什么?有什么用处? 答:截至2018年12月28日,从ElasticSearch官网(https:// ...

  7. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限

    上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...

  8. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

    开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...

  9. 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改

    Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...

随机推荐

  1. Hadoop Trash回收站使用指南

    转载:https://blog.csdn.net/sunnyyoona/article/details/78869778 我们在删除一个文件时,遇到如下问题,提示我们不能删除文件放回回收站: sudo ...

  2. Druid对比Hadoop

    Druid对比Hadoop Hadoop 向世界证明, 花费很少的钱实现典型的解决方案, 将数据保存在一般的商用机器的数据仓库里是可行的. 当人们将自己的数据保存在Hadoop, 他们发现两个问题   ...

  3. web前端常用的linux命令(在git命令行使用)

    cd (文件目录): 回到上一层目录 cd .. 回到根目录 cd / mkdir(新建文件夹) 下面的命令在当前目录新建了文件夹css html js 3个文件夹 mkdir css html js ...

  4. Hybrid App开发实战

    Hybrid App开发实战 作者 李秉骏 发布于 九月 04, 2013 | [引言]近年来随着移动设备类型的变多,操作系统的变多,用户需求的增加,对于每个项目启动前,大家都会考虑到的成本,团队成员 ...

  5. Vue creatElement

    1.传统template写法 <!DOCTYPE html> <html lang="zh"> <head> <meta charset= ...

  6. Linux下安卓ndk混合编译调用so方法——QuickStart学习

    转自:http://www.52pojie.cn/thread-313869-1-1.html #注意:.h 和.c中的错误eclipse不会检查,只会调用时在手机或虚拟机中死掉.因此需要仔细检查其中 ...

  7. node.js 学习02

    读写文件中的路径问题 readFile()读取文件函数中的./(相对路径)这个参数,相对的是执行node命令的路径,而不是相对于正在执行的这个js文件来查找.为了解决这个问题: __dirname(两 ...

  8. WPF入门教程系列四

    WPF之Binding的使用(二) 一.  前言 初学WPF经常被Binding搞得苦不堪言,Binding的重用性就不做介绍了,在WPF应用程序开发中Binding是一个非常重要的部分.WPF也是近 ...

  9. 转用Jmeter测试RabbitMQ

    转自:https://blog.csdn.net/luozhuwang/article/details/62044872 1.下载AMQP插件 github上面有源码,可以通过ant+ivy在本地进行 ...

  10. 微信支付和微信支付通知基于sdk的说明

    前提是,有微信服务号(必须开通了支付功能,也就是说有了商户后台) (注意商户后台 安全目录 的设置,不然即使你写的没错误,也调用不成功) 公众号h5页面写法:  (购物车提交--我们上一步已经生成了订 ...