
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, 然后修改. 感觉不如一开始就不做这样的 "过早优化"
1 passive 280 天前 via Android 泛型是为了复用,不是为了 kpi |
2 hefish 280 天前 优化得太高级了,太难读,所以我个人就不优化了。 |
3 visper 280 天前 rust 啊,有时候类型复杂了看得头晕。如果晕的话就不优化得了。 |
4 litchinn 280 天前 用宏呢 |
5 R136a1 280 天前 我一般会采用折中的办法,把这个小函数放在原来的函数体里面 |
7 stiangao 280 天前 没必要,一眼能看懂的东西不需要抽象 |