Skip to content

Commit f74c273

Browse files
committed
Updated interface wrapper code and tasks added
1 parent f1eb470 commit f74c273

File tree

4 files changed

+88
-1
lines changed

4 files changed

+88
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
node_modules
2+
crlf.js
23
*.log

interfaceWrapper/ru/README.md

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,82 @@
99
сравниваем вывод, смотрим код `framework.js` и `application.js`, понимаем
1010
как работает обертка вокруг setTimeout
1111

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+
другой сервер. Это позволит распределить исполнение приложения.

interfaceWrapper/ru/application.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,10 @@ function timerEvent() {
88

99
// Устанавливаем функцию на таймер
1010
setTimeout(timerEvent, 1000);
11+
12+
// Пример использования fs API
13+
var fileName = './README.md';
14+
console.log('Application going to read ' + fileName);
15+
fs.readFile(fileName, function(err, src) {
16+
console.log('File ' + fileName + ' size ' + src.length);
17+
});

interfaceWrapper/ru/framework.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var fs = require('fs'),
77
var context = {
88
module: {},
99
console: console,
10+
fs: fs,
1011
// Оборачиваем функцию setTimeout в песочнице
1112
setTimeout: function(callback, timeout) {
1213
// Добавляем поведение при вызове setTimeout

0 commit comments

Comments
 (0)