1

假设我有以下代码(array* 函数是我们用于可调整大小的数组的函数,它们对空初始化的指向数组的指针进行操作):

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应该采取 a MyStruct ***,而不是 a MyStruct **。这是因为我正在重构的代码采用structs. 结果是重构后的版本总是返回 1(因为只有一个对象被推入我的数组),而不是number+1. 是否有其他工具可以正确地进行这种类型的重构?

4

1 回答 1

1

Eclipse CDT 正确地做到了这一点(至少是当前版本的 Juno)。选择i和循环的声明并执行Refactor > Extract Function,并设置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);
}
于 2012-08-29T09:25:49.577 回答