Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重构id类型_C++_C_Refactoring - Fatal编程技术网

C++ 重构id类型

C++ 重构id类型,c++,c,refactoring,C++,C,Refactoring,我的应用程序使用int作为id来标识内存和持久注册表中的对象。应用程序中的函数接收id作为参数,从注册表检索对象并执行其工作,例如 void print( int id, int bar, double zip, int boo ) { Object *obj = get_obj_by_id( id ); obj->print( bar, zip, boo ); } 应用程序已经发展,现在可以在同一个应用程序中有多个注册表。该应用程序现在使用一个全局可访问的“当前”注册表

我的应用程序使用
int
作为id来标识内存和持久注册表中的对象。应用程序中的函数接收id作为参数,从注册表检索对象并执行其工作,例如

void print( int id, int bar, double zip, int boo )
{
    Object *obj = get_obj_by_id( id );
    obj->print( bar, zip, boo );
}
应用程序已经发展,现在可以在同一个应用程序中有多个注册表。该应用程序现在使用一个全局可访问的“当前”注册表,正如全局注册表所做的那样,这会带来很多麻烦

为了摆脱全局“当前”注册表的概念,我需要引入一种类型,该类型可以唯一标识跨注册表的对象。我无法更改正在使用的
int
的值,因此我必须从
int
id和注册表标识创建
full\u id
类型。 因此,示例函数必须更改为

void print( full_id id, int bar, double zip, int boo )
{
    Object *obj = get_obj_by_id( id );
    obj->print( bar, zip, boo );
}

关于id参数的命名有一些约定,但在整个应用程序中没有严格遵循这些约定,因此我无法假设id参数的名称,或者它始终是第一个参数。还有许多功能需要更改。用
full\u id
typed id替换
int
typed id最有效、最可靠的方法是什么?

我将开始查找所有调用,以通过id获取对象,并将其参数从int更改为full\u id。
然后编译,看看哪些地方没有编译,然后迭代地重复这个过程,直到找到所有的地方。慢,但它会工作。

我会开始查找所有调用,以通过id获取对象,并将其参数从int更改为full\u id。
然后编译,看看哪些地方没有编译,然后迭代地重复这个过程,直到找到所有的地方。速度慢,但它会工作。

您的新类型可能不是数字-它类似于一个小的
结构

typedef struct _full_id {
    int registry_id;
    int object_id;
} full_id;
如果是这样,那么您可以从更改处理id的低级函数开始,比如示例中的
get\u obj\u by\u id()
函数。将该函数更改为采用
full\u id
参数而不是
int
后,重新编译整个程序。所有调用此函数的调用站点现在都应该报告由于类型不匹配而导致的错误-然后可以转到这些调用站点并修复其参数类型

冲洗,重复,最终你会把它们都修好


祝你好运(我打赌你希望你现在就开始使用
typedef

假设你的新类型不是数字-它有点像一个小的
结构

typedef struct _full_id {
    int registry_id;
    int object_id;
} full_id;
如果是这样,那么您可以从更改处理id的低级函数开始,比如示例中的
get\u obj\u by\u id()
函数。将该函数更改为采用
full\u id
参数而不是
int
后,重新编译整个程序。所有调用此函数的调用站点现在都应该报告由于类型不匹配而导致的错误-然后可以转到这些调用站点并修复其参数类型

冲洗,重复,最终你会把它们都修好


祝你好运(我打赌你希望你现在就开始使用
typedef

最可靠的方法是:确保你不能隐式地将int转换为full\u id。然后将参数改为get\u obj\u by\u id为full\u id,让编译器计算出你需要更改的地方


它效率很低,但非常可靠(除了人为错误)

最可靠的方法是:确保不能将int隐式转换为full\u id。然后将参数get\u obj\u by\u id更改为full\u id,并让编译器计算出需要更改的位置


它效率很低,但非常可靠(除了人为错误)

如果您可以控制ID分配,您可以为某些注册表分配一定范围的ID,并在get_obj_by_ID()中决定要寻址的注册表

例如:

Object* get_obj_by_id(int id)
{
    if( id % 2 )
        return registry1[id];
    else
        return registry2[id];
}

如果您可以控制ID分配,则可以为某些注册表分配一定范围的ID,并在get_obj_by_ID()中决定要寻址哪个注册表

例如:

Object* get_obj_by_id(int id)
{
    if( id % 2 )
        return registry1[id];
    else
        return registry2[id];
}

+1表示使用typedef可以更轻松地解决问题。+1表示使用typedef可以更轻松地解决问题。