Перечисляя новые статьи, чьи публикации дата начала прошло


(cn.PublishEnd == null || cn.PublishEnd < DateTime.Now)

против

(cn.PublishEnd ?? DateTime.MinValue < DateTime.Now)

Что легче читается? Я склоняюсь ко второй форме, но что-то подсказывает мне, что я неправ.

Контекст:

namespace Damnation.Website.Main.Business.Extensions
{
    public static class CommunityNews
    {
        public static IEnumerable<DAL.CommunityNews> Published(this ObjectSet<DAL.CommunityNews> table)
        {
            return table.Where(cn => cn.PublishStart > DateTime.Now && DateTime.Now > (cn.PublishEnd ?? DateTime.MinValue)).OrderByDescending(cn => cn.PublishStart);
        }
    }
}

Типы

DateTime PublishStart
DateTime? PublishEnd


361
6
задан 21 августа 2011 в 03:08 Источник Поделиться
Комментарии
3 ответа

В условном, это будет в значительной степени зависеть от типа объекта. В общем, я бы пользу первой формы, особенно если это не-string ссылочный тип, который не предлагает хорошее значение по умолчанию. В противном случае это была строка или nullable структура, я бы предпочел второе.

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

В данном случае, это значение null (типа datetime? видимо) так что было бы чистейшим ИМХО, используя второй.

3
ответ дан 21 августа 2011 в 04:08 Источник Поделиться

Как по мне, первая форма является более читабельным, потому что он четко описать состояние. Это легко читать и понимать. Вторая форма-это немного сбивает с толку. Первой мыслью было: что типа datetime.Ноль? Это значение по умолчанию для PublishEnd? Если да, то почему бы не использовать тип datetime.Параметр minvalue? Может быть, это не значение по умолчанию, и я ошибусь где-то? Конечно, эти мысли заняли всего несколько секунд, но тем не менее.
В общем я думаю, что ?? следует использовать для возврата значения по умолчанию с ожидаемым типом. Значение по умолчанию PublishEnd должно быть типа datetime. Но вторая форма искажает смысл ?? и возвращает bool, а не тип, и это сбивает с толку.

Отредактированы:
Если вы хотите, чтобы прочитать это, как вы сказали: "если сейчас превышает (дата окончания или сроки)"
затем вы должны написать его как:

(DateTime.Now > cn.PublishEnd ?? DateTime.MinValue)

И эта, третья форма лучше, чем первый и второй.

3
ответ дан 21 августа 2011 в 06:08 Источник Поделиться

Обычно я решаю подобные проблемы с введением DateTimeRange класс, который имеет метод содержит(дата типа datetime).

В вашем случае я бы переписал условный оператор и положил его в класс CommunityNews

public class CommunityNews
{
public bool IsPublished(DateTime checkingDate)
{
if (this.PublishStart <= checkingDate)
{
return false;
}

return this.PublishEnd.HasValue
? checkingDate < this.PublishEnd.Value
: true;
}
}

Тогда ваш метод поиска станет максимально ясно:

    public static IEnumerable<DAL.CommunityNews> Published(this ObjectSet<DAL.CommunityNews> table)
{
return table.Where(cn => cn.IsPublished(DateTime.Now)).OrderByDescending(cn => cn.PublishStart);
}

P. S. В общем, я хотел бы рассмотреть, используя спицы.PublishEnd ?? Датавремя.Параметр minvalue < Датавремя.Теперь в проверить заявление как плохая практика, потому что ко мне ?? больше о возвращении, а не о проверке.

0
ответ дан 22 августа 2011 в 06:08 Источник Поделиться