Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 430260d

Browse files
Tasks added and code fixed
1 parent e507251 commit 430260d

File tree

3 files changed

+62
-11
lines changed

3 files changed

+62
-11
lines changed

‎README.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
## Описание
2+
3+
Цель: научиться разделять слои абстракций и декомпозировать смешанный код.
4+
5+
## Файлы
6+
7+
* `badServer.js` - пример плохого стиля программирования, все в одном файле,
8+
в одной функции, слои абстракции идут вперемешку.
9+
* `goodServer.js` - пример более хорошего стиля программирования.
10+
11+
## Запуск
12+
13+
Из командной строки можно запустить `node badServer` и `node goodServer`,
14+
для linux/unix систем, нужно использовать `sudo node badServer` и
15+
`sudo node goodServer` потому, что HTTP сервер открывает `TCP 80` порт,
16+
а для всех портов до `1024` нужно иметь специальные права.
17+
18+
## Задания
19+
20+
Нужно понять, что делает `badServer.js` и почему так писать плохо, потом
21+
посмотреть пример `goodServer.js` и понять, где тут уровни абстракции, почему
22+
такой код проще поддерживать и расширять, что делает его не однородным и в чем
23+
преимущество расслоения и проектирования грамотной структры кода.
24+
25+
Теперь нужно переписать `badServer.js`, выделив минимум 2-3 разных слоя
26+
абстракции кода, разнеся их по функциям, или даже по разным файлам.
27+
28+
Следующие функуциональные блоки просматриваются в этом коде и их нужно
29+
разделить, понизив их сцепление:
30+
31+
1. Слой доступа к данным (в этом примере - работы с файловой системой)
32+
2. Парсинг, сериализация и десериализация
33+
3. Сервер HTTP
34+
3.1. Кеширование ответов
35+
3.2. Работа с Cookie
36+
3.3. Склеивание буффера
37+
3.4. Логирование вызовов
38+
3.5. Маршрутизация обработки запросов
39+
4. Бизнес-логика, относящаяся к предметной области
40+
5. Управление зависимостями
41+
6. Конфигурирование (например, порт и хост)
42+
7. Подстановка переменных в шаблоны
43+
44+
Тут будет полезно декларативно описать задачу в виде структур данных, пример
45+
можно взять из `goodServer.js`.

‎badServer.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@ http.createServer(function (req, res) {
2828

2929
// Routing
3030
if (req.url === '/') {
31-
if (req.method === '')
32-
response.writeHead(200, {
33-
'Set-Cookie': 'mycookie=test',
34-
'Content-Type': 'text/plain'
35-
});
36-
var ip = req.connection.remoteAddress;
37-
res.write('<h1>Welcome</h1>Your IP: ' + ip);
38-
res.end('<pre>' + JSON.stringify(cookies) + '</pre>');
31+
if (req.method === 'GET') {
32+
res.writeHead(200, {
33+
'Set-Cookie': 'mycookie=test',
34+
'Content-Type': 'text/html'
35+
});
36+
var ip = req.connection.remoteAddress;
37+
res.write('<h1>Welcome</h1>Your IP: ' + ip);
38+
res.end('<pre>' + JSON.stringify(cookies) + '</pre>');
39+
}
3940
} else if (req.url === '/person') {
4041
if (req.method === 'GET') {
4142

@@ -58,14 +59,19 @@ http.createServer(function (req, res) {
5859
res.end('Read error');
5960
}
6061
});
62+
6163
} else if (req.method === 'POST') {
6264

6365
// Receiving POST data
6466
var body = [];
65-
request.on('data', function(chunk) {
67+
req.on('data', function(chunk) {
6668
body.push(chunk);
6769
}).on('end', function() {
6870
var data = Buffer.concat(body).toString();
71+
var obj = JSON.parse(data);
72+
if (obj.name) obj.name = obj.name.trim();
73+
data = JSON.stringify(obj);
74+
cache[req.url] = data;
6975
fs.writeFile('./person.json', data, function(err) {
7076
if (!err) {
7177
res.writeHead(200);
@@ -79,7 +85,7 @@ http.createServer(function (req, res) {
7985
}
8086
} else {
8187
res.writeHead(404);
82-
res.end('Path not fount');
88+
res.end('Path not found');
8389
}
8490
}
8591

‎goodServer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var http = require('http');
33
var me = { name: 'jura', age: 22 };
44

55
var routing = {
6-
'/': 'welcome to homepage',
6+
'/': '<h1>welcome to homepage</h1>',
77
'/user': me,
88
'/user/name': function() { return me.name; },
99
'/user/age': function() { return me.age; }

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /