函数参数设计 OR 面向对象的接口设计 的问题

draculamx 2009-03-11 03:58:46
我经常在设计函数,或者类的成员函数时,在函数参数上碰到问题,要怎么设计好呢??

class CDXFont
{
....
void Draw3DFont(unsigned int iNum,RECT* rctDraw,float fZoomX,float fZoomY,float fZoomZ,float fRotateX,float fRotateY,float fRotateZ);
....
};


这个函数的参数个数太多了。。。
于是我想了个方法,换成这样:

struct stuRotateZoom
{
float RotateX;
float RotateY;
float RotateZ;
float ZoomX;
float ZoomY;
float ZoomZ;
};

class CDXFont
{
....
void Draw3DFont(unsigned int iNum,RECT* rctDraw,stuRotateZoom *RotateZoom);
....
};


OK,可是这样的话,需要引入一个新的 struct...而且,参数意义不是很清晰
于是,我又换成这样:

class CDXFont
{
....
void Draw3DFont(unsigned int iNum,RECT* rctDraw,D3DXMATRIX* matRotate,D3DXMATRIX* matZoom);
....
};


那么到底应该怎么设计呢??选谁??或者还有更好的方法?
大家有这方面的资料可以介绍下不??
...全文
174 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yutaooo 2009-03-13
  • 打赏
  • 举报
回复

感觉上最后一个好点,问题在于结构 D3DXMATRIX,D3DXMATRIX 只会在这个函数接口上用了吗? 是不是应该把眼界拉高一些,考察这两个结构体定义是否也会被复用。最终还是要做平衡的。如果只在这个函数接口中用,那我多数不用多引入两个结构定义。如果能在程序的多处使用,那显然不错的设计方案。
diannaomingong 2009-03-12
  • 打赏
  • 举报
回复
还是效仿一些现成的东西吧,比如很多GUI就是n个setXX函数
先默认设定一些值,如果不修改这些值setXX,那么就用XX为默认值的画
如果要设,那就挨个设


要尽量简化,则把可能经常出现的几种取值搭配固定写一块,弄成style
setABC(int style)
{
..
a=indexOfStyles[style].a
b=indexOfStyles[style].b
c=indexOfStyles[style].c
..
}
draculamx 2009-03-11
  • 打赏
  • 举报
回复
我刚回家的时候,坐在公汽上一直都在想,可能需要增加几个类,才能简化这个函数的参数。。。。
  • 打赏
  • 举报
回复
你的函数需要8个参数...汗,你就不能稍微多封装几次,或者把这些参数封成一个类算了.
draculamx 2009-03-11
  • 打赏
  • 举报
回复
diannaomingong 兄弟啊。。。。你的 draw3DFont 函数倒是简化到一个参数都没有了
但是,你的 SetA 和 SetB 这两个函数,所需要的参数不是一样多。。。。。
而且我写的是一个小型渲染库。。。不知道要画多少东西呢。。。。不抽象绝对不行的。。。
diannaomingong 2009-03-11
  • 打赏
  • 举报
回复
//set A,B... default Value
..

// while draw..

CDXFont.setA...
CDXFont.setB...

...
CDXFont.draw3DFont..

/*
我最近写个画东西的函数也碰到参数巨多的问题,老大还老要我调整
后来我想了想,一共反正就画两个东西,没必要都写抽象
最后我写了两个具体的绘图函数搞定了 -_-!
*/

draculamx 2009-03-11
  • 打赏
  • 举报
回复
“其次是:你认为调用你的函数的人,愿意有8个局部变量么。”
taodm兄弟,又见面了。。。
先握个手,你说到我心坎儿里去了。。。
因为,那个调用这个函数的人,就是我自己。。。。。。。。。。

我开始的时候,函数定义的就是第一种。。。有8个参数。。。
写这个类的时候,我还不觉得,但是,当我自己在主函数里调用这个函数的时候,我当时就懵了。。。。。

所以啊,我才上来发帖,找寻解决之道。。

心有灵犀啊。。。。。。。
taodm 2009-03-11
  • 打赏
  • 举报
回复
多一个struct或者少一个struct本身是没有任何意义的。
关键在于这个struct能不能指示一个逻辑或者物理上存在的概念。
其次是:你认为调用你的函数的人,愿意有8个局部变量么。
draculamx 2009-03-11
  • 打赏
  • 举报
回复
xkyx_cn兄弟啊。
可能你没有明白我主题的意思,这个函数就一个功能,需要参数提供的信息也完全一样,现在的问题就是怎样设计参数,不需要使用重载
KevinYuen 2009-03-11
  • 打赏
  • 举报
回复

class CDXFont
{
....
void Draw3DFont( unsigned int iNum,
const RECT* rctDraw,
const D3DVECTOR& matRotate,
const D3DVECTOR& matZoom ); // 引用比指针安全
....
};

CDXFont.Draw3DFont( 1, RECT(100, 100, 200, 200 ), D3DVECTOR(x1, y1, z1), D3DVECTOR(x2,y2,z2) );


大概意思就这样,具体没有调试
KevinYuen 2009-03-11
  • 打赏
  • 举报
回复
D3DXMATRIX 矩阵?
貌似应该是个VECTOR3D吧
xkyx_cn 2009-03-11
  • 打赏
  • 举报
回复
c++有重载,你可以包装不同的接口来适应不同的目的和需求

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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