将两个反向操作的缩放函数重构为单函数(整数因子实现)
问题描述
我希望将以下两个函数重构为带单个参数的单函数:
void zoom_in() { object.zoom_factor *= 2; object.width /= 2; object.height /= 2; } void zoom_out() { object.zoom_factor /= 2; object.width *= 2; object.height *= 2; }
我曾尝试实现:
void zoom_in() { zoom_helper(true); } void zoom_out() { zoom_helper(false); } void zoom_helper(bool in) { float factor = (in ? 2 : .5); object.zoom_factor *= factor; object.width /= factor; object.height /= factor; }
但我更希望使用整数类型的因子,请问能否优雅地重构这段代码?
优雅的整数因子重构方案
当然可以!既然你想避开浮点数,用纯整数逻辑来实现,我们可以通过语义化的参数类型来重构代码,既满足单参数单函数的要求,又保持逻辑清晰且完全使用整数操作。
方案1:使用枚举类型(最推荐)
用枚举来明确缩放方向,比bool参数可读性强得多,别人看代码一眼就能理解参数的含义,同时全程用整数2进行乘除操作:
// 定义枚举,清晰标记缩放方向 enum class ZoomDirection { In, Out }; // 单参数的核心缩放函数 void zoom(ZoomDirection direction) { if (direction == ZoomDirection::In) { object.zoom_factor *= 2; object.width /= 2; object.height /= 2; } else { object.zoom_factor /= 2; object.width *= 2; object.height *= 2; } } // 保留原有的入口函数(如果需要的话) void zoom_in() { zoom(ZoomDirection::In); } void zoom_out() { zoom(ZoomDirection::Out); }
这个方案的优势:
- 枚举限制了参数的合法取值,避免传入无效值(比如
bool的true/false容易让人混淆对应关系) - 完全使用整数
2进行运算,和你原始函数的逻辑完全一致 - 代码语义清晰,维护成本低
方案2:使用整数参数(轻量版)
如果觉得枚举有点繁琐,也可以用整数参数来标记方向,但建议加上注释明确参数含义,还可以加断言防止非法输入:
// 参数说明:1 = 放大(zoom in),-1 = 缩小(zoom out) void zoom(int direction) { assert(direction == 1 || direction == -1); // 确保参数合法 if (direction == 1) { object.zoom_factor *= 2; object.width /= 2; object.height /= 2; } else { object.zoom_factor /= 2; object.width *= 2; object.height *= 2; } } // 保留原入口 void zoom_in() { zoom(1); } void zoom_out() { zoom(-1); }
注意事项
如果object的成员(比如width、height、zoom_factor)是整数类型,这里的除法会是整数除法,和你原始函数的行为完全一致;如果是浮点类型,整数2会自动转换为浮点数,结果也和原逻辑匹配。
内容的提问来源于stack exchange,提问作者Utku
相关产品推荐
相关产品推荐

