you will enjoy it —— 两年来一点不成熟的心得和方法论
面向对象是世界观,分析世界,抽象,概括,建立模型。
面向过程是方法论,用“顺序、选择、循环”来反映实现功能的步骤。
对环境建模,用的是面向对象的办法,结果是程序中的世界观:类图和数据字典。
对业务建模,用的是面向过程的办法,结果是程序中的方法论:顺序图,状态图,活动图。
一定要避免过度设计。
建模本身就是抽象,对现实的简化处理,提炼重要矛盾,忽视次要矛盾。
这需要一定的水平,如果不确定,就宁可过粗,不可过细。
如果过度设计,破坏太大了,结果可能是无法挽回的。
千万不要沉迷于自己的智商。
程序只是为了反映现实的世界和流程,对程序抱有的期望只应该是它能尽量鲜活地反映现实。
体现智商的地方,应该是在对环境和业务建模的过程中,建模完成,程序就宣告完成。
剩下的,只是老老实实地把模型敲写到编程语言里,在这个过程中,要尽量避免自以为聪明的修改。
程序是浑然一个整体,应该是混沌的。
现在行业最大的问题是人才的过度流动,工作交接的草率。
单位内部规范的强度不够,行业内部专业素质的普遍低下。
程序员缺乏对自己的代码像对孩子一样的热爱,在礼崩乐坏的时代狼奔冢突地追求利益,缺乏程序员的职业道德。
道德沦丧的时代,日新月异的行业,整个行业的浮躁和自私。
需要慢,分析业务要慢,建立模型要慢,架构系统要慢,强调规范要慢。
这些阶段的慢,恰恰是为了快:减少返工缩短开发时间,扩展性维护性强缩短维护时间,性能良好缩短运行时间。
四慢三快。
工作之前需要吃饱、喝饱、睡饱。
思考的过程要慢,要离开自己的开发界面,在比较轻松的环境里,最好是走着或站着。
思考得出一些灵感,可以落实在纸面上,一定用黑色的签字笔,最好用大白纸而不是小本子。
多画图,写伪码,可以把自己的想法意识流地杂乱地写下来。
思路渐渐清楚了,退后几步远点看,心里有没有别扭的感觉,设计的模型和逻辑与真实的业务,是很轻松地反映,还是很生硬和牵强?如果是后者,必须返工。
确定思路之后,可以在纸上勾勒文档了,类图,业务流程图,前者代表世界观,后者代表方法论。
除了类图之外其他的uml图几乎全都没有用。
java的web程序一般分为显示层、业务逻辑层、持久层。
持久层与需要持久化的表打交道,每张表应该对应一个类,这个叫po。(这里也是hibernate的用武之地)
显示层中的实体用于接收页面的参数,并保存应该显示在页面上的数据,这个叫info。(这里也是struts的舞台)
业务逻辑层是真实反映业务逻辑的地方,这里的类应该和现实中的实体完美对应,即是与类图中的类完美对应,不多字段也不少字段,字段类型也不受前台或数据库的影响,该是什么类型就是什么类型。(这里可在spring的掌控之中)
业务逻辑层也是大部分设计模式发挥威力的地方。一个程序员的功力主要在这里得到体现。
不是体现他有多么聪明,而是体现他有多么智慧,代码的逻辑完美地显示出现实中的逻辑,在代码中看不出程序员的故意聪明,也看不出他的蠢笨。
这种状态,一般称为优雅。
持久层与数据库的二维表结构沟通,表现层与页面上的树状结构沟通,还要兼顾http协议的特点。
从某种角度看,持久层和表现层是干脏活和累活的,不出彩(也不应该出彩,出彩即是出问题),但是绝对不可或缺。
好的表现层代码和持久层代码可以让程序员写业务逻辑层的代码时,如鱼得水,如臂使指,而不受拘束。
从而他可以行云流水地把功能反映到业务层的代码中,因为他所面对的,已经消除了dom树,远离了二维表,不用管http,他只要用纯java的对象完成现实的功能。
过度封装可能会提高开发效率,但是这样做的可适用范围太小。
想要做好设计,必须先精通开发,知道某种语言能做什么,不能做什么,效率如何。
只有这样,才有前后打穿、四体通透的感觉,否则无论如何都会感到力不可及和捉襟见肘。
表现层要解决以下这些问题。
客户端提交的请求中的参数没有类型,而java是强类型语言,怎样转换,参数为空怎么办,类型不符合怎么办,虽然类型符合但是逻辑不通怎么办。
返回的结果是jsp生成的dom树,一些组件比如select标签,表格的动态生成,怎样使用业务逻辑的结果,结果为空怎么办。怎样避免在页面里出现过多的scriptlet。
还要考虑编码。
总而言之,表现层与页面和http打交道,与dom这种数据结构打交道。
需要会html,javascript,css,jquery之类的ajax框架。根据项目采用的技术要会使用的struts之类的web框架。
什么功能完全在页面完成,什么功能用ajax完成,什么功能用刷新整个页面完成。
持久层要解决以下这些问题。
从表里拿到po,将po做持久化(插入,修改,删除)。
简化jdbc连接数据库时每次都要写的重复代码,简化拼装sql语句,简化将结果集resultset转化为po的集合。
总而言之,持久层要与数据库服务器打交道,与二维表这种数据结构打交道。
需要会当前使用的数据库的sql语法。根据项目采用的技术要会使用的hibernate之类的持久化框架。
业务层在表现层和持久层的支持下,应该是最鲜活的也是最考校程序员功力的部分。
这个层里的代码完全是java的面向对象的语法,不需要考虑jvm以外的世界。
封装性,高效性,可扩展性,可维护性,可理解性,这些都源于对业务的深刻理解和谨慎建模。
这里装着程序的灵魂。
需要了解java的语法,设计模式,以及对业务的理解。根据项目采用的技术,可能需要使用spring。
与业务部门等需求方耐心而有技巧和分寸的沟通是重中之重。
低耦合,高内聚。
不重复发明轮子。
要保持快乐和享受的状态,要喜爱自己所编程序所反映的业务。
不要累,不要透支,不要竭泽而渔,要四慢三快,先建模型,做页面,建表格,然后做持久层,然后做业务层,然后做表现层。
尽管页面要最先做(这样会有成就感,减少恐慌感),但是基石是持久层,所以要按上面的顺序来,最后打通表现层和业务层。
最最后完善页面的js校验,完善页面的css美化。
在这之前的,是四慢,分析业务慢,建立模型慢,架构系统慢,强调规范慢。
这些都需要年富力强的经验丰富的核心成员来完成。在这之前,最多只能做一些页面(页面也需要美工规范定下之后),否则后果不堪设想。
一定要确定自己有较高的智商和逻辑思维能力,确定自己有创作的喜好,确定自己喜欢与代码打交道。
确定自己有坚强的意志和经得起打击的韧劲,有再坚持一下的勇气。有做一名程序员的觉悟和职业道德。
有即使被心浮气躁的人嘲笑也面不改色的肚量和抑制情绪的能力,有做一个平凡人的快乐心。
you will enjoy it.