2013-12-11 2 views
0

Это мой первый вопрос, задающий вопрос, поэтому, пожалуйста, поправьте меня, если я что-то сделаю неправильно. Мне просто сложно найти правильный способ назвать функцию. Начну с того, что я работаю над проектом Windows Phone, а языком является C#. У меня есть класс с именем Поездка, которая выглядит следующим образом:Именование и структура функции

public class Ride 
{ 
    public Destination {get; set;} 
    public Arrival {get;set;} 
    .... 
    public bool IsValid(ErrorLevel level = ErrorLevel.Throw) 
    { 
    try{ 
    if(something_is_not_valid) 
     throw new SomeException("some message that should be displayed"); 
    return true; //if it gets here it means it's valid 
    } 
    catch{Exception){ 
     if(level == ErrorLevel.Throw) //if I want to throw the exception 
     throw; 
     return false; //return false, because it's not valid 
    } 
    } 
} 

Я хочу найти свое мнение о IsValid функции. Я использую его, как это в моем коде:

public void DoSomethingWithARideOnlyIfItsValid(Ride ride){ 
    try{ 
    ride.IsValid(); 
    //if it gets here, it means 
    //that the function didn't throw an error 
    rideManager.DoSomething(ride); 
    } 
    catch(Exception ex){ 
    MessageBox.Show(ex.Message); 
    } 
} 

Таким образом, функция IsValid может получить параметр Равен, который может быть Throw или Return. В некоторых случаях я просто хочу посмотреть, что возвращает функция, и я отправляю ErrorLevel.Return как параметр, но в большинстве случаев, если проверка не выполняется, я хочу, чтобы она выдала исключение из сообщения, чтобы я мог показать его непосредственно пользователю. Это слишком вонючий ... поэтому я делаю что-то неправильно. Я думал об изменении имени на Validate, но это не делает его лучше. Другим решением было бы использовать свойство IsValid, которое вернет true или false, и функцию Validate(), которая вернет сообщение, если что-то не так, поэтому я могу показать его пользователю. Есть ли у вас другие предложения? Спасибо!

+2

Если это слишком вонючее, откройте окно и проветрите помещение. Что вы подразумеваете под словом «слишком вонючий»? Вы имеете в виду соглашение об именовании? Как насчет "ThrowIfInvalid()"? – elgonzo

+2

Вы слышали о «запахах кода»? Http: //en.wikipedia.org/wiki/Code_smell Это должно быть хорошо, но я также хочу, чтобы в некоторых случаях это исключало исключение. И я говорю не только об имени. Если кто-то хочет использовать эту функцию, они будут смущены параметром перечисления, отправленным функции, и тем, что в некоторых случаях он возвращает true или false, а в некоторых случаях он выдает ошибку. – thewindev

+0

Не знал термин «запах кода». Должен признаться, «запах кода» является хорошим :) – elgonzo

ответ

2

Я хотел бы создать класс

public class ReturnClass 
{ 
    public ReturnClass() 
    { 
     IsOk = true; 
    } 

    public bool IsOk { get; set; } 
    public string ErrorText { get; set; } 
} 

Затем сделайте возвращаемое значение функции Validate типа ReturnClass. В функции validate в случае ошибки установите IsOk в false и напишите текст ошибки в свойстве ErrorText.

+0

Я согласен с этим. Исключения довольно дороги. Существует причина, почему TryParse-Pattern существует для предикатов. –

+0

У меня уже есть класс с IsSuccessful и Message, но я использую его только для функций, которые делают веб-запросы. Причина, по которой я не использовал его для функции IsValid, заключается в том, что я мало знаю о том, насколько хороши или плохи исключения в чистом коде. Я думаю, что буду использовать этот подход! Большое спасибо! – thewindev

+0

Я не думаю, что это хорошее решение. Это противоречит языку и усложняет код. Исключения не являются дорогостоящими, и беспокоиться об этом - это преждевременная оптимизация. Они служат очень реальной цели, сигнализируя об исключительном случае, и именно поэтому использует их вся инфраструктура .NET. Рекомендация Microsoft заключается в использовании исключений и не возвращать коды ошибок или принимать бросок на основе варианта: http://blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787. aspx См. мой ответ ниже для того, что я считаю лучшим решением. – mfanto

0

Я думаю, вам следует избавиться от всего материала ErrorLevel. Это усложняет код, и трудно сказать, что делает этот метод.

IsValid() мне кажется, что он должен возвращать ответ «да» или «нет» и вызывать исключение только в том случае, если что-то не так.

public class Ride 
{ 
    public Destination {get; set;} 
    public Arrival {get;set;} 
    .... 

    public bool IsValid() 
    { 
     if (Arrival == null) 
     { 
      throw new ArgumentException("Arrival"); 
     } 

     return DoSomethingToValidateDestionationAndArrival(); 
    } 
} 

, а затем ваш абонент может выглядеть следующим образом:

public void DoSomethingWithARideOnlyIfItsValid(Ride ride) 
{ 
    try 
    { 
     if (ride.IsValid() == false) 
     { 
      throw new Exception("The ride is invalid"); 
     } 

     //if it gets here, it means 
     //that the function didn't throw an error 
     rideManager.DoSomething(ride); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

Теперь вы можете получить доступ к реальным исключением того, что произошла ошибка (это было ошибкой аргумент, который предлагает что-то не так с программой) , или это было недействительным Ride, которое предоставил пользователь. Код также намного легче читать.

0

Действительно ли IsValid нужно попробовать, поймать? Нельзя ли это просто выбросить, поскольку любой вызывающий метод IsValid должен попробовать, поймать его, так как вы хотите отобразить ошибку в окне сообщения.

public class Ride 
{ 
    public Destination {get; set;} 
    public Arrival {get;set;} 
    .... 
    public void Validate(ErrorLevel level = ErrorLevel.Throw) 
    { 
    if(level == ErrorLevel.Throw) //if I want to throw the exception 
     throw; 
    if(something_is_not_valid) 
     throw new SomeException("some message that should be displayed"); 
    } 
} 

А на вызывающем абоненте только что-нибудь подобное?

public void DoSomethingWithARideOnlyIfItsValid(Ride ride){ 
    try{ 
    ride.Validate(); 
    rideManager.DoSomething(ride); 
    } 
    catch(SomeException ex){ 
     //... 
    } 
    catch(Exception ex){ 
    MessageBox.Show(ex.Message); 
    } 
} 

Или действительно, что делает DoSomething (ездить) на самом деле? Это для экономии? Это просто проверка чего? Это зависит от контекста. Что вы проверяете? Проверка свойств, если они являются нулевыми? Если это так, вы можете перенести их в набор свойств, учитывая, что у них есть поля поддержки и перенос проверки на DoSomething (покататься);

+0

Существует класс RideManager, который похож на CRUD для класса Ride. Если у меня есть функция CreateRide (Ride ride), тогда я должен проверить эту функцию, если поездка действительна, возможно, даже внесут некоторые изменения в поездку, а затем передайте ее в RideService, что делает веб-запрос для создания Ride , – thewindev

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