2015-01-29 9 views
2

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

String methodA(parms){ 
     try{ 

      return methodB(params); 
     } 
     catch(UserDefinedRuntimeException ure){ 
      return ure.getMessage(); 
     } 

    } 

    String methodB(params){ 
     try{  
      return methodC(params); 
     } 
     catch(UserDefinedRuntimeException ure){ 
      throw ure; 
     } 
     catch(Exception otherException){ 
      //handle Exception 
      otherException.printStackTrace(); 
     } 
    } 

    String methodC(params){ 
      if(params.equals("A")||params.equals("B")||params.equals("C")){ 
      return dosomething(); 
      } 
      else{ 
      throw UserDefinedRuntimeException("invalid input :params should be in [A,B,C]"); 
      } 
    } 

Но проблема в том, многие говорят, что исключения являются дорогостоящими для создания

так я прибегая к помощи я нашел другой подход, предложенный в

Best way to return status flag and message from a method in Java

, как показано ниже ..

class Response{ 
     int status; 
     String errMsg; 
    } 


    String methodA(params){ 

     Response response = methodB(params); 
     if(response.status == 1){ 
      return "success"; 
     } 
     else{ 
      return response.errMsg; 
     } 
    } 

    Response methodB(params){ 
     Response response = methodC(params); 
     if(response.status == 0){ 
      return response; 
     } 
     else{ 
      //do processing 
      response = new Response(); 
      response.status =1; 
      return response; 
     } 

    } 

    Response methodC(params){ 
     if(valid(params)){ 
      //dosomething 
      Response response = new Response(); 
      response.status =1; 
      return response; 
     } 
     else{ 
      Response response = new Response(); 
      response.status = 0; 
      response.errMsg = "invalid data"; 
      return response; 
     } 
    } 

, но проблема не нужна классу POJO.

Просьба предложить некоторый подход к решению этой проблемы.

Спасибо заранее.

+0

Не знаю, почему вопрос, который говорит, что Java в заголовке отмечен для C# и .NET. – Richard

+3

Похоже, что мнение основано, ответ, вероятно, «компромисс между читабельностью и производительностью», –

ответ

3

проблема что многие говорят, что исключения являются дорогостоящими для создания

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

Когда логика вашей программы требует от вас отчета об исключении, лучшим подходом является выброс исключения. Стоимость существует только тогда, когда вы на самом деле бросаете исключение, что редко случается.

В то же время не следует использовать исключения для не исключительных ситуаций (например, ситуации, которые вы ожидаете регулярно). Конечные пользователи, вводящие неверные данные в поля, являются одной из таких не исключительных ситуаций. Когда вы реализуете что-то вроде этого, второй способ, который вы показываете, - это правильный способ сделать это.

Но проблема не в том, чтобы класс POJO.

Другая альтернатива заключается в том, чтобы переключиться с «модели pull» на «push model», когда методы возвращают вам ответы с различными ответами, а не на запросы ответов на статус. Вот скелетная реализация этого подхода:

public interface ResponseHandler { 
    void validDataEntered(String data); 
    void invalidDataEntered(String data); 
} 

public class Processor { 
    void methodA(String param1, String param2, ResponseHandler h) { 
     if (!param1.valid()) { 
      h.invalidDataEntered(param1); 
      return; 
     } 
     if (!param2.valid()) { 
      h.invalidDataEntered(param2); 
      return; 
     } 
     validDataEntered(param1+":"+param2); 
    } 
} 

public class MainClass implements ResponseHandler { 
    Processor p = new Processor(); 
    public void validDataEntered(String data) { 
     System.out.println("Got valid data: "+data); 
    } 
    public void invalidDataEntered(String data) { 
     System.err.println("Got invalid data: "+data); 
    } 
    public void doSomething() { 
     p.methodA("one", "two", this); 
    } 
} 
Смежные вопросы