我有一个非常基本的编程问题。假设我有两个函数,它们的定义实际上是相同的,只是它们只在内部二进制条件下有所不同。这两个函数中的其余代码实际上是相同的。
为了拥有一个可读且易于维护的代码,我想知道除了使用bool参数来选择这些函数的操作模式之外,是否还有更好的解决方案?有没有design-pattern可以做到这一点?
在下面的代码中,我用两个名为doA()和doB()的函数来说明我的疑问。点(....)对应于与这两个函数完全相同的代码。我创建了一个新的doNew()函数,并添加了一个布尔参数来选择适当的功能。但是,请注意,尽管这是一种可能的解决方案,但由于两个if条件的主体中都有重复的代码,因此效率仍然很低。
void doA( ..... ){
.....
.....
if(x!=y){
....
....
....
}
.....
}
void doB( ..... ){
.....
.....
if(x==y){
....
....
....
}
.....
}
void doNew( ....., bool selectionMode ){
.....
.....
if(selectionMode == true){
if(x==y){
....
....
....
}
}
else{
if(x!=y){
....
....
....
}
}
.....
}发布于 2011-07-17 01:06:06
我还会使用一个布尔参数来区分它们。我不会在这么简单的过程中使用复杂的模式。
我会用
void doIt(..., BOOL is_equal) {
...
if((a == b) == is_equal) { // or: is_equal ^ (a == b)
...
}
...
}最终减少冗余。我还会定义独立的名称
void doA(...) {
doIt(..., true);
}
void doB(...) {
doIt(..., false);
}因为我认为API中的标志参数是不好的。
发布于 2011-07-17 01:04:02
我建议您将do作为模板函数,并将二进制函数作为函数的函数器参数。类似于:
template <class BinaryFunctor>
void do(...,BinaryFunctor f)此二进制函数器将返回一个您可以在do中使用的bool。
functor的示例代码:
struct Equals
{
Equals(int x , int y) : m_x(x), m_y(y){}
bool operator()() const { return m_x == m_y;}
private:
int m_x;
int m_y;
};
struct NotEquals
{
NotEquals(int x , int y) : m_x(x), m_y(y){}
bool operator()() const { return m_x != m_y;}
private:
int m_x;
int m_y;
};
template<class BinaryFunctor>
void doSomething(BinaryFunctor f)
{
if(f())
{
//Condition satisfied
}
}
int main ()
{
doSomething(Equals(10,11));
doSomething(NotEquals(10,11));
return 0;
}发布于 2011-07-17 01:07:03
您可以将其编写为:
if(selectionMode && x==y || !selectionMode && x!=y)
//....还有其他方法可以做到这一点。你可以传递一个函数式函数(例如:函数指针)来进行比较。您可以使用functor模板参数编写一个模板,并使用该模板定义两个函数。
更新:
人们提供了几个例子,所以我将向你展示一个不同的例子,这个例子使用普通的函数指针,不传递两个值来比较,而是传递比较的结果。(注意:其他例子是首选的,但你看到的例子越多越好)
//type of the function pointer
typedef bool (*dofuncptr)(bool);
bool do_istrue(bool b) {
return b;
}
//negates the input
bool do_isfalse(bool b) {
return b;
}
void doX(dofuncptr fun) {
//...
if (fun(x == y)) {
//....
}
//...
}
int main() {
//you can use it like this:
doX(&do_istrue);
}https://stackoverflow.com/questions/6718888
复制相似问题