任意のブロックをリファクタリングするにはどうすればよいですか?
setenv()とunsetenv()はスレッドセーフであることが保証されていないため、スレッドセーフを確保できるように、署名が大きく異なる2つの関数をブロックとして渡します。
古いコード
-(X*)foo1
{
X* x;
@synchronized( self )
{
setenv( ... );
x = worker_1( ... );
unsetenv( ... );
}
return x;
}
-(Y*)foo2
{
Y* y;
@synchronized( self )
{
setenv( ... );
y = worker_2( ... );
unsetenv( ... );
}
return y;
}
2つのコードチャンクは、worker_1()とworker_2()への署名が大幅に異なることを除いて同一であることに注意してください。
言い換えれば、同じラッパーをリファクタリングする必要がありますが、完全に異なる内臓が任意のオブジェクトを返します。
新しいコード
- (void)aThreadSafeWrapper:my_block // broken: needs fixing
{
@synchronized( self )
{
setenv( ... );
my_block(); // broken: needs fixing
unsetenv( ... );
}
}
Objective-Cでこのリファクタリングを実現する方法はありますか?