Skip to Content

Мокирование в приложениях web mvc

Другие статьи по юнит-тестированию:

Проекты с примерами из статьи:

Зачем нужны моки
Юнит-тестирование класса, работа которого не зависит от поведения других классов — несложная задача. Мы можем написать что-то вроде:

assertEquals(4, calculator.add(2, 2));

Но приложение web mvc, как правило, состоит из нескольких независимых слоев:
Архитектура MVC-приложения

Читать далее

Коллекции в .NET

Коллекции – структуры данных для работы с наборами однотипных объектов.

Когда решается, какую именно структуру использовать для хранения или передачи коллекции, стоит подумать о следующем:

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

Читать далее

AbstractCalendar.JS. Когда нужно больше, чем Datepicker

В некоторых проектах возникает необходимость разработать календарь с необычным функционалом или дизайном. Чтобы сделать это, можно использовать готовые компоненты (например, jQuery UI Datepicker), либо писать код календаря с нуля. Для упрощения такой задачи можно использовать утилиту AbstractCalendar.JS.

Читать далее

Что такое Elm? Часть 2 — архитектура

elm

Архитектура Elm

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

При создании фронт-энд приложений в Elm, мы используем паттерн, называемый Elm-архитектурой. Этот паттерн предоставляет способ создания изолированных компонентов, которые могут переиспользоваться, комбинироваться и компоноваться бесконечным множеством способов.

Elm предоставляет для этого модуль Html.App. Для более легкого понимания, напишем небольшое приложение.

Читать далее

Ускорение приложений Angular с помощью ручной генерации HTML-кода

angularjs_logo-svg

Другие статьи по AngularJS:

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

Существует не совсем изящный, но действенный (и иногда единственный) способ ускорения отрисовки интерфейса в таких ситуациях. Это переписывание подобных блоков с использованием ручного построения DOM.

Этот способ не всегда одинаково хорошо ускоряет отрисовку. Его эффективность зависит от особенностей шаблона, который отрисовывается с задержками. В этой статье описано, в каких случаях этот способ даёт наилучшие результаты, а также, какие у него есть альтернативы (например, использование шаблонизатора jQote2), и приведено сравнительное время отрисовки вёрстки разными способами на различных примерах.

Читать далее

Что такое Elm? Часть 1 — основы

Elm — это функциональный язык, компилируемый в JavaScript. Данная статья является кратким введением в Elm, она поможет быстро вникнуть в суть и начать писать код на Elm. Ключевыми фичами языка являются:

  • Отсутствие ошибок в рантайме. В отличие от JavaScript, код, написанный на Elm, не выдает рантайм ошибок. Elm использует выведение типов для обнаружения проблем во время компиляции и выдает дружелюбные подсказки. Таким образом, ошибки никогда не доходят до конечного пользователя. В NoRedInk написано 36 тысяч строк на Elm, и за год промышленной эксплуатации код ни разу не упал в рантайме.
  • Высокая производительность. Elm использует собственную реализацию виртуальной DOM, ориентированную на простоту и скорость. Все значения в Elm иммутабельны, и бенчмарки показывают, что это выгодно сказывается на генерации действительно быстрого JavaScript кода:

Читать далее

Заметки по ускорению Angular-приложений

angularjs_logo-svg

Другие статьи по AngularJS:

AngularJS — один из популярных JS-фреймворков. В его основе — шаблонизация и 2-way data binding. В Angular-приложениях поддерживается модульность, из коробки работает клиентский роутинг.

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

Существует множество способов оптимизации приложений Angular. Здесь я попробую перечислить самые популярные их этих способов и сравнить их.

Читать далее

Как быстро построить круговую диаграмму на CSS и JavaScript

Для front-end разработчика существует огромное количество способов, которыми можно построить круговую диаграмму —  разнообразные библиотеки, плагины, потрясающие возможности SVG графики и т.д. Однако стоит, пожалуй, рассмотреть и самый простой способ создания «пирожкового» чарта, который может быть полезен, когда задача поставлена максимально просто и нет необходимости или возможности использовать дополнительные инструменты. Далее речь пойдёт о примере такой реализации.

Читать далее

Логирование запросов Mondrian (в том числе в JasperServer)

Логирование запросов в Mondrian

Mondrian преобразует MDX-запросы в SQL. Если во время отладки стоит целью проверить правильно ли строится запрос, то самым быстрым решением будет включить логирование MDX- и SQL- запросов в самом mondrian.

Читать далее

Проксирование вызовов функций без побочных эффектов в JavaScript

Иногда требуется изменить поведение библиотечного объекта. К примеру, мы хотим, чтобы даты, которые мы получаем с сервера в формате ISO, выводились в интерфейсе в определенном формате. Хорошей идеей будет инкапсулировать эту логику, чтобы каждый раз не заглядывать в таблицу форматов и не писать moment().format('DD.MM.YYYY'). Во первых, тут правильно будет включить локаль moment.locale('ru') , но даже в этом случае нужно будет писать moment().format('L'). Естественно, форматов вывода в проекте будет много. Мне не нравится так называемый паттерн «хелпер», потому что он рано или поздно превратится в свалку всего и вся с кучей зависимостей. Мы сделаем обертку, но не простую, а в точности повторяющую API moment.js и добавляющую в него свои фишки. Делается это просто:  (надеюсь, вы используете underscore?)

App.moment = _.wrap(moment, function (moment) {
    var internalMoment = moment.apply(window, _.toArray(arguments).slice(1));
    internalMoment.formatLocal = _.partial(internalMoment.format, 'L');
    return internalMoment;
});

Вуаля. Теперь можно делать так:

var formatted = App.moment('2005-08-09T18:31:42').formatLocal();
console.log(formatted); // 09.08.2005

Как это работает

Сам moment является фабричным методом, который создает объект даты (но не типа Date, а собственный). Метод _.wrap создает новую функцию, в которой первым аргументом является оборачиваемая функция. Это позволяет нам писать код либо до, либо после ее собственного вызова. Таким образом сначала создается нормальный объект moment, а потом он расширяется. _.toArray(arguments).slice(1)  нужно для того, чтобы пользователь мог работать с методом, как если бы он работал с ним без обертки, мы просто выкидываем лишний аргумент, а остальные передаются моменту. Кстати, о методе _.partial. В нашем примере он создает новый метод formatLocale, замыкая в нем параметр ‘L’ и вызывая стандартный метод format. То есть, вызов App.moment().formatLocal()  эквивалентен moment().format(‘L’. Это называется частичное применение.