Современный Дизайн C++ Универсальные шаблоны программирования и Шаблоны разработки, Прикладные [закрытый]

Примеры имеют очень разные результаты.

Перед рассмотрением различий следует отметить следующее:

  • Прототип конструктора обеспечивает способ совместного использования методов и значений между экземплярами через личное свойство [[Prototype]] экземпляра.
  • Функция функции задана тем, как функция вызывается или с помощью bind (не обсуждается здесь). Если функция вызывается для объекта (например, myObj.method()), то этот внутри метода ссылается на объект. Где этот не задан вызовом или с помощью bind , он по умолчанию ссылается на глобальный объект (окно в браузере) или в строгом режиме, остается неопределенным.
  • JavaScript - это объектно-ориентированный язык, то есть все объекты, включая функции.

Итак, вот фрагменты, о которых идет речь:

var A = function () {
    this.x = function () {
        //do something
    };
};

В этом случае переменной A присваивается значение, которое является ссылкой на функцию. Когда эта функция вызывается с помощью A(), функция этой функции не задается вызовом, поэтому по умолчанию используется глобальный объект, и выражение this.x эффективно window.x. В результате ссылка на выражение функции с правой стороны назначается window.x.

В случае:

var A = function () { };
A.prototype.x = function () {
    //do something
};

происходит нечто совсем другое. В первой строке переменной A присваивается ссылка на функцию. В JavaScript все объекты функций имеют свойство prototype по умолчанию, поэтому нет никакого отдельного кода для создания объекта A.prototype .

Во втором line, A.prototype.x назначается ссылка на функцию. Это создаст свойство x , если оно не существует, или назначьте новое значение, если это произойдет. Таким образом, разница с первым примером заключается в том, какое свойство объекта x участвует в выражении.

Другой пример приведен ниже. Это похоже на первое (и может быть то, о чем вы хотели спросить):

var A = new function () {
    this.x = function () {
        //do something
    };
};

В этом примере оператор new был добавлен перед выражением функции, чтобы вызвать функцию как конструктор. При вызове с new функция этой функции установлена ​​для ссылки на новый объект, чье личное свойство [[Prototype]] установлено для ссылки на общедоступный прототип конструктора . Поэтому в операторе присваивания свойство x будет создано на этом новом объекте. Когда вызывается как конструктор, функция по умолчанию возвращает свой этот объект , поэтому нет необходимости в отдельном заявлении return this;.

Чтобы проверить, что A имеет свойство x :

console.log(A.x) // function () {
                 //   //do something
                 // };

Это необычное использование new , так как единственный способ ссылки на конструктор - через A.constructor . Это было бы гораздо чаще:

var A = function () {
    this.x = function () {
        //do something
    };
};
var a = new A();

Другой способ достижения аналогичного результата - использовать сразу вызываемое выражение функции:

var A = (function () {
    this.x = function () {
        //do something
    };
}());

В этом случае A присвоено возвращаемое значение вызова функции с правой стороны. Здесь опять же, поскольку этот не задан в вызове, он будет ссылаться на глобальный объект, а this.x - эффективно window.x. Поскольку функция ничего не возвращает, A будет иметь значение undefined.

Эти различия между этими двумя подходами также проявляются, если вы сериализуете и де-сериализуете свои объекты Javascript в / от JSON. Методы, определенные на прототипе объекта, не сериализуются при сериализации объекта, что может быть удобно, если, например, вы хотите сериализовать только части данных объекта, но не его методы:

var A = function () { 
    this.objectsOwnProperties = "are serialized";
};
A.prototype.prototypeProperties = "are NOT serialized";
var instance = new A();
console.log(instance.prototypeProperties); // "are NOT serialized"
console.log(JSON.stringify(instance)); 
// {"objectsOwnProperties":"are serialized"} 

Связанные Вопросы:

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

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

18
задан GEOCHET 17 March 2009 в 22:16
поделиться

8 ответов

За пределами стандартного шаблонного использования операции я нахожу самыми полезными об информации, говорил об универсальном программировании на C++, способность использовать шаблоны для создания ошибок времени компиляции для недопустимых сценариев кода. Как только Вы приобретаете навык его, можно стать очень эффективными при превращении класса того, что было бы ошибкой во время выполнения в ошибку времени компиляции.

я имел большой успех, делающий это на работе. Уверенный это создает абсолютно нечитабельные сообщения, и мои коллеги иногда заходят и говорят, "что в мире это?". Но каждый раз это была ошибка, и они не смогли скомпилировать его. Я также в большой степени комментирую конкретные ошибки в надежде, что это умеренно понятно.

23
ответ дан 30 November 2019 в 02:39
поделиться

Приблизительно в 2005 я добрался в большой степени в шаблоны выражения и различные приемы времени компиляции для того, чтобы сделать библиотеки, которые были очень выразительны для использования, как внутренние проблемно-ориентированные языки, встроенные в C++. В особенности довольно полная встроенная вещь SQL, подобная тому, что с тех пор вышло как Linq на.NET.

Для пользователей, это прекрасно. Но для кого-либо еще кроме меня пытающийся поддержать это, это представило в широком масштабе крутую кривую обучения. Таким образом, это - проблема с ним; как любая "умная" техника, это уменьшает объединение людей, которые могут поддержать его.

Это хорошо для широко используемых библиотек классов, из которых обычные пользователи никогда не должны понимать кишки. Но для "в доме" библиотеки, принадлежавшие определенной команде, они, вероятно, вся потребность быть в состоянии исправить его или расширить его разумно. Более тайные возможности шаблонов C++, кажется, устраняют это, по моему опыту.

Это была большая забава все же.

15
ответ дан 30 November 2019 в 02:39
поделиться

Если Ваша Компания/Проект позволяет повышение. Эта книга поможет, Вы для раскрытия некоторого волшебства повышения только для Вас владеете удовлетворенностью.

, Если Вы Компания/Проект не позволяете повышение. Эта книга будет хорошим руководством для воссоздания некоторых частей повышения, в которых Вы нуждаетесь больше всего как повышение:: функция.

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

И больше всего эта книга покажет, как можно заново продумать некоторые шаблоны разработки GOF, изменяющие полиморфизм во время выполнения с помехами.

6
ответ дан 30 November 2019 в 02:39
поделиться
  • , Что я использую непосредственно из книги? Ничто - я не использую Loki или Повышение.
  • это влияло на мой код? Едва ли - я был знаком с понятием политик, прежде чем я читал, книга
  • - оно стоящий чтения? Определенно!
3
ответ дан 30 November 2019 в 02:39
поделиться

По моему скромному мнению, читая (и понимание!) первая глава книги полезна (я полагаю, что это даже доступно онлайн бесплатно). Остальная часть книги в значительной степени описывает внутренности библиотеки Loki, и я действительно не рекомендую это.

1
ответ дан 30 November 2019 в 02:39
поделиться

Я не имею, используют Loki, но я активно использовал повышение на своей предыдущей работе. Повышение реализовало много идей из этой хорошей книги;

Вещи из этой книги не предназначаются для использования в Бизнес-логике, они должны быть реализованы в библиотеках (Повышение, Loki, что-то собственное), и библиотеки использовали в Бизнес-логике. Это - другая вещь, "использующий это обманывает в коде", или "реализация разделила библиотеку с использованием этого приема и пользованием красивыми библиотеками в большей части Вашего кода (например, повышение:: свяжите - ужасная реализация, но хороший в использовании - но Вы почти никогда не видите эту реализацию)"

Также эта книга демонстрирует мощное метапрограммирование C++ и хорошее обучение мозгу.

0
ответ дан 30 November 2019 в 02:39
поделиться

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

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

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

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

2
ответ дан 30 November 2019 в 02:39
поделиться

Я действительно испытывал некоторые грубые реакции от людей, когда я заявил материал использования от современного дизайна C++. Во-первых, комментирует WTF. Это сопровождалось, 'не пытаются быть слишком умными' комментариями. Затем лучшее понимание идей. И затем, наконец, принятие идей до такой степени, когда они - часть общего словаря.

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

0
ответ дан 30 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

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