Статьи

Рецензия на книгу: «Создание узловых приложений с MongoDB и Backbone»

В книге Майка Уилсона «О’Рейли» за декабрь 2012 года представлены некоторые методы разработки модных веб-приложений, созданный на основе книги пример приложения для социальных сетей. Помимо представления MongoDB, Backbone и Node, он демонстрирует красоту и замечательную краткость Jade , Require.js и Mongoose . Он демонстрирует хорошие шаблоны для организации вашего кода в приложении существенной сложности, охватывает много вопросов на нескольких страницах и завершает пример необычно полнофункциональным сервером чата, который объединяет все слои стека. У Вильсона есть некоторые опасные привычки, которым читатели не должны подражать, но в целом его книга учит хорошо.

Создание узловых приложений

По необходимости книга часто перемещается между Node и Backbone, моделями и представлениями, HTML и Javascript. Природа веб-разработки заключается в том, что каждая новая функция требует изменений во многих местах, и трудно ориентироваться. Уилсон поддерживает исправленную версию кода каждой главы на Github ; используйте это вместо того, чтобы полностью полагаться на примеры в книге.

Я создал одно большое клиентское Javascript-приложение с Backbone , и я с трудом организовал его. Хотя Backbone является строгим (отсюда и название) в отношении разделения моделей и представлений, вопросы более высокого уровня недостаточно уточнены: как код должен быть разбит на файлы? Чья это ответственность за создание моделей и представлений? Уилсон использует Require.js, чтобы аккуратно разделить код на файлы и объявить зависимости между ними. В своем примере приложения маршрутизатор Backbone отвечает за создание экземпляров всех моделей и представлений. По мере развития книги и роста его примера приложения маршруты, модели и представления остаются сфокусированными и отделенными. Это убедительный дизайн. Я хотел бы знать.

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

С другой стороны, введение Уилсона в MongoDB пропускает некоторые оценки. Это всего 12 страниц, так почему он потратил две из них на MapReduce? MapReduce всегда предназначался для больших пакетных процессов, а не для веб-приложений. В книгах и беседах MongoDB давно подчеркивается MapReduce, который должен быть ограничен нишей. Структура агрегации , с другой стороны, носит универсальный характер и была выпущена за несколько месяцев до книги Уилсона; это должно было быть покрыто вместо этого.

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

app.post('/accounts/:id/contact', function(req,res) {
  var accountId = req.params.id;
  var contactId = req.param('contactId', null);

  models.Account.findById(accountId, function(account) {
    models.Account.findById(contactId, function(contact) {
      models.Account.addContact(account, contact);
      account.save();
    });
  });

  // Note: Not in callback - this endpoint returns immediately and
  // processes in the background
  res.send(200);
});

(Я отредактировал для краткости; весь код находится на GitHub .) Обратите внимание, что если два запроса обновляют одну и ту же учетную запись, обновления первого теряются. $ addToSet решил бы это и был бы более эффективным.

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

Подобная книга, кажется, предназначена для демонстрации лучших практик и шаблонов, которые поощряют правильность. Некоторые из самых сложных шаблонов — обработка ошибок в Node и контроль параллелизма в MongoDB. Хотелось бы, чтобы Уилсон посвятил половину внимания, которое он уделял безопасности этим двум темам.

Но я злюсь только на эти недостатки, потому что книга, которую они испортили, хорошая. По мере того, как Уилсон строит свою архитектуру по частям, шаблоны кажутся одновременно удобными в использовании и элегантными и способными оставаться чистыми по мере роста приложения. Уилсон использует Backbone с именованными событиями, такими как «app: loggedin» или «chat: start», чтобы координировать свой код переднего плана, вместо того, чтобы позволить представлениям напрямую вызывать методы в других представлениях. Начинающий пользователь Backbone может не увидеть огромную ценность разделения видов таким образом, но отнять его у меня — это отличная идея.

Книга заканчивается длинным примером чата. Примеры чата с Socket.io и Node — легион — действительно, обязателен, но полнота этого, включая его интеграцию с Backbone, является действующей силой. Если вы планируете использовать Node или Backbone, в этой книге содержатся отличные рекомендации по структурированию большого приложения, и даже если вы не строите ни с одной из платформ, описанных Уилсоном, его примеры могут вдохновить вас на написание более сжатого и разобщенного кода.