2019独角兽企业重金招聘Python工程师标准>>>

在J2EE领域来说,SSH/SSI是好东西,是大师们呕心沥血的结晶。但,他也是坏东西。

好的一面,相信不用多说,大量的设计模式运用,极大的降低程序员入门门槛,规范企业应用开发,提高生产效率等等。无论从企业成本抑或个人技术发展方面,都堪称精华之作。

What: SSH/SSI的坏处是什么

现在,我们讨论它坏的一面:

1.降低程序员入门门槛

  你只需要一本《xx天学会xx》,就可以参加工作,赢取其他行业羡慕的薪水。但,这真的好吗?!我们不讲程序是算法和数据结构的结合,不讲高大上的理论和技术,我们都是平凡人。从急需就业的角度讲,能让你快速学会一门技术,这是很好的。但是,当很多平凡人尝到了这个急功近利的甜头后,就觉得技术就是这样,我什么时候用到了再临时抱下佛脚,于是不思进取,混吃等死。越来越多的企业应用开发人员进入了这种状态中。有的人知道这是不对的,可是看到别人是这样,自己随大流,也不去改变。

2.规范企业应用开发

  从企业生产角度看,能够把本来无法规范的事情,形成规范化的流程化的生产过程,这是非常好的事情,可以大大降低生产成本,提高产品质量。但是,流程的副产物就是僵化!

  前面说到,由于入门门槛降低,鱼龙混杂,人员水平参差不齐。对于这种规范,有的人理解他是规范,是参照物,有的人理解他是规定,是必须遵守的准则,再加上不思进取,知其然而不知其所以然,导致这种僵化现象更加严重。

3.大量的设计模式运用

  部分开发人员看到框架这么用设计模式,于是看见什么都像钉子,这个与本篇主题关联不大,这里不多讨论。

Why: 为什么这是他的坏处

道理讲完,我们来看具体的例子。

相信很多人在开发SSH/SSI应用时,都要写jsp,action,service,dao这几个典型模块。那么,我为什么开发一个功能需要写这些模块,我为什么不可以用其他的方式来实现?

有人说,因为这是遵循MVC模式,是针对业务的分层模型,更便于开发维护,及与其他开发人员交流。

那么,我们就从MVC入手,看看为什么要这么做开发。

V:View 视图层,也就是直接和用户交互的那一层,是数据展示层

C: Controller 调度层,指将view层的请求转发给服务层,组合调度服务层实现view层的请求,并将服务层的数据返回view层

M: Model 数据模型,指服务层+数据层,也就是常说的 Service+Dao,主要用来实现业务逻辑,并返回业务数据

上面的理论相信每一个J2EE的开发人员都有看过相关介绍。对于View层,我们不多讨论,无论使用哪种View技术,它的目的比较单一,相对比较容易理解。

这里主要说C和M。

常规的做法是,新建Action,新建Service接口,新建Dao接口,新建ServiceImpl实现Service接口,新建DaoImpl实现Dao接口。

这里就回到主题了,为什么一定要这样建这么多类和接口?

很多初级开发人员不管三七二十一,上级这么要求,就这么写,不懂变通,久而久之,就认为web就应该是这样的.....

或者,混淆C和M的职责,造成业务逻辑混乱,代码大量冗余。

How: 正确的做法

那么正确的做法是什么?

一、职责单一,专注

小到一个方法,一个类,大到一个模块,再大到一个系统,它所做的事情应该是单一的,它只应该专注一件事,一个领域。

Controller调度器,既然称为调度器,就不应该存在复杂的业务逻辑,它的职责应该是单一的,就是负责吧下层的服务模块组合排列,实现view层的数据请求。

Service服务层,既然称为服务层,就应该专注于服务,实现所有的业务逻辑,调用并组合Dao层查询方法,不应该存在调度和直接DB请求。

Dao,Database access Object,数据库访问层,专注数据库访问,不应该存在业务逻辑。

二、模块化

前面说到Controller负责调度,那假如我把所有的业务都写到一个service方法里面,action就调了一个方法,别的什么事情也没做,那这个调度是不是就没用的?(service也一样,如果没有业务逻辑,单纯调用Dao方法)。

需求就像一个奇形怪状的建筑物,你有两个选择:

1.直接造一个这样形状的建筑物,满足需求,下一次在直接造。

2.切分,将这个奇形怪状的建筑物切分成规则形状的积木,然后拼接粘合起来。下一次继续切分,慢慢的你手里的规则积木越来越多,你的代码也会越来越好写,每个新需求,你只要利用现有积木加上一点胶水粘起来即可。这时候action,service的真正功能才能体现出来。

这里说的积木就是模块,这个模块可以是一个方法,一个类,一个封装完整的功能。

相信都能看出来那种方法是好的,但是为什么大多数人都要采用第一种方法来写代码呢?

三、大而化之

在职责和模块讨论清楚后,我们来考虑,view/action/service/dao到底是什么,可否换一种写法,当我们在分层的角度,在来看他们,其实他们只是一种层次的划分,上层依赖下层,下层为上层提供服务,框架定义了我们要这样分N层来写。那我也完全可以自己定义分四层,五层...只要业务需要,于是这就形成了一种属于你自己的编程思想。

上面三步需要一步步走扎实,当然,刚开始肯定是比较困难的,也许比你平常写代码还要困难,也更慢,这时候你需要一种品质:处女座(追求极致)! :)

Then: 终言

我们都知道java世界的工具框架很多,对于工程化开发来说,专注业务,不用造轮子,不错!但是对于开发人员自己来说,就很容易造成思维僵化,入门容易,基础差,提升困难!

这也应该是C程序员转java容易,java程序员转C困难的一部分原因吧!毕竟很多老C程序员是自己维护自己的工具库,而这工具库是自己一个个码出来的。宝剑锋从磨砺出,外部环境的优沃常常造成基础的不牢固。

常常说懒是一个程序员的优秀品质,因为计算机本身就是懒的产物。但是,在夯实基础时,必须苦功夫,笨功夫,追求极致,凡事多问多想几个为什么,你才能有懒的资本。

任何事情都有两面,过犹不及,中庸不等于平庸!

转载于:https://my.oschina.net/wen1512/blog/870522

软件开发中的思维僵化相关推荐

  1. 彼之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践

    作者:sherrywasp https://www.cnblogs.com/sherrywasp/p/9436623.html "描述一个事物,唯有一个名词定义它的概念,唯有一个动词揭露它的 ...

  2. 大型软件开发中的流程与规范

    对于长生命周期的大型软件,流程和规范十分必要.IT行业作为一个快节奏的行业,不光技术革新快,人员的更替也是很快的,没有严格的规范和流程,几个大版本迭代下来,可能产品的代码就维护不下去了. 估计很多大厂 ...

  3. 软件工程-软件开发的工程思维

    软件工程-软件开发的工程思维 目录 软件工程-软件开发的工程思维 前言 什么是软件工程? 定义 出现的背景 软件工程核心知识 与项目管理的区别 软件工程的目标 为什么需要软件工程 如何做好软件工程:原 ...

  4. 软件开发中的10个认知偏差

    最近,在和同事们讨论产品经理职责的时候,聊到了关于产品的定义,如果不能准确定义"产品"的时候,可以考虑其必要条件,即可没有用户的产品肯定是没有意义的.产品有了用户, 必然存在用户与 ...

  5. 软件开发中的详细设计

    传统软件开发中的详细设计: 模块内的数据结构进行设计.比如模块中类.结构体的设计 对数据结构进行物体设计.比如数据库表的设计,文件存储的设计,文件存储目录的设计 每个模块进行详细算法设计.比如每个方法 ...

  6. 软件开发中会使用到的图

    文章目录 软件开发中会用到的图 一.背景 二.图为了解决什么问题 三.不同流程中适合运用的图 四.实际的运用 五.结语 软件工程中的各种图 软件工程用的15种图 数据关系流图怎么画?这款软件教你轻松绘 ...

  7. 软件开发中“埋雷容易,排雷难”

    软件开发中"埋雷容易,排雷难" 先讲一个亲身经历的故事,在支持一家机顶盒场景的项目中,由于初期客户不信任,或者是故意刁难,新平台的引入没有安排有经验的老员工或骨干,直接安排刚毕业的 ...

  8. 汝之蜜糖,吾之砒霜— 聊聊软件开发中的最佳实践

    文章来源:https://www.cnblogs.com/sherrywasp/p/9436623.html 作者:sherrywasp "描述一个事物,唯有一个名词定义它的概念,唯有一个动 ...

  9. 【转】工作分解结构在软件开发中的应用

    1 概述 通过对项目管理的系统学习,我个人对于工作分解结构在软件中的应用有很深的感触,对于工作分解结构在软件开发中的应用有一些个人的看法和见解. 首先我们看一下项目分解结构的定义,工作分解结构是进行范 ...

最新文章

  1. 详解:Drools规则引擎探究
  2. win10系统中VMware与Hyper-v不兼容
  3. 写一个比较全的进制转换函数--ic
  4. 2556. [NOIP2016]玩具谜题
  5. PostgreSQL下如何修改用户权限的介绍以及hook机制对超级用户的权限修改
  6. Ajax-goahead局部刷新页面
  7. 基于聚类的“图像分割”
  8. list java removeif_java – removeIf()方法.从List中删除所有元素
  9. python关于二手房的课程论文_python之数据清理-以二手房信息为例
  10. 关于DX中纹理平移的一个小问题
  11. 高接低挡,Isilon三款新品铺开战线
  12. POJ 2182 Lost Cows
  13. ZZULIOJ.1092:素数表(函数专题)
  14. 各类重积分 | 二重积分、三重积分、线面积分 —— 大总结
  15. 怎么安装苹果系统mac os x虚拟机
  16. Axure8.0基础教程 一
  17. 学校计算机房的布线注意要点,计算机机房布线的注意事项
  18. 码分多址matlab代码,基于matlab的码分多址系统仿真
  19. phpExcel 正确读取excel表格时间
  20. Deepin安装使用微信

热门文章

  1. 辉芒微IO单片机FT60F011A-RB
  2. MATLAB编写用户登陆界面小结——更改界面左上角图标、输入用户名提醒和输入密码隐藏
  3. 业务中继承关系研究(数据库)
  4. DirectUI学习笔记(1)
  5. Linux清理文件内容的四种方式
  6. Codeforcs 1183B Equalize Prices
  7. Essential singularity
  8. Word、Excel、PPT等图标异常解决方案
  9. 虚数的现实、物理意义是什么?
  10. 如何在Fedora 上dnf安装Node.js