大道至简——老子·《道德经》
代码是我们的敌人——Jeff Atwood ·《高效程序员的修炼》
硅谷的大牛Jeff Atwood说过一句言简意赅的箴言:代码是我们的敌人。其实代码不光是程序员的敌人,它还是一切与项目有关的人的敌人。多一行代码就意味着:多一行代码需要调试,多一行代码需要阅读,多一行代码需要测试,多一行代码可能发生错误!这就像“蝴蝶效应”,随着项目时间和人员的累积,一个项目将会变得越发臃肿而且错误频发,而一个项目越臃肿和错误频发就要投入越多的人力和时间进行维护,这样就形成了一个恶性循环。著名的IT顾问Andy Hunter曾在他的《程序员的修炼之道》里面指出:一个rot的项目通常都是从一些小的模块开始腐烂的,即所谓的“破窗效应”。而为了避免一个项目过早地走向衰败,我们可以从根本下手,那就是减少代码的数量!
减少代码的数量,从哪儿做起呢,我觉得最有必要的就是从SQL语句开始下刀!
很多应用系统的开发人员喜欢把大量的逻辑写到sql语句里面,比如下面的SQL,包含了日期类型转换和一个case语句:
select convert(date,’yyyy-mm-dd’),case A when 1 then … else end from …
逻辑控制是程序的强项,SQL(标准化查询语言)是检索和更新数据的语言。程序是面向对象的,SQL对于应用系统来说不过是一句扁平的字符串。面向对象的程序语言显然有更强的逻辑处理能力,有更加强大的扩展性和可读性。SQL函数有很多都是非标准化的,不同的数据库之间函数的写法完全不同,从这一点看SQL的移植性也大大不如程序。而且不恰当的sql函数使用可能令数据库索引失效而发生全表扫描,比如把函数放在where语句里面。
试想上面的语句的查询结果如果要先后应用在两个页面上,A页面要只显示年-月-日,B页面要显示年-月-日时分秒,难道你要再写一条SQL语句?另外,嵌套在sql里面的case之类的逻辑语句如果较多,将给阅读SQL带来不方便,如果非要在sql语句里面进行这样的处理,应该考虑能否把这部分语句用循环的方式在程序里面生成。
写复杂的sql不是一件牛B的事情而是为项目增加拖累,在应用开发时尤其如此。如果是做数据分析数据挖掘之类的事情,那就另当别论。
减少代码的数量,第二件可以做的事情,减少冗余的方法和SQL语句
这件事对于那些几乎不写设计文档的项目组来说似乎有困难,也许他们可以用代码生成器或自定义框架之类的办法来减少这样的问题。当然如果有代码评审或结对编程之类的措施就更棒了。Jeff Atwood就曾在他的博客里面大加赞赏这两种工作方法,并一度指出这样的方法可以降低60%的BUG发生率!
有如下一段方法签名:
selectProductByA(String A);//给XX君调用
selectProductByAB(String A ,String B);//给某A页面用
selectProductByABC….(String A,String B,String C…..StringN);//给C页面用
不要小看这种现象,这种现象几乎在我经历的每个项目里面都发生,而且在大项目中这种问题可谓数不胜数。很多人似乎都不屑于在写代码前先去看一看那些已经有的接口,这实在是个不懂团队合作的坏习惯。这种浪费型的写法带来的后果是项目中类爆炸、接口爆炸,BUG反复出现,也许一个小小的修改要涉及到四五个不同的类和方法。这种写法一开始就应该用一个对象参数来包含各种参数的调用。类似的浪费写法还有一些无谓的重复sql,比如按a属性查询写一个sql,按ab属性查又写一个sql。方法的参数定义应该简略,当然最好的传参方式就是对象。不要觉得这种方式是大材小用,在需求扩展的过程中你必将体会到对象传参的精彩妙用,而且对象(领域模型)也是连接三层架构的一条重要纽带。
减少代码的数量,第三件可以做的事是把正确的代码写在正确的地方!
一个项目的规模通常会随着需求的变化而变化,因此三层架构仍不失是项目中可采用的万全之策。那么如何在这三层架构中找到代码的位置呢,首先你必须做到第一点——简化SQL!
一般来说Dao层类是和数据库表对应的,那么我们可以按照返回的数据集结果来决定把我们的SQL放在哪个Dao里面。
在很多简单的小型系统中,业务逻辑基本上就等于数据查询的逻辑,因此服务层的作用被大大弱化了——基本成了控制层和Dao层之间的“传话筒”,或者在一些spring框架中做事务控制之用。但是,当SQL语句被简化后,一部分业务逻辑就被往上“推”到了服务层,我们会发现原来“打酱油”的服务层慢慢变得有事可做了,服务层里面可以做各种判断,鉴权,运算以及复杂数据结构的整合,也就是把各个Dao里面查出来的数据做各种转换,达到符合控制层输出的目的。
控制层做的事情主要是对页面的数据进行接收和校验,并且做一些简单的数据转化,比如截取、过滤这样的事情,并决定最终视图的走向。如果你有一个自定义的el函数库之类的东西,在页面上做些数据的转化也未尝不可。
合理地安排代码的位置,可以提高代码的复用性,这让我们更轻松地适应需求的变化!
我国伟大的思想家老子在数千年前就发现了“大道至简”的道理。简单意味着强大,简单意味着轻松,简单也意味着更低的成本。所以我们应该着力于如何把复杂的事情变简单!Make it easy!
相关推荐
标题中的“基于PHP的全功能颠覆革命性框架大道至简大有若无”指的是一个以PHP编程语言为核心的高级开发框架,旨在提供全面的功能并简化开发流程。这种框架可能具有高度的灵活性、可扩展性和高性能,使得开发者能够...
在Web应用开发中,追求“大道至简”,使用轻量级工具开发高效应用。同时,注重界面友好性、代码优雅性和系统稳定性,平衡功能、实用性和稳定性的关系,以适应业务需求和时代发展。 Web应用的开发流程包括脚本编写、...
ThinkPHP本身具有很多的原创特性,并且倡导大道至简,开发由我的开发理念,用最少的代码完成更多的功能,宗旨就是让WEB应用开发更简单、更快速。为此ThinkPHP会不断吸收和融入更好的技术以保证其新鲜和活力,提供WEB...
Python是一种广泛应用于数据分析、Web开发、自动化脚本和人工智能等多个领域的高级编程语言。在自学Python的过程中,以下几个关键知识点和步骤是不可忽视的: 1. **基础入门**:首先,找到一位熟悉Python的朋友或者...
遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而 诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性 能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性...
* 了解Python的大道至简的理念,使用适合的语言解决合适的问题。 学习方法 * 看书,学习的基础。 * 自己本地练习,编程还是要实践出真知。 * 资料查询,使用Google、Stack Overflow等多关注。 * 交流,参与各种...
Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱,尤其适合初学者入门。"如何自学-Python(干货合集)"这个文档集合提供了丰富...遵循"大道至简"的理念,你会发现Python能为你带来极大的便利。
其核心理念是"大道至简,实践为真",提供了一套完整的MVC(Model-View-Controller)模式,便于开发者进行模块化开发。 二、OA办公系统概述 OA办公系统是一种实现企业内部办公自动化、信息共享、流程管理的软件系统...
《深入解析ThinkPHP5.0框架》 ...本压缩包"thinkphp5.0.rar.rar"包含了...通过深入学习和实践ThinkPHP5.0,开发者不仅可以提升PHP编程技能,还能掌握一套高效的应用开发流程,为构建高质量的Web应用打下坚实基础。
JFinal 的核心理念是“大道至简”,这使得开发者能够快速进行开发,节省时间,提高效率。对于初学者来说,JFinal 框架非常适合,因为它具有较低的学习曲线,只需简单的配置和少量的代码,就能实现功能丰富的Web应用...
- **推荐序一**:《大道至简》作者周爱民分享了他对架构的理解,强调架构是一个持续的过程而非静态的产品,同时指出架构师头脑中的清晰图像对于架构成功至关重要。 - **推荐序二**:黄冬强调架构不是凭空出现的神秘...
该框架遵循“大道至简”的原则,提供了诸如自动路由、模型绑定、行为扩展、缓存管理等众多功能,极大地简化了开发流程。 1. MVC模式:ThinkPHP3.2采用Model-View-Controller(MVC)设计模式,将业务逻辑、数据处理...
开发者可以自定义处理器映射器、视图解析器等,实现灵活的Web应用开发。 MyBatis是一个持久层框架,它简化了数据库操作。MyBatis允许开发者编写SQL语句,然后通过XML或注解方式将这些SQL语句与Java代码关联起来。...
在IT领域,特别是软件开发中,C#是一种广泛使用的编程语言,由微软公司开发并推广,主要用于构建Windows桌面应用、Web应用以及游戏等。本文将深入探讨如何利用C#来创建远程控制(远控)软件,这是一个涉及到网络通信...
在本文中,我们将深入探讨如何使用Spring MVC、MyBatis、Maven和JUnit这四大核心技术来构建一个功能完备的Web应用程序,实现数据的增、删、查、改(CRUD)操作。Spring MVC作为Spring框架的一部分,是用于构建Web...
系统设计 1 jive设计思路 2 jive的工作内幕 3 Jive源代码研究 4 Jive中的设计模式 5 jive学习笔记 <br> 设计模式 1 大道至简-Java之23种模式一点就通 2 设计模式...
通过Python,你可以进行系统脚本编写、数据分析甚至Web开发。 实验部分可能包含实际操作任务,比如设置环境变量、配置网络连接、安装和管理软件包,以及调试程序。在Linux中,你可以使用`apt`或`yum`等包管理器来...
Perl是一种强大的脚本语言,常用于文本处理、系统管理、网络编程和Web开发等任务。ActivePerl包含了所有必要的组件,使得Perl在Windows环境下可以轻松安装和运行。 ActivePerl的特点包括: 1. **兼容性**:Active...