DSL 或者说是抽象 或者说是沉淀 ,我看到的不错的一篇文章

作者:张浩斌

链接:https://www.zhihu.com/question/45552115/answer/99388265

来源:知乎

著作权归作者张浩斌和知乎所有。

--------------------------------------------

这个问题其实是只可意会不可言传,然而从看到这个邀请,就有跟知友卖弄的冲动。

首先,我是从qbasic开始编程,经历了qb到vb,vb到asp(不带.net),asp到jsp,jsp到php,再回头学习j2ee。这个过程可能导致我的观点可能跟主流观点不同,希望各位理解。

j2ee并不等于spring struts hibernate,还有各种其他的选择,ssh不是唯一甚至不是最好的选择,这里按下不表。

先问一个问题,什么是jsp/servlet不能做,而ssh能做的?没有ssh之前,就没有web应用了么?

有人会觉得servlet傻,可是你看看struts的核心入口Dispatcher,不就是一个Servlet么。你觉得jdbc难用,hibernate的功能最后还是用jdbc实现的,而且不少批量处理的情况,还是原生sql好用,以至于hibernate不得不提供原生sql接口,mybatis正是从这里挖走不少用户。

在很多情况下,ssh做的,只不过是把java/jsp/servlet/jdbc本来就具有的功能,封装成不一样的API,把原先用Java编写的代码变成用XML编写,然后在用java写的解释器在jvm里面去运行这些XML。所以,我觉得ssh其实就是面向web开发这个领域创造出来的一组DSL(领域特定语言)。而这套语言以XML开始,现在转移到java的注解annotation,慢慢的又回归java语言本身。

不太全面的说,struts就是给不熟悉html/css/js的web程序员摆脱它们写业务逻辑用的,hibernate就是给不熟悉SQL的程序员摆脱SQL写数据库程序用的,spring就是给不熟悉java的接口、反射的程序员摆脱接口反射写AOP用的。而上面被代替的这些,恰恰是相关领域的原生DSL,这里面多少有一点讽刺的意味,对么?

如果struts的开发者没有在jsp混杂java片段的各种<%="‘"+xx.yy()+"‘"%>嵌套括号引号海里面摸爬滚打过来,你觉得他们会想到要做struts么?

如果hibernate的开发者没有在SQL的join链中绕晕过,他们会搞hibernate?

如果spring的开发者没有对java反射的异常数量吐过槽,会有spring?

如果你只想做一个平庸的码农,去学ssh能让你找到一份不错的入门工作。

如果你希望能深入的理解系统、语言、框架,去学习语言本身提供的功能,去学习servlet、jdbc、java,去看看如何用他们构造通用的复杂的系统,也许未来5-10年,人们再提起j2ee,说的就是你创造的框架的名字,而不再是什么spring struts hibernate。

我们总是希望高内聚低耦合,但两者通常是矛盾的;如果你愿意放弃其中的一个,就可以在另一个上面走的更远。(这里写的观点有偏差,正解请看 评论里春雷的说法)

为了防止有人跟帖说U can U up.

GitHub - zhblue/crud: CRUD is Really Urgly coDed -- 数据库快速原型系统

时间: 2024-10-10 22:14:08

DSL 或者说是抽象 或者说是沉淀 ,我看到的不错的一篇文章的相关文章

黄聪:AngularJS中的$resource使用与Restful资源交互(转)

原文:http://blog.csdn.net/he90227/article/details/50525836 1.AngularJS中的 $resource 这个服务可以创建一个资源对象,我们可以用它非常方便地同支持RESTful的服务端数据源进行交互,当同支持RESTful的数据模型一起工作时,它就派上用场了.      REST是Representational State Transfer(表征状态转移)的缩写,是服务器用来智能化地提供数据服务的一种方式 1)我们首先需要引入ng-Re

Gradle 教程:第一部分,安装【翻译】(转)

原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-1-installation-setup/ 在这篇教程里,我们将主要讲解如何在我们自己的系统上安装.配置.原始版本的Gradle,并学习一些基本的Gradle命令行!Android Studio 本身集成了一个内部版本的Gradle,在安装Android Studio的时候,就自动给安装上了,这对于我们这样的小白对Gradle的理解没有帮助意义,所以我们单独将Gradle原始版本

【转载】分贝是个什么东西?

来源:未找到- 大家都是用计算机做音乐的高手了--呃,那位同学!别紧张嘛~看你激动的,高手其实也没什么了不起的--不信?那我问问你几个问题,你答得上来,算你了不起!我们用电脑做音乐的时候,经常会接触到各种各样的表,无论是测量什么的表,它们都离不开一个单位--分贝(dB),我的问题就和它有关,听好了: 1. 20dB和60dB究竟差多少?(不要回答我60-20=40(dB),我抽你呀!你告诉我40dB究竟是多响,难道用手指在峰值表上测量距离吗?) 2. 72dB和66dB的声音合在一起有多响?(停

可软件定义的存储逻辑——Efficient and agile storage management in software defined environments

        note:写这个也许算是翻译,又或算是对这个论文[1]的理解,又或者只是我的看法.         这篇论文和IOFlow相比较,更加地注重软件定义存储的框架(我觉得是利用已有的框架来创建新的框架,然后使用已有的协议),而不是像IOFlow那样注重通信的协议.并且,这个框架还是软件定义环境的框架,而不仅仅是存储的框架,不过全文注重说了存储(更有挑战性).特别地,关于可软件定义的存储逻辑,从这里可以管中窥豹. SDE软件定义环境 数据中心的环境包括Compute.Network和S

Gradle 教程:第一部分,安装【翻译】

原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-1-installation-setup/ 在这篇教程里,我们将主要讲解如何在我们自己的系统上安装.配置.原始版本的Gradle,并学习一些基本的Gradle命令行!Android Studio 本身集成了一个内部版本的Gradle,在安装Android Studio的时候,就自动给安装上了,这对于我们这样的小白对Gradle的理解没有帮助意义,所以我们单独将Gradle原始版本

Gradle 梳理:安装、入门使用方法

原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-1-installation-setup/ 在这篇教程里,我们将主要讲解如何在我们自己的系统上安装.配置.原始版本的Gradle,并学习一些基本的Gradle命令行!Android Studio 本身集成了一个内部版本的Gradle,在安装Android Studio的时候,就自动给安装上了,这对于我们这样的小白对Gradle的理解没有帮助意义,所以我们单独将Gradle原始版本

CentOS安装与配置LNMP

本文PDF文档下载:http://www.coderblog.cn/doc/Install_and_config_LNMP_under_CentOS.pdf 本文EPUB文档下载:http://www.coderblog.cn/doc/Install_and_config_LNMP_under_CentOS.epub 原文链接:http://www.coderblog.cn/article/36/ CentOS安装与配置LNMP(1):Nginx安装与常用命令 Nginx是一个轻量级的HTTP服

小云杂谈之从米技炉看破互联网

国庆7天都是在看朋友圈里面游山玩水,而自己也有了睡觉!睡觉!睡觉的时间,在国庆的最后一天突然头脑发热去解了下毒,突然发现了很多有趣的事情. 一切的开始来自于米技炉,这个东西是被我老婆科普的东西,而且心心念念了很多年,每每看到东方CJ的宣传的时候都有拔草的冲动.不知怎么今天去专门了解了一下,真是不看不知道,一看真奇妙. 德国Miji一直是让我觉得高端的牌子,我一直好奇的是这么牛逼的一个厨具怎么双立人.西门子之流没有克隆?而作为隔壁邻居的日韩也没有下手!作为拷贝特长的国产货也没有类似像样的宣传!于是

JAVA 笔记(三) 从源码深入浅出集合框架

集合框架概述 以Java来说,我们日常所做的编写代码的工作,其实基本上往往就是在和对象打交道. 但显然有一个情况是,一个应用程序里往往不会仅仅只包含数量固定且生命周期都是已知的对象. 所以,就需要通过一些方式来对对象进行持有,那么通常是通过怎么样的方式来持有对象呢? 通过数组是最简单的一种方式,但其缺陷在于:数组的尺寸是固定的,即数组在初始化时就必须被定义长度,且无法改变. 也就说,通过数组来持有对象虽然能解决对象生命周期的问题,但仍然没有解决对象数量未知的问题. 这也是集合框架出现的核心原因,