【发布时间】:2016-08-07 08:21:25
【问题描述】:
我有两个这样的性能关键函数:
insertExpensive(Holder* holder, Element* element, int index){
//............ do some complex thing 1
holder->ensureRange(index);//a little expensive
//............ do some complex thing 2
}
insertCheap(Holder* holder, Element* element, int index){
//............ do some complex thing 1
//............ do some complex thing 2
}
如何将 2 个函数组合在一起以提高可维护性?
我的糟糕解决方案:
解决方案 1。
insertExpensive(Holder* holder, Element* element, int index){
do1();
holder->ensureRange(index);//a little expensive
do2();
}
insertCheap(Holder* holder, Element* element, int index){
do1();
do2();
}
会很丑。
如果do2 想要来自do1 的一些局部变量也是不切实际的。
解决方案 2。
insert(Holder* holder, Element* element, int index, bool check){
//............ do some complex thing 1
if(check)holder->ensureRange(index);//a little expensive
//............ do some complex thing 2
}
每次调用都要进行条件检查。
解决方案 3.(草案)
template<bool check> insert(Holder* holder, Element* element, int index){
//............ do some complex thing 1 (Edit2 from do1());
bar<check>();
//............ do some complex thing 2 (Edit2 from do2());
}
template <>
inline void base_template<true>::bar() { holder->ensureRange(index); }
template <>
inline void base_template<false>::bar() { }
矫枉过正和不必要的复杂性?
编辑 1:
方法好坏的标准优先级排序如下:-
1. 最佳性能
2. 代码重复少
3. 减少总代码行
4. 更易于专家和初学者阅读
编辑 2: 编辑第三个解决方案。感谢 mvidelgauz 和 Wolf。
【问题讨论】:
-
如何定义好的解决方案?
-
你可以创建两个包含 Expensive 和 Cheap 对象的类,当你需要添加一个便宜的对象时,你调用一个便宜的对象的 Insert 方法,当你想插入一个昂贵的对象时,你在 Expensive 对象上调用相同的方法。
-
谢谢。我忘了在这方面考虑,但是这些方法是如何实现的?恕我直言,在这两种方法中都会出现相同的症状:代码重复,现在也更难跟踪,因为它们出现在 2 个不同的类中。
-
我发现 API 很重要,这就是我拒绝添加额外参数的原因,但代码重复当然是不好的。看看我的答案,寻找可能的解决方案。
-
这个更适合Programmers SE site
标签: c++ performance function code-duplication maintainability