简体   繁体   中英

What is a better way to implement this if else logic?

I have a problem with getting my logic to work or better still I need a better way to implement this if-else situation.

I have 3 different conditions that set different properties and I want data to be persisted to database only when all conditions evaluate to true and not persist when any or all of the different conditions evaluate to false.

if (a>b){
  em.setAlpha();
}else{
  //throw error that prevents em.persist
}

if (c>d){
  em.setBeta();
}else{
  //throw error that prevents em.persist
}

if (e>f){
  em.setOmega();
}else{
  //throw error that prevents em.persist
}

//Should persist only when all conditions evaluate to true and not 
//persist when one or more of the conditions evaluates to false(throws an error)
database.persist(em);

You would be far better using the and operator :

Note: I'm not entirely sure from the context what your setAlpha functions are, so this may not work. If you clarify this in your original question I will fix it here.

if (a > b && c > d && e > f) {
    em.setAlpha();
    em.setBeta();
    em.setOmega();
    database.persist(em);
}
else {
    // We show up here if one of the conditions was false.
}

Hope this helped. Good luck!

Use a boolean flag:

boolean persist = true;

if (a>b){
  em.setAlpha();
}else{
  persist = false;
}

if (c>d){
  em.setBeta();
}else{
  persist = false;
}

if (e>f){
  em.setOmega();
}else{
  persist = false;
}

if (persist) {
  database.persist(em);
}

If the processing order is fixed, you could use OOP design pattern "Chain Of Responsibility" for this problem. Here is a small program I put together as an illustration:

class JavaObj  {
    public void setAlpha() {}
    public void setBeta() {}
    public void setOmega() {};
}
class DB  {
    public void persist(JavaObj obj) {}
}
abstract class Handler {
    protected Handler successor;
    public void setSuccessor(Handler successor){
        this.successor = successor;
    }
    abstract public boolean processRequest(Integer [] params, JavaObj request);
}
class AlphaHandler extends Handler {
    public AlphaHandler (Handler successor) { setSuccessor(successor); }
    public boolean processRequest(Integer [] params, JavaObj request) {
        if (params[0]>params[1]) {
            request.setAlpha();
            return (successor==null) ? true : successor.processRequest(params, request);
        } else {
            return false;
        }
    }
}
class BetaHandler extends Handler {
    public BetaHandler (Handler successor) { setSuccessor(successor); }
    public boolean processRequest(Integer [] params, JavaObj request) {
        if (params[2]>params[3]) {
            request.setBeta();
            return (successor==null) ? true : successor.processRequest(params, request);
        } else {
            return false;
        }
    }
}
class OmegaHandler extends Handler {
    public OmegaHandler (Handler successor) { setSuccessor(successor); }
    public boolean processRequest(Integer [] params, JavaObj request) {
        if (params[4]>params[5]) {
            request.setOmega();
            return (successor==null) ? true : successor.processRequest(params, request);
        } else {
            return false;
        }
    }
}
public class ChainOfResponsibilityAsExample {
    // setup the chain of responsibilities 
    private static Handler omegaHandler = new OmegaHandler(null);
    private static Handler betaHandler = new BetaHandler(omegaHandler);
    private static Handler processor = new AlphaHandler(betaHandler);

    public static void main(String[] args) {
         DB database = new DB();
         JavaObj em = new JavaObj();
         Integer[] intArray = new Integer[] { 0, 1, 2, 3, 4, 5 };

         if (processor.processRequest(intArray, em)) {
             database.persist(em);
         }
     }
}

You could do this, using and to shorten your code:

// We set the valid ones
if (a > b) {
    em.setAlpha();
} else {
    //throw error that prevents em.persist
}
if (c > d) {
    em.setBeta();
} else {
    //throw error that prevents em.persist
}
if (e > f) {
    em.setOmega();
} else {
    //throw error that prevents em.persist
}

public boolean validate() {
    if ((a > b) && (c > d) && (e > f)) {
        return true;
    } else {
        return false;
    }
}

if (validate()) {
    database.persist(em);
}

After that you can call if validate() to check conditions more quickly as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM