如何重构任意块?
我有两个签名截然不同的函数,我想将它们作为一个块传递,以便确保线程安全,因为 setenv() 和 unsetenv() 不能保证是线程安全的:
旧代码
-(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;
}
请注意,这两个代码块是相同的,只是 worker_1() 和 worker_2() 的签名大不相同。
换句话说,我需要重构相同的包装器,但完全不同的胆量返回任意对象。
新代码
- (void)aThreadSafeWrapper:my_block // broken: needs fixing
{
@synchronized( self )
{
setenv( ... );
my_block(); // broken: needs fixing
unsetenv( ... );
}
}
有什么方法可以在 Objective-C 中完成这种重构吗?