《Visual C# 最佳实践》第四章 函数 (四):使用函数注意事项
时间:2011-01-22 来源:邹俊才
4.4使用函数注意事项
函数是使用C#语言编写程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的。本节重点论述函数的设计和实现的一些规则,希望对大家有所帮助。
4.4.1函数名的设计
我们都知道,不论在什么编程设计语言里函数都是一个非常重要的概念。对与大多数初学者来说,函数名设计的不充分,会导致在后来的函数调用中,尤其是项目规模越来越大的时候,都分不清楚各个函数的作用和差别。对函数的调用和操作带来不必要的麻烦。充分理解函数名的作用在程序设计中的作用也显得由为重要。
鉴于大多数名称都是通过连接若干单词构造的,请使用大小写混合的格式以简化它们的阅读。下面先向大家介绍常用的几种大小方式:
1、匈牙利命名法:由微软的一位匈牙利程序员提出,在Windows编程中使用非常普遍。匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域、类型等。例如,int_Age定义了一个表示年龄的变量。目前这种方法在C#语言中很少使用了,因为使用Visual Studio开发工具已经相当方便,可以很方便知道变量的作用域或者类型等相关信息。
2、Camel命名法:中文翻译为骆驼式命名法,原因是采用该命名法的名称看起来就像骆驼的驼峰一样高低起伏。书写规则是除了第一个单词外每个单词的第一个字母都是大写的。Camel命名法有两种形式:混合使用大小写字母和单词之间加下划线。
例如:userId或者user_Id都属于Camel命名法。
3、Pascal命名法:与Camel命名法类似,不过Pascal命名法的首字母都为大写字母。
例如:UserId
现在我们已经熟悉了上面这3中常用的命名方式,在设计函数的时候,我们一般使用Pascal命名法来命名函数名称。这是一种书写规范,并不会对程序性能造成什么影响,只是大家都使用同样一种风格书写对于代码的阅读带来很大的方便。例如:Console.WriteLine()。WriteLine方法使用了Pascal命名方式,每个单词的首字母(W和L)都为大写字母。
我们都知道命名是最有影响力的帮助。除了大小写外,方法的命名,一般将其命名为动宾短语,表示“做什么”的意思。
例如:
public class File
{
public void CreateFile(string filePath)
{…}
public void GetPath(string path)
{…}
}
CreateFile方法使用Create动词作为开始,然后使用File作为宾语。千万不要写成了FileCreate()。
作者心得:
一个方法如果是用来判断使用的,其返回值一般是true或者false。我们可以在方法名中包含Is,这意味着Yes/No或True/False值。例如IsExists。
4.4.2函数参数的设计
参数是函数的重要组成部分,本节将重点介绍函数参数的设计问题。虽然看上去,参数只是用来传递数值,工作不是太复杂,但是参数设计欠佳往往会给函数调用者带来很多不便,随着项目规模越来越大,开发难度和复杂度都会大大的增加,函数设计问题就会越来越明显。
1、 参数命名
首先,我们来说说参数的命名,对于函数来说,参数就像是一个局部变量,因为它遵循局部变量的所有法则。在命名时,参数使用camel方式的大小写,并且使用具有描述性的,有明确意义的名称。
例如:
public void GetMessageById(int messageId)
{……}
清晰的参数命名,可以节省大量查阅资料的时间。在使用C#开发代码时,可以使用Visual Studio编辑器的智能提示功能,自动提示参数的类型与名称,非常的方便,调用者只要看着参数列表就可以正确的使用这个函数了。
2、 不要使用保留项
我们在设计类库函数的时候,都会在能够预见到改变的函数参数中添加保留项。这种做法在C++语言中非常常见。比如新版本的函数一但需要增加新的参数就不得不另外命名为GetMessageEx或者GetMessage2之类的名称。但是,自从C#语言有了重载函数功能后,我们可以完全放弃这种做法,新版本的函数依然可以继续使用原来的函数名称而不需要改变。
3、参数的顺序
参数的顺序并不会造成程序运行时的实际差别,但总的说来,总是习惯于将核心数据放在前面,然后是相关的设置参数、选项、功能开关等,并将相关的参数靠在一起,尽可能地符合人的阅读和思维习惯。
4、重载函数的参数一致
从语法上来说,参数差异是函数各个重载之间的最本质的区别。然而,事实上参数在各个重载之间的差异往往很小,因此保持其一致性是非常重要的。重载函数的参数一致性主要体现在两个方面:名称的一致性和顺序的一致性。
就是说,如果同一个参数在多个重载版本中都存在,那么其出现在每个重载中的参数名称都应当是完全一致的。在名称一致性的基础上,函数不同重载之间,同一个参数在参数列表的相对位置应该不变。
例如:
public static FileStream File.Create(string path);
public static FileStream File.Create(string path, int bufferSize);
public static FileStream File.Create(string path,int bufferSize,FileOptions options);
可以看到,不同的重载只应在真正有所区别的参数上出现形式上的变化,如果两个参数表示的是同样的含义,那么就精确地使用相同的名称和相同的顺序。