|
9 | 9 | сравниваем вывод, смотрим код `framework.js` и `application.js`, понимаем
|
10 | 10 | как работает обертка вокруг setTimeout
|
11 | 11 |
|
12 |
| -## Задания |
| 12 | +## Задание |
| 13 | + |
| 14 | +1. Нужно изучить, как обернут таймер. |
| 15 | +По аналогии с оберткой таймера нужно сделать обертку вокруг модуля fs. |
| 16 | +Все его функции нужно пройти в цикле `for (var key in fs) { ... }` и заменить |
| 17 | +на свою функцию. При помощи замыкания эта функция должна стать универсальной |
| 18 | +прослойкой для всех функций библиотеки fs. Смысл обертки - логировать все |
| 19 | +вызовы к файловой системе в файл, с указанием времени, имени функции, ее |
| 20 | +аргументов, а если функция имеет еще и callback, то нужно перехватывать и его, |
| 21 | +тоже логируя в файл момент, вызова callback. Это задание можно разбить на |
| 22 | +несколько шагов. |
| 23 | + |
| 24 | +2. Удаляем из `application.js` вызов таймера и оставляем там только код: |
| 25 | +```JavaScript |
| 26 | +var fileName = './README.md'; |
| 27 | +console.log('Application going to read ' + fileName); |
| 28 | +fs.readFile(fileName, function(err, src) { |
| 29 | + console.log('File ' + fileName + ' size ' + src.length); |
| 30 | +}); |
| 31 | +``` |
| 32 | +Это пример работы с файлом. И мы будем изменять поведение этого кода. |
| 33 | +Убираем из `framework.js` обертку таймера и пробрасываем `fs` в приложение. |
| 34 | +Теперь запускаем `node framework` и убеждаемся, что файл считывается и |
| 35 | +выводится его длина. |
| 36 | + |
| 37 | +3. Теперь пишем функцию `cloneInterface(interfaceName)` для копирования всех |
| 38 | +ключей из библиотеки `fs` в новый интерфейс и передаем в песочницу не исходный |
| 39 | +`fs`, а склонированный. Пример функции клонирования: |
| 40 | +```JavaScript |
| 41 | +function cloneInterface(anInterface) { |
| 42 | + var clone = {}; |
| 43 | + for (var key in anInterface) { |
| 44 | + clone[key] = anInterface[key]; |
| 45 | + } |
| 46 | + return clone; |
| 47 | +} |
| 48 | +``` |
| 49 | + |
| 50 | +4. Пишем функцию `wrapFunction(fnName, fn)` которая оборачивает функцию `fn` и |
| 51 | +возвращает функцию-замыкание от `wrapper`. Замыкание, это ссылка на копию |
| 52 | +функции `wrapper`, которая замкнута на контекст `wrapFunction`. Таким образом |
| 53 | +мы применяем функциональное наследование и порождаем такой вариант `wrapper`, |
| 54 | +который видит параметры `fnName` и 'fn' от `wrapFunction`. Мы полностью |
| 55 | +передаем все аргументы в функцию fn. |
| 56 | +```JavaScript |
| 57 | +function wrapFunction(fnName, fn) { |
| 58 | + return function wrapper() { |
| 59 | + var args = []; |
| 60 | + Array.prototype.push.apply(args, arguments); |
| 61 | + console.log('Call: ' + fnName); |
| 62 | + console.dir(args); |
| 63 | + fn.apply(undefined, args); |
| 64 | + } |
| 65 | +} |
| 66 | +``` |
| 67 | + |
| 68 | +5. Определяем, есть ли среди аргументов `callback`, он всегда последний в |
| 69 | +массиве аргументов и его тип `function`. Если `callback` есть, то вместо него |
| 70 | +передаем свою функцию, которая логирует все аргументы и вызывает настояций |
| 71 | +`callback`. |
| 72 | + |
| 73 | +6. Теперь можно из `application.js` использовать другие функции `fs` и |
| 74 | +убедиться, что все они обернуты. |
| 75 | + |
| 76 | +7. Добавляем таймеры в `application.js` и на таймерах работаем с файлами, а из |
| 77 | +`framework.js` собираем статистику работы с файлами и выводим ее каждые 30 |
| 78 | +секунд. Например, можно соирать несколько из этих параметров |
| 79 | +- количество обращений к функциям, |
| 80 | +- количество колбэков, |
| 81 | +- среднюю скорость завершения функций, |
| 82 | +- среднюю скорость возвращения колбеков, |
| 83 | +- общий объем прочитанных с диска данных, |
| 84 | +- общий объем записанных данных, |
| 85 | +- среднюю скорость чтения и записи, |
| 86 | +и т.д. |
| 87 | + |
| 88 | +Сохраните наработки этой лабораторной работы, они понадобятся для выполнения |
| 89 | +следующих работ, в частности, работы по передаче вызовов в другой процесс и |
| 90 | +другой сервер. Это позволит распределить исполнение приложения. |
0 commit comments