函数是编程的模块,有时我们会调用其他人的函数或者自己编写函数进行调用,但是我们在自己设计函数时
并不能达到事半功倍的效果。
无论是面向对象编程语言还是面向过程编程语言,函数都扮演着重要的角色,函数有时在类的内部出现,有时在全局中出现,无论如何,一个函数的设计影响其代码的可维护性。
我们都会定义函数,即使在不同语言,函数定义语法都相似。
function-type function-name(function-agrs)
1.普通函数的命名
函数命名应该 “开门见山”,调用函数时只需要认识函数名称的意义便可以知晓其用途。
// C语言 #include <stdio.h> int jiayi(int shuzi) { return ++shuzi; } int main(int argc,char* argv[]){ printf("%d", jiayi(10)); return 0; }
为了实现返回一个数字加一的功能,定义了jiayi这个函数完成工作,但是再过10天,这个函数是干什么的你也需要想好一会,比如 “加亿”,“加以”,“加意”?想必你可能也会矢口否认,但是如果函数更加复杂呢?
无论怎样,一个 “见名思意” 的函数名是重要的。
#include <stdio.h> int addone(int number) { return ++number; } int main(int argc, char* argv[]) { printf("%d",addone(10)); return 0; }
相信你应该有一定的英语功底,add - “添加” ,one - “一”。
函数命名应该 “开门见山”,用英文命名能够大大提高你的效率,虽然你可能会记不得你当时命名该函数的目的,但是你可以通过网络翻译来解决你都问题。
2.类函数的命名和返回值
类和函数具有紧密的联系,函数的命名常常跟着类的命名走。
class Room{ private String RoomName; Boolean WifiState; private int PersonCount; final int PersonCountMax=4; public Room(String name,int personCount) { this.RoomName = name; this.WifiState = true; this.PersonCount = personCount; } public String getRoomName() { return RoomName; } public void setRoomName(String name){ this.RoomName = name; } public Boolean Wifi(){ return WifiState; } public Boolean Full(){ return this.PersonCount==this.PersonCountMax; } public Boolean Empty(){ return this.PersonCount==0; } }
这里面有很多可以优化的地方,比如一些Boolean类型的函数。
我们常常用has/is…作为Boolean类型函数的前缀
public Boolean hasWifi(){ return WifiState; } public Boolean isFull(){ return this.PersonCount==this.PersonCountMax; } public Boolean isEmpty(){ return this.PersonCount==0; }
优化完成,可见has表示包含,is表示条件是否成立,Wifi应该是房间类所包含的,房间人员数量的信息应该是需要判断的。
public String name() { return RoomName; } public void setname(String name){ this.RoomName = name; }
该类是Room类,我们在使用的时候应该了解到我们使用的是什么,所以名词 Room 可以省略,通过上面的介绍,我们可以知道name函数返回房间的名称,同时我们可以使用setname函数设置房间的名称。
使用函数必读要填其参数,在填写函数的时候,我们需要使用记忆或者代码提示完成工作,但有时我们不知道函数的参数应该具体怎么填,还需要翻看函数定义。
减少Boolean类型变量作为参数
待优化的含Boolean类型变量的函数
// C语言 #include <stdio.h> #include <Windows.h> #ifndef __cplusplus typedef enum bool{ true = 1, false = 0 }bool; #endif void ShowInfo(wchar_t* Text, wchar_t* Title, bool Icon) { // 如果是true-information图标,如果是false-warning图标 if (Icon == true) { MessageBox(NULL, Text, Title, MB_ICONINFORMATION); } else { MessageBox(NULL, Text, Title, MB_ICONWARNING); } } int main(int argc, char* argv[]) { ShowInfo(L"Hello,World", L"Hello,World", true); ShowInfo(L"Hello,World", L"Hello,World", false); ShowInfo(L"Hello,World", L"Hello,World", true); return 0; }
可以看到,当Icon为True时,程序弹出一个待信息图标的消息框,当Icon为False时,程序弹出一个待警告图标的消息框,但是,如果是别人调用这个函数且不能看到函数细节-不知晓Boolean类型参数的填法,那么应该如何改进呢。
使用枚举改变现状
// C语言 #include <stdio.h> #include <Windows.h> #ifndef __cplusplus typedef enum bool{ true = 1, false = 0 }bool; #endif enum Icon { INFORMATION = true, WARNING = false }; void ShowInfo(wchar_t* Text, wchar_t* Title, enum Icon Icon) { // 如果是true-information图标,如果是false-warning图标 if (Icon == true) { MessageBox(NULL, Text, Title, MB_ICONINFORMATION); } else { MessageBox(NULL, Text, Title, MB_ICONWARNING); } } int main(int argc, char* argv[]) { ShowInfo(L"Hello,World", L"Hello,World", INFORMATION); ShowInfo(L"Hello,World", L"Hello,World", WARNING); ShowInfo(L"Hello,World", L"Hello,World", INFORMATION); return 0; }
可以看到,Icon的类型变成了一个枚举类型,INFORMATION和WARNING代替了true和false,避免了这种尴尬的调用,我们限制Icon的使用规范,并且提供选择。