改善程序中的代码设计---函数篇(C语言,Java描述)

改善程序中的代码设计—函数篇(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的类型变成了一个枚举类型,INFORMATIONWARNING代替了truefalse,避免了这种尴尬的调用,我们限制Icon的使用规范,并且提供选择。

上一篇:2.Java变量


下一篇:键盘键码Key Code