小众知识

首页 > 正文

我提出如何处理类中方法的返回值的一种办法,欢迎指点

1.在一个大的系统中,类的数目和每个类中方法的数目都比较多
2.通过返回值来判断一个方法调用是否成功.
问题:
  太多的返回值很难记忆,而已容易犯错.
我是这么解决这个问题的:
例子:
#include 
using namespace std;
class  Test
{
public:
struct RETVALUE
{
enum {SUCCESS = 0};
enum {Fail = 1};
};
int f() {return RETVALUE::SUCCESS;}
};
int main(int argc, char **argv)
{
Test test;
if (Test::RETVALUE::SUCCESS == test.f())
{
cout<<"exec success"<}

return 0;
}

1. 每个类里定义一个struct结构将所有的返回值枚举出来.
   不能直接使用枚举,那样无法进行类继承.
2.在调用累方法时候,进行判断.


我认为解决的问题:
 1.对可能出错每个方法调用都判断起返回值,提高程序的鲁棒性.
 2.不会因为对函数返回值理解错误,而犯低级错误,(我犯过)
 3.一些类有很多返回值,需要对返回值进行宏定义(一般使用define或者const)
  可是这样就失去了类的封装性,而且也难以继承.

申明:
  这个念头是在工作中闪现的,想把他用与自己的工作代码中.可是不知道会不会引起其他问题(如开始我使用enum定义返回值,使类无法继承),所以想大家求教.
  也许这个办法很多问题,希望大家指出.


 我觉得使可行的之处.
   将类中错误处理过程标准化,减少错误.



 

 Wolf0403 发表于:2003-09-28 16:56:01
得分:10 

嵌套的结构并不具有继承性:是针对当前类的,仅仅是名字上的一个嵌套而已;另外某些情况下函数的返回值可能具有不可枚举性,或者干脆不用返回值来返回?呵呵。不是特别实用。对于返回值的理解,应该依靠的是文档而不是枚举值。如果不是 VC/BCB,也许没有代码自动提示,用枚举反而是一种折磨呢?呵呵。
好的编程习惯胜过一切。 

 overmyself 发表于:2003-09-28 18:22:27
得分:0 

我说的的继承是这个意思,继承没问题的。

class  DeTest : public Test
{
public:
struct RETVALUE : public Test::RETVALUE
{
enum {OTHERFAIL = 3};
};
int f() {return RETVALUE::SUCCESS;}
};

这样是比较罗嗦,不过也许可以减少错误吧?
是不是真的没有用吗?
盼回答 

 liao2001 发表于:2003-09-30 11:12:43
得分:10 

enum可以称之为有名字的常量,你放在类中定义为public和放在类外定义,用起来并没有多大区别,仅仅多了一个作用域而已,不算好,也不算坏,个人喜好吧。
处理不同范围的错误,我喜欢用宏,c情结。在定义宏时,加上限定的话,问题就解决了,比如:
class a;
#define eaa_success 1
#define eaa_fail 0 

 RainWindy 发表于:2003-09-30 11:46:30
得分:0 

就跟标准C的errno一样,定义你自己的错误代码表(我想过,但我不敢在程序里实现,这改动太大了),当然这个错误代码表需要区分不同级的意思,比如使用long型,在错误代码在0_99999之间(也可为负数),0表示成功,10000-19999为什么定义,20000-29999为什么定义等等,这样定义应该是比较有用的。只是不敢轻易改,这个改动有一点大。 

 jeckyz 发表于:2003-09-30 15:15:22
得分:0 

#include 
using namespace std;

class Test
{
public:
    enum { SUCCESS = 1, FAIL = 2 };
    int f() {return SUCCESS;}
};

class DeTest : public Test
{
public:
    enum { OTHERFAIL = 3 };
};

int main(int argc, char **argv)
{
    DeTest test;
    if (Test::SUCCESS == test.f())
    {
cout<<"exec success"<    }

    return 0;
}

其实 struct RETVALUE 在这里仅仅是起到了 namespace 的作用。如果只作类似 Test::SUCCESS == test.f()) 这样的使用,枚举值是什么也没关系的,进而改成:

class  Test
{
public:
    enum { SUCCESS, FAIL };
    int f() { return SUCCESS; }
};

class DeTest : public Test
{
public:
    enum { OTHERFAIL };
};

// 主程序部分不变
...


 jeckyz 发表于:2003-09-30 15:27:28
得分:0 

oh,对不起,我错了,枚举值应该初始化为不同的。sorry! 

 merlinran 发表于:2003-09-30 18:17:17
得分:0 

其实你既然把错误码放在类的接口中,那为何还要让函数返回int呢?返回int就把类型信息都给丢了。
而且:
struct RETVALUE : public Test::RETVALUE
{
enum {OTHERFAIL = 3};
};
这个3就是个magic number,很有可能把它设成了和以前的某个enum相同的值。

我想,会有一种办法能够让返回值更安全一些,虽然我现在还没想到。

其实在基类中就把所有的错误码用一个enum定义出来,然后返回enum,而不是int,能够满足多数要求。如果把错误码分布在一个类层次的各处,对维护者和使用者来讲,都是件烦恼的事。 

 overmyself 发表于:2003-10-11 16:33:33
得分:0 

如果使用基类维护错误返回值的话,那样回很难维护的,慢慢变得很大.
我现在采用jeckyz(深圳) 老兄的意见,现在返回int,定义枚举只是为了方便记忆.

不在通过它来检查类型.呵呵,折中吧.

欢迎多指教!


 xiaoyunet 发表于:2003-10-14 11:17:32
得分:0 

有什么用?你的方法能解决你的问题吗? 

上一篇:高手解惑,类之间的调用问题
下一篇:一个有关VC++作图的问题!

分享到: