2013-05-18 2 views
1

Я использую свойства, позволяющие добавить одну строку name в класс Details. Я хочу, чтобы свойство принимало только строку, если ее можно разделить на две части.Проверка неправильного ввода внутренних свойств в C#

Две части будут firstName и LastName. Однако, если результирующий раскол имеет 1,0 или более 2 строк в массиве, тогда вход должен считаться недействительным, и я хочу бросить ошибку на любой код, называемый свойством в первую очередь.

Можно ли обрабатывать ошибки при таких свойствах?

Если не то, что из перечисленного является предпочтительным способом, чтобы получить данные в класс во время проверки правильности:

  1. Используйте метод внутри класса Details для обработки входных ошибок, делают этот метод boolean ,
  2. Продолжайте использовать свойства, но проверите проверку ошибок с помощью кода, который вызывает свойство. Мне это не нравится, потому что я хочу, чтобы весь код проверки ошибок был автономным в классе Details.

.

class Details 
{ 
    private string firstName, lastName; 

    public string Name 
    { 
     // name 
     get { return firstName + " " + lastName; } 
     set 
     { 
      string name = value; 
      string[] nameArray = name.Split(' '); 
      firstName = nameArray[0]; 
      lastName = nameArray[1]; 
     } 
    } 
} 

EDIT: Я в основном заинтересован в том, что из трех опций concidered лучшего pratice: проверка

  1. Ошибки в свойствах.
  2. проверка
  3. Ошибки вне класса в другом классе, а затем просто добавить проверенные входы Details
  4. Используйте метод boolean внутри Details для проверки входов.
+0

вы можете проверить длину массива внутри свойства. –

+0

@RajasekarGunasekaran, это хорошее кодирование? Из приведенных ниже ответов видно, что не рекомендуется проверять внутри свойства. – Joseph

+0

@Joseph Нет ничего плохого в проверке ввода внутри свойства setter. Фактически, это очень распространенная, даже стандартная практика. –

ответ

1

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

Если бы это было, я бы отдельные свойства для имени и фамилии, с третьим вычисленным имуществом для полного имени:

class Details 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public string FullName 
    { 
     get { return string.Concat(this.FirstName, " ", this.LastName); } 
    } 
} 

Затем можно добавить метод, чтобы установить полный имя. Способ является более подходящим, чем собственность сеттер для этой задачи, так как она нетривиальна и имеет больше возможностей для проблем:

public void SetFullName(string fullName) 
{ 
    string[] nameComponents = fullName.split(' '); 

    if (nameComponents.Length != 2) 
    { 
    throw new ArgumentException("The full name must contain a first and last name."); 
    } 

    this.FirstName = nameComponents[0]; 
    this.LastName = nameComponents[1]; 
} 

Я также хочу, чтобы дать плагин для Code Contracts пакета. Это может быть больше осложнений, чем вы ищете здесь, но это отличный способ проверки ввода и вывода в ваших приложениях.

1

Таким образом, я бы не рассматривал данные, которые не соответствуют бизнес-логике, исключение и, следовательно, не выбрасывали бы ее. Что я хотел бы сделать это:

class Details 
{ 
    private string firstName, lastName; 

    public string Name 
    { 
     // name 
     get { return firstName + " " + lastName; } 
     set 
     { 
      string name = value; 
      string[] nameArray = name.Split(' '); 
      if(nameArray.Length == 2) 
      { 
       firstName = nameArray[0]; 
       lastName = nameArray[1]; 
      } 
      else 
      { 
       firstName = nameArray[0]; 
       lastName = string.Empty; 
      } 
     } 
    } 

    public bool IsValid() 
    { 
     return !string.IsNullOrEmpty(lastName); 
    } 
} 

Вы можете использовать свойство имени, а затем проверить, если имя является действительным. Если это недействительно, вы можете предпринять соответствующие действия.

Другим вариантом является проверка валидации в методе, вызывающем Details.Name.

EDIT: хотите, чтобы удалить то, что я думаю, что это плохой совет, но сохраняющий поэтому комментарии имеют смысл, так что просто поражает их

EDIT2:

Вы также можете сделать что-то вроде этого:

class Details { приватная строка firstName, lastName;

public string Name 
    { 

     get { return firstName + " " + lastName; } 
     private set; 
    } 

    public bool TryParseName(string name) 
    { 
     bool isValid = true; 
     string[] nameParts = name.split(' '); 
     if(nameParts.Length == 2) 
     { 
      firstName = nameParts[0]; 
      lastName = nameParts[1]; 
     } 
     else 
     { 
      isValid = false; 
     } 

     return isValid; 
    } 
} 

Где вы могли бы сделать

if(details.TryParseName(name)) 
{ 
    // is valid name 
} 
else 
{ 
    // handle invalid name 
} 
+0

Спасибо Jetti. Если у меня есть проверка, выполняемая в методе, вызывающем 'Details.Name', этот метод может легко находиться внутри' Details'. Это верно? Таким образом, весь класс является самодостаточным. – Joseph

+0

@Joseph Я изменил свой ответ. Я не думаю, что проверка вне класса была бы хорошей идеей. Однако вы могли бы создать другой метод, который бы взял строку, а затем дважды проверил, чтобы убедиться, что она правильно отформатирована, а затем вернуть bool. Я добавлю пример – Jetti

+0

@Jetti Почему вы считаете недопустимый ввод не исключительным условием? Мне кажется типичным сценарием «ArgumentException». –

2

я последую существующую структуру проверки, такие как FluentValidation.

Кроме того, в вашем конкретном случае у меня будет метод SetName (string fullName), который выполняет синтаксический анализ и заполнение.

+0

Спасибо, поэтому свойства не должны использоваться для синтаксического анализа и проверки данных? Это не считается хорошим кодированием? – Joseph

+0

Я рассматриваю свойства как простую простую и минимальную функциональность. Вы должны чувствовать себя безопасно для привязки к свойствам и не иметь проблем с производительностью. –

+0

Спасибо Майку. Теперь это имеет смысл и ясно все. Из того, что вы сказали, а также Jetti, проверка внутри собственности не является хорошей идеей. – Joseph

2

Почему бы не использовать исключение, чтобы зафиксировать условие ошибки.

private string firstName, lastName; 
    public string Name 
    { 
     get { return string.Concat(firstName, " ", lastName); } 
     set 
     { 
      string name = value; 
      if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException("Name"); } 

      var nameParts = name.Trim().Split(' '); 
      if (nameParts.Length != 2) { throw new ArgumentException("Invalid name value"); } 

      firstName = nameParts[0]; 
      lastName = nameParts[1]; 
     } 
    } 
Смежные вопросы