给学习编程的朋友几点建议

类别:Asp 点击:0 评论:0 推荐:

给学习编程的朋友几点建议

偷猫,2002-1-26

  本文的观点,主要是针对初学者容易犯的错、容易走的误区和针对编程老手容易犯的旧错误而谈的,也许对你来说本文是多余的。另外,本文不止是讲教条,同时也讲了我自己在编程中的实际应用以及实际思路。如果对你有所帮助,我就没有白写了。

一、学编程要学算法

  大概是因为Visual系列程序设计工具太完美了的缘故,许多人学习编程后发现,原来编程这么好玩,从此就喜欢上了。也同样因为Visual系列程序设计工具太完美了,导致有相当一部分人以为画界面就是编程。

  前两天,我在办公室里有几位同事闲谈,谈到编程时,我笑道:“你到网上去看看,自称是程序员的人不下一亿。”当然这是个过分的夸张了,但是你不得不承认,也许有不止几亿的人亲自用鼠标在Visual Basic中画过界面,现在的小学生、初高中生都开设了Visual Basic程序设计课程。经过了短短的几节课的学习(一学期只有三四十节信息技术课,还不止学VB一个内容),许多学生会说:“我也会编程序了。”——真的吗?

  我不由得想起了多年前的微机学科。那时的微机课不外乎几个内容:DOS、WPS和Basic。那时的Basic语言,除了input和print两个语句可以看到运行结果外,其它的都看不到。全凭脑子想象、组合,去领会什么叫If-Then-Else,什么叫Fore-Next,什么叫Do-loop。由此学到了各种算法。那才叫编程啊。

  前几天居然在《编程空间》看到有一帖,跟人家讨论怎么编程,问的问题是诸如“怎样利用随机函数Rnd( )生成20个在1-100之间的各不相同的正整数”之类的问题,还指明要用VB编。由此可见算法被忽略到什么程度了。现在叫我把这样的程序编出来,无论是用Basic,还是用C,还是用Pascal,甚至用JavaScript,VBScript我都会随手编来,最多去查几个多年不用的单词是怎么拼的。为什么?就因为这些语言的算法是一样的。语法本身只是一个外壳,算法才是其中的灵魂。

  学会了算法之后,你再学几十个单词,就会了一门编程语言。你会发现,Basic、C、ASP、Java……都是一样的。

二、要明确什么是面向对象

  几年前,编程从来不用提对象。那时候在Basic和C中的输入输出是这样编的:

◆Basic:
Rem ----------输入输出---------
input age promapt "请输入你的年龄:"
print "你的年龄是:";age;"岁"

 

◆C:
//------------输入输出---------
printf("请输入你的年龄:");
scanf("%d",&age);
printf("\n你的年龄是:%d岁\n",age);

  那年头学过编程的朋友一定还记得这样的语句(至少我觉得这是终生难忘的),那时至所以不提对象,一是因为没这个必要,输入设备只有键盘,输出设置只有显示器。二是因为那时的程序也差,比如上面这样的程序,设计者先问你姓名后问你年龄,使用者就必须先输入姓名后输入年龄,现在呢?给你几个输入框,随你先填哪个,填好后按个按钮就行了。功能的复杂,导到了对象必然要出现。

  现在的编程一直在喊着“面向对象”,但是许多最近才学习程序设计的人,他们一起步使用的就是面向对象的语言,却反而不知道什么是面向对象。

  我给别人讲Visual Basic第一课时,跟本不就提什么编程,我只这样举生活中的例子:

◆请告诉我 冰箱.外壳颜色(访问对象的属性,用法:对象名.属性名)
◆自行车.颜色=红色(设置对象属性)
◆电视机.开(完成一个工作,用法:对象名.方法名)
◆汽车.行驶(北,100km/s,50km)(带参数的方法)
……

  这样做是不是一定比直接讲Visual Basic好我还不知道,但是这样至少可以让别人先感觉一下将要进行的编程中的一些思路。

  我不建议谁还去学面象过程的编程,我从八年前(1993)开始学习Basic,到97年学习结构化的True Basic,到98年开始转向面象对象的Visual Basic。这两次转折的时候,我都遇上了很大的困难:旧的思维方式一直在顽固地抵制着新的东西的进入。其中98年那一次,我花了半年时间才把思维方式转过来了。最近才学习编程的朋友,你们真的很幸运。

三、程序中要有详细的注释

  我有的时候看到人家编的程序,我简直受不了:他的程序里面几乎从来没有一个注释。如果你这样做了,你能保证过一年半载的还看得懂吗?——什么?你看得懂?有两个可能:这么长时间里,你一共才编了这么一个程序,而且只有几十行百来行。或者编了几个程序,都只有七八行。如果你编了几个大程序,每个几千行,你再回来看看半年前的那个,你试试。

  我记得98年我刚学Visual Basic时,我把小时候玩过的游戏《华容道》和在其它电子玩具上的游戏《黑白棋》移植到了计算机里,过了没多久,我再看我的《华容道》时,我已经看不懂了。——注意,我是有注释的,但还是看不懂。所谓看不懂,并不是看不懂其中的语句,而是看不懂某一个语句在整个程序段里起的是什么作用。

  后来,我就继续把注释做得更详细些。比如

◆说明每一个变量所表示的内容,取值范围
'------------申明变量-------------
Dim ShiFouYouQiZi(0:63) As Byte '某个位置是否有棋子的标志,取值0-2
                '1表示有玩家的棋子
                '2表示有电脑的棋子,
                '0表示没有棋子

 

◆说明每个过程的功能,参数,返回值
Public Function MakePath(ByVal OldPath As String) As String
  '一般情况下,可以用App.Path & "\shuju.dat"来表示当前路径下的shuju.dat
  '但是如果用户把程序装在一个驱动器的根目录下,就会出错,
  '比如C盘,上例将返回“c:\\shuju.dat”
  '这个过程的功能是将不以“\”结尾的路径后添加“\”,以便于加上“shuju.dat”
  'OldPath是没有处理过的路径字串
  '返回处理过的路径字串
  '使用方法:MakePath(App.Path)&"shuju.dat"
  MakePath=OldPath
  If Right(MakePath,1)<>"\" Then MakePath=MakePath+"\"
End Function

 

◆说每一个程序分支的情况
'-----------If-Else-End if结构---------
If Rs.EOF Then
  '没有查到相应的用户信息,没有符合条件的用户
  Msgbox("查无此人!")
Else
  '有符合条件的用户记录
  '以下语句略
End If

四、要用结构化

  也许有人要问:现在的语言都是结构化的,我想不用还难呢,你这不是白说了?
在这里我要说的结构化,是两个方面的内容:一是同一级语句尽量对齐,不同级语句要有缩进;二是尽量多用子程序(即过程)。

  比如下面的程序段(这次以ASP为例)

'--------用户登录程序---------
If Resquest.form("UserName")="" then
  '用户直接输入地址进入,必须将其引导到Login.asp
  Response.Redirect "login.asp"
Else
  '从表单进入
  If Resquest.form("TeacherPass")="1234567" then
    '教师身份
    Application("Teacher")=Application("Teacher")+1
    Session("TeacherNumber")=Application("Teacher")
    Response.Redirect "main.asp"
  Else
    '学生身份
    Application("Student")=Application("Student")+1
    Session("StudentNumber")=Application("Student")
    Response.Redirect "main.asp"
  End if
End if

  以上这个ASP程序段是我写这篇文章时随手写的,没有什么功能。从这段程序中,我们可以看出其中的缩进,给日后修改时减少了许多麻烦。

  再来看下面一个程序,下面的程序的功能是在打印机上打印两行文字:

'----------打印程序----------
Printer.CurrentX=2500
Printer.CurrentY=1000
Printer.Fontname="黑体"
Printer.FontSize=32
Printer.print "给同学们的一封信"
Printer.CurrentX=100
Printer.CurrentY=3000
Printer.Fontname="宋体"
Printer.FontSize=16
Printer.print StrNameOfStudent & "同学:你好"
Printer.Enddoc

  以上这段程序非但可读性差,语句量大,而且日后修改起来麻烦,如果改用下面这种方法就好多了:

'----------打印程序例二----------
PrintText(2500,1000,"黑体",32,"给同学们的一封信")
PrintText(100,3000,"宋体",16,StrNameOfStudent & "同学:你好")
Printer.Enddoc

Private Sub PrintText(Byval PTX as Singel,Byval PTY as Singel,Byval PTFN as String,Byval PTFS as Singel,Byval PTStr As String)
  '打印内容子过程
  'PTX,PTY是打印位置
  'PTFN是字体,PTFS是字号
  'PTStr是打印内容
  '你还可以跟据需要加入粗体、斜体等参数
  Printer.CurrentX=PTX
  Printer.CurrentY=PTY
  Printer.Fontname=PTFN
  Printer.FontSize=PTFS
  Printer.print PTStr
End Sub

 

五、不要用GOTO

  这是多年前的问题了,如今却实大多数人已经不用GOTO语句了,但是,不可否认还有些人在死守着那些老古董不肯放。用了GOTO语句的程序就像面条一样,日后是很难把它理清楚的。

  我97年开始从GW Basic向True Basic转时碰到了很大的难度,因为我已经非常习惯于GOTO语句了,但是,我一直坚持一个也不用。现在,我已经习惯了没有GOTO的程序。前两天,一位朋友把他编的程序给我看,程序本身很好,功能也很强,就是里面用了几个If...Then Goto语句,让我很受不了。都这么多年过去了,这些东西应该丢掉了。

  最近才着手学习程序设计的朋友应该不会滥用GOTO,因为现在的任何一本材料中都不介绍GOTO的使用。也许你们都没听说过还有这样的语句,这样更好了。

  不过,有一个例外:On Error Goto语句不用丢弃它。但是我不喜欢用数字做行号,我的朋友在他的程序里除了几个“Goto 100”,“Goto 200”之类的语句,还有“On Error Goto 1000”。如果用“On Error Goto KillErr”,采用字符串做行标记,日后看程序时总比看到数字舒服。万一你还没看到“On Error Goto”而先看到行号呢?用数字不就麻烦了些?

六、在应用中学习

  许多人学程序设计只是照着书本的例子做,一本书啃完了,再买一本继续,这样做永远没有主动。要想学得深一些,学一些有用的东西,可以先拿一本书学学其中的例子,大体有点会后就放开书本自己编。

  自己编的时候,不要只想着程序语言能实现的功能,而要想其它应用软件能实现的功能,甚至其它应用软件还没有实现的功能,然后想办法用程序去完成它。

  自己编的时候,要么不编,要编就编一个完整的程序。这样的话,接触到的问题会多一些。编什么呢?不用想:小时候玩过七巧板吗?玩过飞行棋吗?现在你需要一个好的通讯录吗?都可以编啊。把这些都编出来就行了。

  也许你要说,这些程序网上都有,还要我编干什么?错!网上是有,而且网上的比你即将编出来的更好。但是,我们并不是要一个程序,而是要学习。

  我现今用Visual Basic编程序时从来不翻书,碰到不会的怎么办?用F1就行了。MSDN里讲得比任何一本书都完整,当然,MSDN里并不介绍算法,并不介绍模块的组合。但那是你早该解决的问题。

【发表评论】 编程天地栏目只发表偷猫(Tomorrow)个人的作品与感想,转载时请注明《偷猫之家》,谢谢合作。

本文地址:http://com.8s8s.com/it/it7857.htm