Что лучше дизайн / практика: свойство Nullable или 1 свойство value и 1 bool "has" свойство? - PullRequest
6 голосов
/ 13 сентября 2010

Я работаю над приложением ASP.NET MVC, проектирую модели предметной области, использую (тестирую) новую функцию EF Code First.

У меня есть объект Activity, который может иметь или не иметь Deadline, как лучше всего подойти к нему?

1 свойство:

public DateTime?  Deadline {get; set;}
and check vs null before using

или

2 свойства:

public DateTime Deadline {get; set;}
public bool HasDeadline  {get; set;}

Сначала яЯ подумал о первом варианте, но потом я начал думать, что, возможно, второй вариант будет лучше в отношении БД ...

Есть ли лучший метод в этом отношении?

Ответы [ 5 ]

10 голосов
/ 13 сентября 2010

Я бы пошел с первым вариантом. В конце концов, это точно инкапсулированная форма второго.

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

Что касается базы данных, я бы ожидал, что первая форма будет такой же простой ... предположительно, у вас в базе данных будет пустое поле DATETIME, не так ли? Он должен отображаться напрямую.

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

Как насчет сочетания того и другого только для того, чтобы сделать ваш код более читабельным?

public DateTime? Dealine{get; set;}
public bool HasDeadline
{
    get
    {
        return (Deadline != null);
    }
}

Его легко читать и он делает то же самое, что и потребитель в любом случае.Кроме того ...

if(HasDeadline)
    doStuff();

легче читать, чем

if(Dealine != null)
    doStuff();

:)

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

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

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

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

База данных используется для хранения значений NULL - сохранения значения Min в базе данных, а затем наличия флага, указывающего, следует ли доверять этому значению, усложняет запросы.

Мне нравятся обнуляемые типы, поскольку они отражают намерение домена - нет даты, а не «нет даты, поэтому притворяться, что первое января 1970 года означает отсутствие даты».

Существует также дополнительная нагрузка на поддержание значения HasDealine - его необходимо устанавливать каждый раз, когда обновляется соответствующее свойство. И как ты это очищаешь? Если вы установите дату окончания срока, он установит для HasDeadline значение true. Как мне «сбросить» это? Вы бы присвоили HasDeadline значение false, но оставили бы поле Deadline без изменений с предыдущим значением?

В целом неприглядно.

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

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

Также одним из вариантов является использование одного свойства, но вместо того, чтобы сделать его обнуляемым, вы можете вернуть Нулевой объект (также известный как Специальный случай ).

...