次のコードがあるとしましょう (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 **
structs
number+1