You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将两个反向操作的缩放函数重构为单函数(整数因子实现)

问题描述

我希望将以下两个函数重构为带单个参数的单函数:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:08:32