1

次のコードがあるとしましょう (array* 関数は、サイズ変更可能な配列に使用するものであり、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を取る必要があります。これは、リファクタリングしているコードが のアドレスを取得するためです。その結果、リファクタリングされたバージョンは常に 1 を返します (配列にプッシュされたオブジェクトは 1 つだけであるため) このタイプのリファクタリングを正しく行うツールは他にありますか?MyStruct ***MyStruct **structsnumber+1

4

1 に答える 1

1

Eclipse CDT はこれを正しく行います (少なくとも現在のバージョンの Juno)。iとループの宣言を選択し、Refactor > Extract Functionstructsを実行し、出力パラメーターに設定すると、次のようになります。

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 に答える