定义:将代码提炼到一个独立的函数里,并以这段代码的用途为这个函数命名。
提炼的时机:将意图和实现分开
对于一段代码,你需要通过阅览才能搞懂这段代码在干什么,那么就需要将这段代码提炼到一个函数中,并为其所做的事命名。不用过于担心短函数会造成函数调用,因而影响性能。短函数常常能让编译器的优化性能运转更加良好,因而短函数可以更加容易地被缓存。
1.提炼函数无局部变量
typedef struct Person
{
string name;
int id;
}person;
void printStaff(person staff)
{
cout<<"************"<<endl;
cout<<"***STAFF****"<<endl;
cout<<"************"<<endl;
string Today="Monday";
cout<<Today<<endl;
cout<<"name:"<<staff.name<<endl;
cout<<"id:"<<staff.id<<endl;
}
对于printStaff函数来说,里面的内容可以单独提炼出来
void printStaff(person staff)
{
printBanner();
printDay();
cout<<"name:"<<staff.name<<endl;
cout<<"id:"<<staff.id<<endl;
}
void printBanner()
{
cout<<"************"<<endl;
cout<<"***STAFF****"<<endl;
cout<<"************"<<endl;
}
void printDay()
{
string Today="Monday";
cout<<Today<<endl;
}
2、有局部变量
被提炼代码只是读取这些变量的值,并不修改他们,这种情况可以简单地将他们当作参数传给目标函数。
void printStaff(person staff)
{
printBanner();
printDay();
printData(staff);
}
void printBanner()
{
cout<<"************"<<endl;
cout<<"***STAFF****"<<endl;
cout<<"************"<<endl;
}
void printDay()
{
string Today="Monday";
cout<<Today<<endl;
}
void printData(person staff)
{
cout<<"name:"<<staff.name<<endl;
cout<<"id:"<<staff.id<<endl;
}
若对局部变量再赋值,问题则变的复杂了
void printStaff(person staff)
{
int num=0;
printBanner();
printDay();
for(int i=0;i<100;i++)
num+=i;
printData(staff,num);
}
void printBanner()
{
cout<<"************"<<endl;
cout<<"***STAFF****"<<endl;
cout<<"************"<<endl;
}
void printDay()
{
string Today="Monday";
cout<<Today<<endl;
}
void printData(person staff,int num)
{
cout<<"name:"<<staff.name<<endl;
cout<<"id:"<<staff.id<<endl;
cout<<"num:"<<num<<endl;
}
将该局部变量的声明进行移到被提炼的代码段中
void printStaff(person staff)
{
printBanner();
printDay();
int num=0;
for(int i=0;i<100;i++)
num+=i;
printData(staff,num);
}
然后把想要提炼的代码复制到目标函数中
void printStaff(person staff)
{
printBanner();
printDay();
int num=calculateNum();
printData(staff,num);
}
int calculateNum()
{
int num=0;
for(int i=0;i<100;i++)
num+=i;
return num;
}
然后将函数中的变量名改为更易理解的名称
int calculateNum()
{
int result=0;
for(int i=0;i<100;i++)
result+=i;
return result;
}
如果需要提炼函数返回多个值,可以构造一个对象进行返回。