V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
NerdHND
V2EX  ›  程序员

你会为这样的 "微型" 代码段建立函数吗?

  •  
  •   NerdHND ·
    1216892614 · 1 天前 · 1187 次点击
    fn card_states_init(
        mut cmds: Commands,
        query_card: Query<(Entity, Option<&Children>), Added<Card>>,
        query_card_none: Query<(Entity, Option<&CardNone>)>,
        query_card_hover: Query<(Entity, Option<&CardHover>)>,
        query_card_action: Query<(Entity, Option<&CardAction>)>,
    ) {
        for (card, children) in query_card.iter() {
            if let None | Some((_, None)) = children
                .map(|c| c.iter().find_map(|c| query_card_none.get(*c).ok()))
                .flatten()
            {
                let child = cmds.spawn(CardNone).id();
                cmds.entity(card).add_child(child);
            }
    
            if let None | Some((_, None)) = children
                .map(|c| c.iter().find_map(|c| query_card_hover.get(*c).ok()))
                .flatten()
            {
                let child = cmds.spawn(CardHover).id();
                cmds.entity(card).add_child(child);
            }
    
            if let None | Some((_, None)) = children
                .map(|c| c.iter().find_map(|c| query_card_action.get(*c).ok()))
                .flatten()
            {
                let child = cmds.spawn(CardAction).id();
                cmds.entity(card).add_child(child);
            }
        }
    }
    

    我在写上面这行代码段的时候在思考, 我是否应该将这重复的四段代码修改为下面这样:

    fn card_states_init(
        mut cmds: Commands,
        query_card: Query<(Entity, Option<&Children>), Added<Card>>,
        query_card_none: Query<(Entity, Option<&CardNone>)>,
        query_card_hover: Query<(Entity, Option<&CardHover>)>,
        query_card_action: Query<(Entity, Option<&CardAction>)>,
    ) {
        for (card, children) in query_card.iter() {
            card_state_init(&mut cmds, children, card, &query_card_none);
            card_state_init(&mut cmds, children, card, &query_card_hover);
            card_state_init(&mut cmds, children, card, &query_card_action);
        }
    }
    
    fn card_state_init<T: Component>(
        cmds: &mut Commands,
        children: Option<&Children>,
        card: Entity,
        query_card_state: &Query<(Entity, Option<&T>)>,
    ) {
        if let None | Some((_, None)) = children
            .map(|c| c.iter().find_map(|c| query_card_state.get(*c).ok()))
            .flatten()
        {
            let child = cmds.spawn(CardNone).id();
            cmds.entity(card).add_child(child);
        }
    }
    

    这样修改乍一看确实简化了重复, 但是却引入了泛型, 如何后面这几个 state 在初始化的时候要单独处理就要么退回来重新用原本的方案再修改, 要么再写一种 init, 然后修改. 感觉不如一开始就不做这样的 "过早优化"

    8 条回复    2025-02-21 12:06:38 +08:00
    passive
        1
    passive  
       1 天前 via Android
    泛型是为了复用,不是为了 kpi🫠
    hefish
        2
    hefish  
       1 天前
    优化得太高级了,太难读,所以我个人就不优化了。
    visper
        3
    visper  
       1 天前
    rust 啊,有时候类型复杂了看得头晕。如果晕的话就不优化得了。
    litchinn
        4
    litchinn  
       1 天前
    用宏呢
    R136a1
        5
    R136a1  
       1 天前
    我一般会采用折中的办法,把这个小函数放在原来的函数体里面
    NerdHND
        6
    NerdHND  
    OP
       1 天前
    @R136a1 函数体套函数体我只会用在递归的时候... 毕竟实际上是增加嵌套
    stiangao
        7
    stiangao  
       1 天前   ❤️ 1
    没必要,一眼能看懂的东西不需要抽象
    NerdHND
        8
    NerdHND  
    OP
       1 天前
    @stiangao 确实, 一句话说到本质了. 其他都是扯淡
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2864 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 07:48 · PVG 15:48 · LAX 23:48 · JFK 02:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.