2014-10-30 3 views
-1

У меня проблема с получением моей логики для работы или еще лучше. Мне нужен лучший способ реализовать эту ситуацию if-else.Что такое лучший способ реализовать эту логику if else?

У меня есть 3 разных условия, которые задают разные свойства, и я хочу, чтобы данные сохранялись в базе данных только тогда, когда все условия оцениваются как истинные и не сохраняются, когда какие-либо или все разные условия оцениваются как ложные.

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); 

ответ

1

Используйте логический флаг:

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); 
} 
+0

В то время как это решение работает, ОП просил способ реализовать всю свою логику if-else. Этот ответ по-прежнему использует тот же метод. – phantom

+1

Не совсем, он попросил понять, что три из if-утверждений верны, флаг работает правильно. Я предпочитаю ваш фантом ответа, потому что его короче, но, возможно, ему может понадобиться представление оценки, чтобы оно сохранялось и использовалось в другом месте, в котором я предпочитаю ответ Озанов, он может отправить этот флаг любому методу, который может использовать что-то вроде «aMethodThatUsesTheFlag (boolean persist) ". Но так как это не входит в сферу действия, я бы принял ответ фантома –

+0

правильный ответ. Может быть укорочен вложением 'persist' в условие:' if (persist & = a> b) ' Таким образом,' else' может быть опущен. –

1

Вы бы гораздо лучше, используя and operator:

Примечание: Я не совсем уверен, что из контекста, что ваши функции SetAlpha являются, таким образом, это может не работает. Если вы уточните это в своем первоначальном вопросе, я исправлю его здесь.

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. 
} 

Надеюсь, что это помогло. Удачи!

+1

Что случилось с 'setAlpha()/...'? –

+0

@ jp-jee Упс. Да, верно, я добавлю их. – phantom

+0

@luisdurazoa Извините, что дата? – phantom

-1

Вы можете сделать это, используя и укорачивать код:

// 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); 
} 

После этого вы можете вызвать if validate() проверить условия более быстро, а также.

+1

Это не отражает логику в исходном вопросе. –

+0

Не так ли? Вызов 'if validate() {database.persist (em); } ' – Erick

+1

Naw, потому что исходный код не требует, чтобы каждое условие было истинным только для установки, скажем, alpha. –

1

Если заказ на обработку исправлен, вы можете использовать шаблон проектирования ООП «Цепь ответственности» для этой проблемы. Вот небольшая программа, которую я собрал в качестве иллюстрации:

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); 
     } 
    } 
} 
+0

Это заставило меня понять, как цепочка ответственности работает намного лучше. Я попробую это, чтобы лучше понять этот шаблон проектирования ООП – ollaollu

+0

Это кажется тяжелым для вопроса на рассмотрении. –

+0

Вы создали цепочку «цепочка ответственности» один раз, обработка - кливер – stones333

Смежные вопросы