不知道你有没有遇到过这样的场景,业务逻辑很清晰,但是代码实现异常困难,然后上网求助加班。
其实,这种情况,通常意味着你的设计出了问题,一般遇到这种问题,包括我的程序员,我都建议暂时把代码放一放,喝杯茶,重新审视自己的思路,这一点我感受很深。
我第一次做病区的医嘱管理程序,客户要求支持续打,这个问题的难度在于,它不是一般的续打,例如银行存折打印就是原来打到了第三方,这次要从第四行打印,医嘱的续打特别变态,比如我打印了30行医嘱,后来第一页第三行医嘱作废,续打程序要求在第一页第三行叠加打印删除线,当时直接就懵逼了,这个问题深深的困扰了我几天时间,终于恍然大悟,重新设计了打印过程:
1.执行一个虚拟打印过程,打印全部医嘱到一个XML文件YZ.XML中,XML文件的结构这样定义示例如下
<pages>
<page num=“1” >
<line num=“1” context="青霉素 ivgtt bid " deleted="0"/>
<line num=“2” context="葡萄糖 ivgtt bid " deleted="1"/>
</page>
.....
</pages>
2.提取上次的XML文件,逐行对比,生成差异文件 DYZ.XML,结构同YZ.XML,但是相同部分被删除
<pages>
<page num=“1” >
<line num=“2” context="青霉素 ivgtt bid " deleted="1"/>
</page>
.....
</pages>
3.执行真正的打印过程,该过程根据DYZ.XML打印,打印过程中提醒用户放第几页纸张
4.打印结束后,保存YZ.XML以便下次使用
这样设计后,程序书写异常简单,一天完工。
再举一个例子,关于数据排序问题,估计很多人遇到过,就是某些数据需要手工排序,并记忆顺序,按道理很简单,添加一个顺序字段,人工指定一个顺序号,以后取数据:
select * from TableA order by 顺序号
看起来很简单,我曾经也这么做过,可是后来发现,如果我要调整顺序,去异常艰难,比如我把最后一个改成第一个,如果一个表有几万条记录,就必须改写所有的记录的顺序号,这个问题困扰我很久,直到有一天豁然开朗,把顺序字段改为浮点型,问题迎刃而解,如果某条记录调整到N和N+1行中间,这条记录的顺序直接取第N行数据和N+1行数据顺序号的平均值即可,避免了其它记录的修改。