Чрезмерная проверка нуля в MVC Views - PullRequest
3 голосов
/ 17 сентября 2010

Это вопрос стиля и дизайна, а не синтаксиса.

У меня есть доменные модели, которые имеют несколько (из-за отсутствия лучшего термина) навигационных свойств.Так что в моем строго типизированном подробном представлении Foo, которое имеет свойство типа Bar I , может сделать следующее:

<%: Foo.Bar.Name %>

Однако иногда Bar имеет значение Null, поэтому яв итоге получится что-то вроде:

<%: Foo.Bar == null ? String.Empty : Foo.Bar.Name %>

В других случаях, потому что удобство навигационных свойств I может сделать еще больше цепочки.Недостатком, однако, является введение большего количества нулевой проверки в моем View.

В качестве альтернативы, я мог бы выполнить всю нулевую проверку в ViewModel, чтобы я выдал что-то «чистое» для View.,Я ищу некоторые идеи или руководящие принципы здравого смысла, чтобы избежать чрезмерной проверки нуля в моих представлениях.

PS Я использую ASP.NET MVC, но я думаю, что этот вопрос может быть актуален для других MVCрамки.

Ответы [ 6 ]

3 голосов
/ 17 сентября 2010

Вы уже ответили на это сами:

В качестве альтернативы, я мог бы выполнить всю проверку нуля в ViewModel, чтобы я выдал что-то "чистое" в View.

Вот и все, используйте ViewModel.

1 голос
/ 17 сентября 2010

Не уверен, имеет ли это смысл в вашем контексте, но когда вас беспокоит избыток нулевых проверок, вы должны рассмотреть шаблон Null Object .

0 голосов
/ 18 сентября 2010

Сначала рассмотрим, является ли в вашей модели экземпляр Foo допустимым, если Bar равен нулю. Если нет, тогда вы должны поместить выражение guard в конструктор и \ или установщик свойства Bar.

public class Foo{

        public BarClass _bar;

        public BarClass Bar{
            get{return _bar; }
            set{
                if(value == null)
                   throw new ArgumentNullException();
                _bar = value; } 
            } 

           public Foo(BarClass bar){
              if(bar == null) throw new ArgumentNullException();
              _bar = bar;
          } 
        }

Во-вторых, слишком много повторяющихся нулевых проверок - это запах кода. Вы должны использовать рефакторинг Заменить условное на полиморфизм . Вы можете создать нулевой объект в соответствии с Null Object Pattern . Затем убедитесь, что свойство Bar всегда инициализируется с помощью NullBar.

public class Foo{

    public BarClass _bar;

    public BarClass Bar{
        get{return _bar ?? new NullBar(); }
        set{ _bar = value ?? new NullBar(); } 
    } 

       public Foo(){
          Bar = new NullBar(); // initialization
       } 
    }

Тогда Bar никогда не будет нулевым.

0 голосов
/ 17 сентября 2010

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

public class Foo
{
    private Bar _bar;

    public Bar Bar
    {
        get
        {
            if (_bar == null)
            {
                _bar = new Bar();
            }
            return _bar;
        }
    }
}

public class Bar
{
    public string Name { get; set; }
}
0 голосов
/ 17 сентября 2010

Один из вариантов - использование помощника, как описано здесь .

0 голосов
/ 17 сентября 2010

Создайте помощника, который проверяет наличие нуля и возвращает соответствующее значение по умолчанию.

Например, если у вас есть поле номера телефона, вы передаете ему поле и постоянный ТЕЛЕФОН. Помощник проверяет, имеет ли значение NULL, и отображает «Нет номера телефона», если он имеет значение NULL.

Таким образом, вы храните все свои нулевые проверки в одном месте.

...