假设我有以下代码(数组*函数是我们用于可调整大小的数组的函数,它们在指向null的数组上进行初始化):
typedef struct MyStruct
{
int i;
} MyStruct;
MyStruct* GetNewMyStruct(int i)
{
MyStruct* s = malloc(sizeof(MyStruct));
s->i = i;
return s;
}
int SomeFunction(int number, MyStruct *elem)
{
MyStruct **structs = NULL;
int i;
for (i = 0; i < number; i++)
arrayPush(&structs, GetNewMyStruct(i));
arrayPush(&structs, elem);
return arraySize(&structs);
}
我认为SomeFunction太大了,我想重构它。目前我在哪里工作,我们使用VisualAssist X,它具有一些重构功能,但是当我在它上面使用它时,它无法正常工作。如果我试图用它来重构循环,这就是我得到的:
void MyMethod( int number, MyStruct ** structs )
{
int i;
for (i = 0; i < number; i++)
arrayPush(&structs, GetNewMyStruct(i));
}
int SomeFunction(int number, MyStruct *elem)
{
MyStruct **structs = NULL;
MyMethod(number, structs);
arrrayPush(&structs, elem);
return arraySize(&structs);
}
这不正确。 MyMethod
应该是MyStruct ***
,而不是MyStruct **
。这是因为我重构的代码采用structs
的地址。结果是重构版本将始终返回1(因为只有一个对象已被推送到我的数组中)而不是number+1
。还有其他工具可以正确地进行这种类型的重构吗?
答案 0 :(得分:1)
Eclipse CDT正确执行此操作(至少是当前版本的Juno)。选择i
的声明和循环并执行 Refactor&gt;提取函数,并将structs
设置为输出参数,生成:
void MyMethod(int number, MyStruct*** structs) {
int i;
for (i = 0; i < number; i++)
arrayPush(&*structs, GetNewMyStruct(i));
}
int SomeFunction(int number, MyStruct *elem)
{
MyStruct **structs = NULL;
MyMethod(number, &structs);
arrayPush(&structs, elem);
return arraySize(&structs);
}