Student
Student

Reputation: 28345

What's the best approach to implement this algorithm?

What would be the best way to write an algorith like:

if (a) {
  doA();
  done();
}
else if (b) {
  doB();
  done();
}
else if (c) {
  doC();
  done();
}

another approach I thought:

done = true;
if (a) {
  doA();
}
else if (b) {
  doB();
}
else if (c) {
  doC();
}
else {
  done = false;
}
if (done) {
  done();
}

Which is better? Is there another best approach?

Upvotes: 0

Views: 141

Answers (6)

user240515
user240515

Reputation: 3207

First, have one condition variable, not three. Second, I'd use a map of function pointers, with the condition variable as the key. Here's an example:

#!/usr/bin/env python

def doA():
    pass
def doB():
    pass
def doC():
    pass
def done():
    pass

a = 3
b = 6
c = 8

doers = {}
doers[a] = doA
doers[b] = doB
doers[c] = doC
condition = a

# this is now the entire "algorithm":

if condition in doers:
    doers[condition]()
    done()

Upvotes: 0

Antti Huima
Antti Huima

Reputation: 25522

I would write it as

var failed = false;
if (a) doA();
else if (b) doB();
else if (c) doC();
else failed = true;
if (!failed) done();

I don't like setting a variable like done first to true and later undoing it, because the work is not done before the conditional starts, so it looks illogical.

I also don't like the switch case option because the conditions 'a', 'b', 'c' are not necessarily mutually exclusive; the if ... else if ... else cascade supports non-exclusive conditions but switch() might not depending on the language. E.g. you can't convert cascading if ... else's to switch in C++.

I think it's definitely important to remove multiple call points to done() because that's redundancy and later a maintenance issue if done() e.g. gets parameters.

Upvotes: 0

Alexandre C.
Alexandre C.

Reputation: 56956

Without any context, the most natural looking way for me is:

bool do_it(int condition)
{
    switch (condition)
    {
        case a: doA(); return true;
        case b: doB(); return true;
        case c: doC(); return true;
        default: return false;
    }
}

// ...

if (do_it) done();

since it abstracts the logic of "if this whole stuff succeeds, then do call done()".

But there are many other ways to do this. Especially, if the number of conditions will likely grow in the future, I wouldn't do that at all.

Upvotes: 3

Andras
Andras

Reputation: 45

If a,b and c are different complex conditional expressions then your first solution is the best. Maybe you can avoid the "else if" elements if this code is inside a function, like that:

private void doit() {
    if (a) {
        doA();
        done();
        return;
    }
    if (b) {
        doB();
        done();
        return;
    }
    if (c) {
        doC();
        done();
        return;
    }
}

So for me it is much more a code style question.

Upvotes: 0

Euphoric
Euphoric

Reputation: 12849

Depends on how many conditions/actions are there and kind of language you are using.

OOP and polymorphysm could work nicely.

Upvotes: 1

BrandonZeider
BrandonZeider

Reputation: 8152

Use a switch statement, setting an isDone flag along the way, and call done() based on the flag.

Upvotes: 0

Related Questions