改善程序中的代码设计—函数篇(C语言,Java描述)
函数是编程的模块,有时我们会调用其他人的函数或者自己编写函数进行调用,但是我们在自己设计函数时
并不能达到事半功倍的效果。
追溯
无论是面向对象编程语言还是面向过程编程语言,函数都扮演着重要的角色,函数有时在类的内部出现,有时在全局中出现,无论如何,一个函数的设计影响其代码的可维护性。
函数的声明和返回值
我们都会定义函数,即使在不同语言,函数定义语法都相似。
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类型函数的前缀
优化三个Boolean类型函数
public Boolean hasWifi(){
return WifiState;
}
public Boolean isFull(){
return this.PersonCount==this.PersonCountMax;
}
public Boolean isEmpty(){
return this.PersonCount==0;
}
优化完成,可见has表示包含,is表示条件是否成立,Wifi应该是房间类所包含的,房间人员数量的信息应该是需要判断的。
优化get和set为目的的函数
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的使用规范,并且提供选择。