设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3244|回复: 6
打印 上一主题 下一主题

[模块/函数] 【Access小品】脱裤子放屁--代码修改完善方法示例(初学者必读)

[复制链接]
跳转到指定楼层
1#
发表于 2012-10-19 11:29:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 todaynew 于 2012-10-19 13:49 编辑

  yanghua1900363同志有一个程序运行上的错误,于是将一段代码贴了出来寻求答案。我看了一下,造成错误的原因倒不在这段代码中,问题应该出在代码所调用的一个函数上。不过这段代码有点意思,有点意思的原因是比较典型而常见的脱了裤子放屁。代码编写过程中,再熟练的程序员,都可能出现这个问题。因为人的思维是渐进的,不大可能一下把思路全部理清晰。但是不断的修改和完善代码的过程,是个好的习惯,这不仅在于能使代码本身变得简单易读。而且在于可以不断的积累编程的经验,掌握编程的规律。于是乎决定写此例,阐述代码修改完善的基本过程。


一、yanghua1900363同志的原代码:

Dim intmessage As Integer
Dim rst As New 记录集封装程序
If rst.OpenRecordset("appraisal", "[销售订单id]=" & Me.销售订单id) Then
      If IsNull(rst.Recordset("appraisalID")) Then
          intmessage = MsgBox("该订单尚未评审,是否进行评审?", vbYesNo)
          If intmessage = vbYes Then
              Call 订单评审
          End If
      Else
          If Not IsNull(rst.Recordset("appraisalid")) Then
              intmessage = MsgBox("该订单已被评审,是否再次进行评审?", 4)
              If intmessage = vbYes Then
                 Call 订单评审
              End If
          End If
      End If
End If

二、分析和改进代码的过程:

  这段程序采用了if的多层嵌套结构,但这个嵌套多了些脱裤子放屁的意味,而且是脱几层裤子放屁。首先,IsNull(变量)与Not IsNull(变量)是互斥的,而if else end if已经表明了这种互斥关系的程序结构,于是放屁之前就多余穿了一件裤子。于是乎,程序应该简化为:

Dim intmessage As Integer
Dim rst As New 记录集封装程序
If rst.OpenRecordset("appraisal", "[销售订单id]=" & Me.销售订单id) Then
      If IsNull(rst.Recordset("appraisalID")) Then
          intmessage = MsgBox("该订单尚未评审,是否进行评审?", vbYesNo)
          If intmessage = vbYes Then
              Call 订单评审
          End If
      Else
          intmessage = MsgBox("该订单已被评审,是否再次进行评审?", 4)
          If intmessage = vbYes Then
                 Call 订单评审
          End If
      End If
End If

  在剩余的代码中,if结构中的语句基本相同,这说明秋裤和内裤穿反了,因此把最里层的秋裤穿到外层来。程序应该简化为:

Dim intmessage As Integer
Dim rst As New 记录集封装程序
If rst.OpenRecordset("appraisal", "[销售订单id]=" & Me.销售订单id) Then
      If IsNull(rst.Recordset("appraisalID")) Then
          intmessage = MsgBox("该订单尚未评审,是否进行评审?", vbYesNo)
      Else
          intmessage = MsgBox("该订单已被评审,是否再次进行评审?", 4)
      End If
   If intmessage = vbYes Then
     Call 订单评审
   End If
End If

  再仔细观察一下,if eles end if结构体中的语句,只是字符串的不一样,也就是内裤上绣的花不一样而已。于是程序简化为:

Dim str As string
Dim rst As New 记录集封装程序
If rst.OpenRecordset("appraisal", "[销售订单id]=" & Me.销售订单id) Then
      If IsNull(rst.Recordset("appraisalID")) Then
          str = "该订单尚未评审,是否进行评审?"
      Else
          str = "该订单已被评审,是否再次进行评审?"
      End If
   If MsgBox(str, vbYesNo) = vbYes Then
     Call 订单评审
   End If
End If

  进一步观察字符串,发现第二句与第一句略有差别,也就是内裤上都绣了花,只是花型有点区别而已。于是程序简化为:

Dim str As string
Dim rst As New 记录集封装程序
If rst.OpenRecordset("appraisal", "[销售订单id]=" & Me.销售订单id) Then
   str = "该订单尚未评审,是否进行评审?"
      If IsNull(rst.Recordset("appraisalID"))=false Then
          str = replace(replace(str,"尚未","已被"),"是否","是否再次")
      End If
   If MsgBox(str, vbYesNo) = vbYes Then
     Call 订单评审
   End If
End If

  捣腾到此,如果还想进一步简化,就可以写成如下了:

  
Dim str As string
Dim rst As New 记录集封装程序
If rst.OpenRecordset("appraisal", "[销售订单id]=" & Me.销售订单id) Then
   str = "该订单尚未评审,是否进行评审?"
      If IsNull(rst.Recordset("appraisalID"))=false Then str = replace(replace(str,"尚未","已被"),"是否","是否再次")
   If MsgBox(str, vbYesNo) = vbYes Then Call 订单评审
End If

  简化后的语句与简化前相比减少了10句。基本上就是穿一条外裤一条内裤直接放个响屁就可以了。这屁放响了,便也就上下通气,心旷神怡,宠辱皆忘,把酒临风,其喜洋洋则已。

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖1 订阅订阅
2#
发表于 2012-10-19 14:39:01 | 只看该作者
写得好!
3#
发表于 2012-10-19 17:46:02 | 只看该作者
我觉得第二条第3个代码最好,虽然多了几条语句,但是结构清晰,容易阅读和修改。
4#
发表于 2012-11-30 14:25:11 | 只看该作者
多谢“todaynew”老师的再次指教。
5#
发表于 2012-12-1 08:02:30 | 只看该作者
嵌套if结构,我等新手都容易犯错。
程序写出来是一会事,如果让代码简洁,高效,便于维护是更高的问题了。
谢谢前辈
6#
发表于 2012-12-1 11:46:45 | 只看该作者
不愧是版主,解决方案就是好啊
7#
发表于 2012-12-7 08:44:25 | 只看该作者
精辟,高手就是不一样,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-22 22:38 , Processed in 0.122232 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表