Действительно ли Шаблон Спецификации является устаревшим, когда можно использовать Динамический LINQ?

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

я осмотрел исходный код SpiderMonkey , чтобы видеть, как Дата была реализована. Я думаю, что все это сводится к следующим немногим строкам:

static JSBool
Date(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
    jsdouble *date;
    JSString *str;
    jsdouble d;

    /* Date called as function. */
    if (!(cx->fp->flags & JSFRAME_CONSTRUCTING)) {
        int64 us, ms, us2ms;
        jsdouble msec_time;

        /* NSPR 2.0 docs say 'We do not support PRMJ_NowMS and PRMJ_NowS',
         * so compute ms from PRMJ_Now.
         */
        us = PRMJ_Now();
        JSLL_UI2L(us2ms, PRMJ_USEC_PER_MSEC);
        JSLL_DIV(ms, us, us2ms);
        JSLL_L2D(msec_time, ms);

        return date_format(cx, msec_time, FORMATSPEC_FULL, rval);
    }

    /* Date called as constructor. */
    // ... (from here on it checks the arg count to decide how to create the date)

, Когда Дата используется в качестве функции (или как Date() или Date.prototype.constructor(), которые являются точно тем же самым), оно принимает значение по умолчанию к возврату текущего времени как строка в формате локали. Это независимо от любых аргументов, которые передаются в:

alert(Date()); // Returns "Thu Oct 09 2008 23:15:54 ..."
alert(typeof Date()); // Returns "string"

alert(Date(42)); // Same thing, "Thu Oct 09 2008 23:15:54 ..."
alert(Date(2008, 10, 10)); // Ditto
alert(Date(null)); // Just doesn't care

я не думаю, что существует что-либо, что может быть сделано на уровне JS для хитрости этого. И это - вероятно, конец моего преследования в этой теме.

я также заметил что-то интересное:

    /* Set the value of the Date.prototype date to NaN */
    proto_date = date_constructor(cx, proto);
    if (!proto_date)
        return NULL;
    *proto_date = *cx->runtime->jsNaN;

Date.prototype экземпляр Даты с внутренним значением NaN и поэтому,

alert(Date.prototype); // Always returns "Invalid Date"
                       // on Firefox, Opera, Safari, Chrome
                       // but not Internet Explorer

, IE не разочаровывает нас. Это делает вещи немного по-другому и вероятно устанавливает внутреннее значение к -1 так, чтобы Date.prototype всегда возвращал дату немного перед эпохой.

Обновление

я наконец вырыл в сам ECMA-262, и оказывается, чего я пытаюсь достигнуть (с объектом Даты), - по определению - не возможен:

15.9.2 Конструктор Date, Названный как Функция

, Когда Дату называют как функция, а не как конструктор, она возвращает строку, представляющую текущее время (UTC).

ПРИМЕЧАНИЕ вызов функции Date(…) не эквивалентен выражению new Date(…) создания объекта с теми же аргументами.

15.9.2.1 Даты ([год [месяц [дата [часы [минуты [секунды [мс]]]]]]])

Все аргументы являются дополнительными; любые предоставленные аргументы приняты, но полностью проигнорированы. Строка создается и возвращается как будто по выражению (new Date()).toString().

7
задан David Robbins 21 September 2009 в 11:52
поделиться

3 ответа

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

Или вы можете проверить мой блог .

2
ответ дан 6 December 2019 в 21:17
поделиться

Я разработчик C # и люблю использовать шаблон спецификации, потому что он ближе к моей сфере деятельности. Более того, вас не удивит этот шаблон, если класс спецификации существует, он должен работать. С Linq ваш базовый провайдер, возможно, не реализовал некоторые функции, и вы не узнаете об этом до времени выполнения.

Но, безусловно, самое большое преимущество спецификации перед linq - это быть ближе к бизнесу, это мини-DSL. LINQ для меня - это DSL для запроса сбора, а не для бизнес-домена.

6
ответ дан 6 December 2019 в 21:17
поделиться

На самом деле я не знаю LINQ, но мне кажется, что система декларативных запросов в целом связана с шаблоном спецификации. В частности, реализация системы декларативных запросов путем объединения объектов в объектно-ориентированную среду. IIRC, который сродни тому, что делает LINQ, предоставляя слой синтаксического сахара.

Я не могу сказать, полностью ли LINQ устарел шаблон. Может быть, есть крайние случаи, которые просто невозможно выразить в LINQ?

1
ответ дан 6 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: