讨论:如何写函数

cloudred 2002-04-09 05:30:52
发现在编程过程中速度越来越慢了,甚至连函数怎么写都
有些糊涂了。有时为了写一个函数常常考虑两三个小时都不知
怎么下手恰当了。
考虑的东西多了,再不象以前想怎么写就怎么写了。

大家知道,一个好的函数要求有弱藕合度和高内聚性。

举例说吧,比如写一次有多种类型的输出的函数:

可以采用以下方法:
1、其中一个做为函数的输出,其他的变量都定义为公有
变量,在函数中改变。
2、将要获得的变量也做为输入,在函数中改变。
3、将要输出的定义成一个结构体,定义的函数返回这个结构体。

选择多了,有时候真不知道该如何选择了。当然,我现在偏向于
第3种做法。

希望大家谈谈自己编写函数的一些做法,或者将自以为满意
的有一定风格的函数(主要是风格)帖出,可以不必局限于上面我谈
的。
...全文
28 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
勉励前行 2002-04-13
  • 打赏
  • 举报
回复
VCL類沒有拷贝构造函数,一調用就錯。
ken_henderson 2002-04-11
  • 打赏
  • 举报
回复
我那样写是正确的,那将调用拷贝构造函数。另外,写事件处理函数可以用Command模式
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Command.ExecAction1(...);
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Command.ExecAction2(...);
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
Command.ExecAction3(...);
}

hchile 2002-04-09
  • 打赏
  • 举报
回复
我写函数的方式或原则是:为实现一个单一的功能;为实现一个重复用到的功能;
有些时候是为了使一个较长的函数结构清晰,将它分成多个函数而每一个函数只实现其中的一小部分功能;函数之间尽量少传递参数,现在有了类这个结构则可以将一部分的全局变量转变为类的私有变量。
不知我这种想法对否,仅作标靶用途。
sinmin 2002-04-09
  • 打赏
  • 举报
回复
如果一个函数有多个返回值, 这种情况我一般是这样做:
将大部分返回值作为引用或者指针从入口参数中传入,然后在函数在更改这些值, 将一个返回值从函数的返回值传回, 这样做的好处是不用定义结构体,而且能够根据函数的返回值判断函数的执行情况如成功还是失败,
如一个函数根据个人的姓名,从数据库的一个个人信息表中查找一条记录,要求返回其年龄和身高:
int GetPersonInfo(AnsiString strName, int *iAge, int &iHeight)
{
try{
*iAge =...
*iHeight =..
return 0;
}catch{
return -1;
}
}

//调用方法:
if(GetPersonInfo(strName,&iAge, &iHeight)>=0){
// OK
}else{
ShowMessage("Fial");
//....
}
hchile 2002-04-09
  • 打赏
  • 举报
回复
Kingcaiyao兄:
你哪四个按钮的函数可以指向同一个按钮函数,不必分成五个来写
勉励前行 2002-04-09
  • 打赏
  • 举报
回复
樓上的是錯誤的,通不過編譯。
GetADORecordSet返回的TADODataSet *可以用delete 釋放主,也可以不管,因為TADODataSet 是一個VCL類,會自己處理這個問題。
我覺得
GetADORecordSet這樣寫有問題,
生成了一個新的對象:TADODataSet,這限制了該函數的重用,
不如:
TADODataSet* GetADORecordSet(TADOConnection* ADOConnection1)
{TADODataSet* tmpADODataSet;
tmpADODataSet=new TADODataSet(NULL);
tmpADODataSet->Connection=ADOConnection1;
return tmpADODataSet ;
}
bool OpenADORecordSet(TCustomADODataSet*ADODataSet,AnsiString sSql)
{try {
ADODataSet->Close();
ADODataSet->CommandText = sSql ;
ADODataSet->Open();
}
catch(...)
{ShowMessage("Open Error");
return false ;
}
return true ;
}
cloudred 2002-04-09
  • 打赏
  • 举报
回复
呵,我跑回来想说的话楼上给说了。
调用:
TADODataSet *temp;
temp=new TADODataSet(NULL);

temp = GetADORecordSet(AConnectionl, sSql);
......

delete temp;
ken_henderson 2002-04-09
  • 打赏
  • 举报
回复
这样写的话tmpADODataSet需要delete,可以改为
TADODataSet GetADORecordSet(TADOConnection* ADOConnection1,AnsiString sSql)
{
TADODataSet tmpADODataSet;

tmpADODataSet。Connection=ADOConnection1;
tmpADODataSet。CommandText=sSql;
tmpADODataSet。Open();
return tmpADODataSet;
}

CCLIS 2002-04-09
  • 打赏
  • 举报
回复
写函数,尽量不要写很长的函数,保证一个函数的长度不多于66行(老是打印纸刚好一页),如果真要实现很多功能,何不再将其中的功能写成函数?

函数要实现的功能简单了,也就好写了。

对于你上面的这个问题,可以在外部删除tmpADODataSet,例如:

TADODataSet *temp;

temp = GetADORecordSet(AConnectionl, sSql);
......

delete temp;
cloudred 2002-04-09
  • 打赏
  • 举报
回复
Kingcaiyao兄:

要是这样,MyButtonClick函数也太长了,好像和一些编码规范中的函数尽量控制在一定行的要求相背!
但又说回来了,你那函数的结构应该是比较清晰的!
cloudred 2002-04-09
  • 打赏
  • 举报
回复
大家看看这个函数:

TADODataSet* GetADORecordSet(TADOConnection* ADOConnection1,AnsiString sSql)
{
TADODataSet* tmpADODataSet;
tmpADODataSet=new TADODataSet(NULL);
tmpADODataSet->Connection=ADOConnection1;
tmpADODataSet->CommandText=sSql;
tmpADODataSet->Open();
return tmpADODataSet;
}

问题:这样的函数有没问题?tmpADODataSet需不需要delete?若需要,如何delete?
kingcaiyao 2002-04-09
  • 打赏
  • 举报
回复
尽量使程序简洁,模块化,可扩展化。比如Form上有4个按钮,我通常会将这个四个按的单击事件放在一个模块来进行处理。即是说:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MyButtonClick(Sender);
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
MyButtonClick(Sender);
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
MyButtonClick(Sender);
}

void __fastcall TForm1::Button4Click(TObject *Sender)
{
MyButtonClick(Sender);
}

void __fastcall TForm1::MyButtonClick(TObject *Sender)
{
if(Sender==Button1)
{
.......
}
.......

}
windindance 2002-04-09
  • 打赏
  • 举报
回复
反正就是一个原则
不写重复代码
mikesome 2002-04-09
  • 打赏
  • 举报
回复
设计软件想想面向对象编程
设计函数想想结构化编程
一定要练,练头脑,多写,写程序,多学,上网看看别人的文档
多背,背一些经典算法

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧