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

197 天前
 NerdHND
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, 然后修改. 感觉不如一开始就不做这样的 "过早优化"

2020 次点击
所在节点    程序员
8 条回复
passive
197 天前
泛型是为了复用,不是为了 kpi🫠
hefish
197 天前
优化得太高级了,太难读,所以我个人就不优化了。
visper
197 天前
rust 啊,有时候类型复杂了看得头晕。如果晕的话就不优化得了。
litchinn
197 天前
用宏呢
R136a1
197 天前
我一般会采用折中的办法,把这个小函数放在原来的函数体里面
NerdHND
197 天前
@R136a1 函数体套函数体我只会用在递归的时候... 毕竟实际上是增加嵌套
stiangao
197 天前
没必要,一眼能看懂的东西不需要抽象
NerdHND
197 天前
@stiangao 确实, 一句话说到本质了. 其他都是扯淡

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1113087

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX