《程序员应该掌握的实用编程技能》--转摘
时间:2011-04-20 来源:津东方
《程序员应该掌握的实用编程技能》
偶尔上一上IT网站,发现求新、求奇、求专、求偏的东西甚多!可谓大千世界无所不有!但是面对中国软件的现状,一方面我们发现有很多很多的实用软件正在编制过程之中,很多人都在加班加点,忙得不亦乐乎;还有很多很多的实用软件没有人开发、等待有人开发。
另一方面,我们也发现存在大量闲置的程序员,不知道自己要开发什么!不知道要掌握什么编程技能,在网上学这学那,花了大量的时间,除了学了还是学了,就是没有做,美好时光就这样白白流失,令人心痛。很多程序员并不知道这些实用软件目前最缺乏的不是新的、奇的、专的、偏的东西,而是实用技术,是实用技术运用的质量和技巧。
由于编程是“条条大路通罗马”,程序员有很大的自主性,程序员可以采用任意方法实现功能,导致编程水平的高低不平。我认为程序员应该掌握的实用编程技能,掌握这些技能就要掌握这些技能的本质,吃透这些本质,才能归纳其应用范围和注意点:而那些只会写程序不知道为什么这样写的程序员则可能不能用最好的语句、最简的语句、最恰当的语句来编写程序,更不用说采用更高的技巧去组合这些语句,以达到高质量的程序。
长期的编程实践中我认为以下的编程技能是基础,是必须要掌握的,其他更高层次的编程技能,则要用到才能学到。
1、赋值
赋值是编程中不可缺少的基本语句,而且是最基本的语句。掌握这个语句,看起来很简单,但是越是简单东西越是要关注。
最简单的赋值是指将一个值赋给一个变量。例如x=1。
赋值的本质是事物间的转移。而且赋值本身就是一个中间过程,反映到代码级意义就是将内存中的值或内存指针赋给一个内存指针。
赋值有两个方面:一个是:取什么值或变量或对象,一个是:赋到什么变量或对象。程序员在编程的时候,往往在两个方面都有困惑我取什么值、取什么变量、取什么对象,怎么找到这些值、这些变量、这些对象,我取到后,我赋给谁。这都是我们常常遇到的。
在我们赋值的时候我们要注意:
1)等式两面的数据类型要相等。
2)赋值语句相比于其他语句是比较快的。这点在注重效率方面要注意的。
赋值语句比函数调用要快,比循环语句要快。
例如:一个巨大循环中编写了一个循环语句:
for(i=0;i<3;i++)
A[i]=i+1;
还不如将其变成赋值语句:
A[0]=1;
A[1]=2;
A[2]=3;
3) 当有多条赋值语句的时候,赋值处理可能会有先后次序。
4) 赋值语句多了(20条以上,阅读起来非常死板,没有技术含量),可能要考虑到循环赋值。
2、条件处理
条件处理是仅次于赋值处理编程内容,程序的变化基本上是由于条件处理引起的。不同的条件成立将进行不同的处理。
所以条件处理的本质是事物变化的变化带来相应的变化。
在编程实践中,我们往往困惑于:什么样的条件?做什么事?而且还要考虑什么时候开始考虑条件。
赋值处理是个顺序处理。而条件则增加赋值处理的可能性,当条件满足时,A赋值就可能执行了,当条件不满足时,B赋值就可能执行了。
在条件处理的时候,我们要注意:
1) 我们如何选择我的条件?即我们的条件表达式。
其实这个问题很是复杂。
一般来说,我们会把最主要的条件作为第一个条件。但是,我们也会把满足条件的最大结果集的条件作为第一个条件。这样最后的条件,往往是不能满足的,或是满足后,也不需要太多处理的。
从条件表达式的设计中,我们可以单个变量来表示条件,也可以多个变量运算来表示条件,单个变量中,可以用数值型、字符型、逻辑型来表示。其中,也是很有讲究的。
例如。flag==1; flag=='1’;flag==True
都可以让程序条件转移,但是,如何选择则要考虑的很多因素。
2) 我们不要遗漏例外情况
例如,我们考虑i=1的时候,i=2的时候,就是没有考虑到i<1的时候和i>2的时候。
遗漏条件,往往说明我们的程序员缺少全局观念、缺少例外观念。很多程序写的不好的原因其中就有这个问题。
3) 条件间不能有交叉
例如:
If(i>1 ; i<=5)
x=1;
If(i>4 ; i<10)
x=2;
当i=5的时候,
x先等于了1,后等于了2。这个必须要避免的。很多程序出错,都和此类问题有关。
4) 要特别注意条件处理的覆盖问题。
例如:if(flag==1)
X=1;
If(flag==2)
X=2;
X=5;
无论什么条件,x始终等于5。
5) 要知道if和case的各自适应情况。懂得什么时候用if,什么时候用case。
3、 循环
循环是重复操作的简单表达,只要有重复操作,就可以采用循环语句。循环的本质是重复。
在循环处理的时候,我们要注意:
1) 循环处理是影响效率的重要方面
当程序出现效率问题的时候,要首先在循环语句中进行查找。
2) 循环处理的前提条件
一般来说,重复执行三次以上可以用循环语句。低于三次的,最好不要用循环语句。
例如:
For(i=0;i<3;i++)
B[i]=i;
不如写成:
B[0]=0;
B[1]=1;
B[2]=2;
当然从可读性和可扩展性方面,也可以用循环语句。
3)不同的循环条件采用不同循环语句
程序员要懂得什么情况下用for,什么情况下用do while,什么时候用foreach
尽管用以上语句都能达到相同目的,但是程序员还是要知道其的应用范围,使得应有最恰当。
4)充分利用循环中的,中断循环,继续循环,函数返回,程序退出等语句,使得循环更加丰富多彩。
4、字符串操作
字符串是信息的重要的表现形式。字符串操作是编程中最常用的操作之一。字符串操作的本质是信息的加工。由于许多信息没有标准,
程序员对其操作以符合自己的标准要求。
例如:有的字符串包含了多种信息,那就必须对字符串进行拆分;有的字符串缺失信息,那就要对字符串进行合并。
对字符串操作主要注意以下几个方面:
1)空串处理
由于原始的字符串由于操作原因和系统原因,字符串的头尾会出现若干个空格,那么在字符串处理之前,必须要将空格除去。
2)乱码处理
有些字符串中存在各种乱码,导致字符串显示出现看不懂的字符。这些情况主要是字符串出现了控制字符的代码,汉字中出现字符不匹配。
3)分隔符处理
分隔符往往会出现一条记录之中或参数之中,起到分隔信息之用,通过分隔符来把信息取出来。实际当中会出现信息内容本身含有分隔符, 或乱码产生中产生分隔符,这些情况,就需要改变分隔符或进行特殊的处理。
4)字符与其他数据类型的转变
在实际编程当中,我们运算的对象的一致性,往往要进行字符串转向其他数据类型的操作,或其他数据类型转向为字符串的操作。
一般来说,其他数据类型转为字符串比较容易,而字符串转换成其他数据类型,就要考虑转换前的字符串格式是否符合要求。
例如:将“1,000,000”转换成数值,则转换前要将“,”去掉。
5)子串处理
子串处理在查询中经常使用。子串匹配有前、中、后三种。子串匹配往往要花费的时间较多,子串越短、查询串越长则消耗的时间越长。
在建立索引字段中进行查询时,只有前匹配才能利用索引,到达快速查询之目的,但是在中后匹配则索引无效,需要每个记录逐一匹配,时间最长。程序员要了解以上内容,因势利导,才能正确进行子串处理,以达到快速查询目的。
5、算术运算
算术运算在编程之中是仅次于字符串操作内容。其中加1操作很多,用途也很广。一般应用软件中加减乘除最为常用。算术运算本质是 数值类信息的加工。算术运算一方面是实际应用的算法要求,另一方面则是编程算法的需要。
例如,应用系统中要计算长方形的面积。则会编写S=L*D语句。
假如要编写计算100个长方形面积,则需要一个指针,通过指针+1进行下一个长方形面积的计算。而指针加1,这个运算则是算法的需要了。
算术运算用于应用中公式计算相对简单。但是,算术运算用于算法的技巧和实现就不那么简单了,其注意点是:定义一些中间变量,通过中间变量的加减,使之能变成循环操作。
6、数组
数组是存放数据的一个集合,数组操作也是编程常常遇到的:数组的本质是事物的集合。但是要注意这个集合对象个数是有限的,而其数组是存放在内存之中的,因此数组操作很快。数组的使用很大一部分是利用循环语句。数组和循环的结合使得程序的质量有很大的提高。
对数组我们应该注意:
1) 数组的个数相关问题
2) 多维数组的表示方法,以及存放形式
3) 数组越界问题
4) 空数组
5) 数组在循环语句中的运用。
7、 调用
调用在编程中是用的最多的语句之一,一般有系统调用、自编函数调用等等。调用的本质是逻辑模块的处理。这表明调用是一个模块, 是一个功能语句的集合,同时,这个功能是一个逻辑划分,一般不可能将一个有联系的语句分成两个函数来调用。
关于调用我们要注意以下几点:
1) 如何进行自编函数的编写
2) 如何调用自编函数
3) 如何引用系统函数
4) 如何调用系统函数
5) 调用时要注意函数的参数类型和参数次序与定义相配
6) 调用时要注意函数的返回值:无值、有值、返回值的数据类型
7) 要特别注意自编函数中的指针参数的运用,不要指针溢出,导致函数出错。
8) 掌握如何将函数变为参数的方法,使得函数更加灵活。
9) 要了解松耦合函数的调用方法,尤其是掌握webservice的调用和动态调用。
8、 文件操作
文件操作在过去运用十分频繁,现在很多信息都存放到数据库之中了,文件操作的大部分工作都被数据库给取代了。但是,有关数据 的后台处理,参数处理,输出结果等方面还是会用到文件的。文件操作的本质是对以文件形式存放的数据进行的操作。文件即可以作 为操作的数据源、也可以成为数据处理的结果。
关于文件操作我们要注意以下几点:
1) 要知道文件的两个基本类型:二进制和ASCII。两种类型打开的系统函数是不一样的。两种处理体系是不一样的!
2) 要知道文件打开方式种类和应用范围:读、写、只读、只写等
3) 要知道文件操作基本功能:打开、关闭、读、写、偏移指针(定位)
4) 要知道流文件操作常用函数。
5) 要特别注意文件操作失败的返回值:打开失败!写失败(文件只读、权限不够、空间满等)
6) 了解大文件(大于4G)的处理方法
7) 由于xls文件的广泛应用,我们要特别要掌握相关xls的文件处理的读、写等功能的调用方法。
8) 掌握FTP的相关功能,并能引用和调用FTP。
9)如何解决大文件在传输没有结束时,就开始读此文件或重新传输的产生的问题。
9、逻辑运算
逻辑运算一般用于条件表达式之间与或非等逻辑关系,程序中使用相对比较少,但是在应用的算法中则常常出现,尤其是在查询条件中, 与操作用得最为广泛。逻辑运算的本质是事物之间的逻辑关系。逻辑运算仅仅是某种处理的条件和前提。其一般不能单独存在。
关于逻辑操作我们一般要注意:
1)当出现多个条件时候,最好将条件组合成2大条件,使得程序逻辑性更强,更加可读。
2)要了解当与操作运算时,当只要有一个条件为假的时候,整个表达式就得到假的结果。而不会把所有条件都运算出来!
例如:表达式为a>5 ,b>6, c>7, d>8
如果a=1,则表达式的结果为假,并且程序不会再去运算b>6,c>7,d>8了。
如果,a=6,b=7,c=8,则程序一定要去运算d>8的。掌握整个道理我们可以把最容易为假的条件放在表达式最前面,可以提高程序的效率。
同理,当或操作运算时,当只要有一个条件为真的时候,整个表达式就为真,而不会所有条件都运算出来。
3)学会利用逻辑运算符作为参数,动态生成查询中条件语句。
4)学会通过循环语句语句自动形成与条件的表达式。
例如,我们查找以姓名和性别为条件同时成立的结果。
一般我们可以写成name=’王华’ and sex=’1’。
我们可以将name,sex放fld_name数组之中,将王华和1放在content数组之中。
通过对数组操作自动形成这个条件语句:
String exp=””;
For(int i=0;i<2;i++)
{
if(i==0)
exp=fld_name[i]+”=’”+content[i]+”’”;
else
exp=exp+”&&”+ fld_name[i]+”=’”+content[i]+”’”;
}
当我们的查询字段很多的时候,我们的程序就会很简洁很通用的。
10、数据库访问
数据库是目前是应用软件中使用最多的技术,没有数据库的软件几乎不可想象,大型软件更是如此。数据库的本质是事物的量化集合以及相互关系。程序员不但要掌握数据库本身的功能,如数据库建立,表建立、索引建立、数据操纵语言的insert、update、select使用方法等最最基本要领,而且要掌握通过程序的方法访问数据库。
对访问数据库我们应该注意:
1)我们如何访问数据库,访问数据库方式是什么,访问数据库需要什么参数。
2)如何提交数据库操作命令、如何执行存储过程。
3)如何获取数据库命令的返回值,了解返回值的意义。
4)如何获取数据库命令的结果集,以及结果集存放方式,结果集的操作方法。
5)学会用表名、字段名、字段个数、记录个数进行循环操作。
6)数据库操作出错处理
7)数据集和数据库的更新同步
8)数据库事务处理。
9)海量数据的处理方法(如何利用结果集与数据库之间的关系提高数据处理性能,其他处理方法不在此讨论)
至于数据库本身的一些技能就不在此谈论了。
11、控件
控件大都用在人机交互的界面之中,当然还有很多不显示的功能控件。控件使用之广泛、之频繁是程序员遇到最多的对象。
通常用的最多的是标签、文本框、命令钮、列表框、下拉框、表格等,人们通过拖拉拽进行操作。控件的本质是人机对话的媒介。当然还有可复用的对象使用的功能。
对控件我们一般要注意以下几点:
1)要特别注意每个控件的特点和使用范围,学会准确使用控件。例如,文本框可以显示字符串,标签也可以显示字符串。
但是,我们一般用标签控件显示常量而且是只读,用文本框显示变量而且可编辑。注意到这些区别之后,我们就可以正
确选择我们的控件了。如果我们用文本框去显现一个标题的话,那我们就可能不恰当地使用了控件。
2)我们要除了掌握拖拉拽给控件一个定位和大小之后,我们还要掌握对控件的属性进行设置,以及控件的事件进行编程。
特别要了解每个事件触发的时机。
3)要学会控件的数据绑定,尤其是和数据库的绑定和刷新机理。
4)要学会如何对控件输入值进行合法性检查,确保输入数据的有效性。
5)要学会对控件的只读、可编辑、显示/不显示的设置。
6)要学会对系统控件的复用,尤其是下拉框控件。一般的下拉框很难满足显示汉字返回代码的功能,尤其是在显示框可以输
入代码和汉字可以将满足条件的结果显示出来,供用户选择。例如,可以设计一个行政区划的下拉框,在框中输入110000或
北京则返回110000。而普通的下拉框只能在3000多个行政区划中,按照行政区划代码次序来选择了。
7)程序员可以尝试自己设计控件。
8)掌握对于表格控件的数据绑定方法。尤其是大数据结果集的处理方法。
9)掌握加载各种控件方法。
12、类
类在编程之中广泛运用,一些语言和程序都是类的表现形式。对于程序员来说,一方面我们要学习面向对象的编程思想,另一方我们要学会定义类和使用类。类的本质是面向对象的抽象形式。有关类的内容很多例如封装、继承、多态等特性,但是程序员不要对类的丰富的功能所迷惑,要学会最基本的东西:一个是定义、编写、使用自己的类,另一个是学会引用使用系统的类和其他的类。
对类我们要注意:
1)定义一个类,最主要的是定义类的属性和事件
2)对类的属性赋值
3)事件的编程
4)类的继承
5)类的引用
6)类的调用
7)特别注意类中函数的入口参数和返回值的设计。
13、 参数化
很多人都在谈参数化,认为参数化可以使程序具有更多的灵活性,扩展性。但是很少人知道什么是参数化,参数化的边界是什么?
参数实现的方法是什么?
参数化本质是指解决事物变化的方法。其重要的内容是:
第一, 如何将事物抽象为参数;
第二,参数如何存放;
第三,程序对参数的处理;
例如:打开一个数据库,为了适应数据库的变化,我们就要把数据库的用户名和口令抽象成参数。
我们可以把用户名和口令放在config文件之中,在程序中,当打开数据库时,我们要从config文件中获取用户名和口令形成数据库连接串。
通过这个连接串打开数据库。
当数据库的用户名和密码发生变化时,我们只要改变config文件中用户名和密码即可。
以上仅仅是参数化最简单的例子,其实参数化内容非常之多,关键要看程序员的视野和水平。
一般的程序员仅仅停留在函数参数中的参数化,其实,函数、数据结构、功能模块、软件构架都能参数化的,而且参数存放形式也多种多样,参数处理更是各人各异。有些参数还要考虑安全性。
简单的参数化是基础技能,但是复杂的参数化则是编程中的高级技能了。
很多复杂的算法和架构大都是由以上基本技能组合而成的,程序员将基础打好后,可以站这个基础上去构架更复杂的算法和写出更优秀的程序。
编程的基本技能内容很多,每个部分都可以谈出许多趣事和范例,每个部分都能独立成章节。但是,在这里我只能抛砖引玉,只是给程序员理一个思路和方法。其目的就是希望程序员重视基础技能,重视实用技能、要把大量时间用在这些技能上,把基础打好;就是希望程序员能改变只知道编程序,不问也不知道为何这样编程的现状。
我希望程序员面对算法时,头脑首先想到的是一组基本技能,然后针对算法具体实现选择最合适基本技能,然后再去用这个技能去编程。这种方法可以提高程序员对理论重视程度,养成以理论指导编程的思路,改变自发地编程为自觉编程,这样我们程序员的编程水平才会有本质的提高。