8000 Show implementation problems and renumber examples · HowProgrammingWorks/Transaction@4db9f6e · GitHub
[go: up one dir, main page]

Skip to content

Commit 4db9f6e

Browse files
committed
Show implementation problems and renumber examples
1 parent d108ebb commit 4db9f6e

File tree

3 files changed

+87
-90
lines changed

3 files changed

+87
-90
lines changed

JavaScript/3-problems.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
'use strict';
2+
3+
function Transaction() {}
4+
5+
Transaction.start = (data) => {
6+
console.log('\nstart transaction');
7+
let delta = {};
8+
9+
const methods = {
10+
commit: () => {
11+
console.log('\ncommit transaction');
12+
Object.assign(data, delta);
13+
delta = {};
14+
},
15+
rollback: () => {
16+
console.log('\nrollback transaction');
17+
delta = {};
18+
}
19+
};
20+
21+
return new Proxy(data, {
22+
get(target, key) {
23+
if (methods.hasOwnProperty(key)) return methods[key];
24+
if (delta.hasOwnProperty(key)) return delta[key];
25+
return target[key];
26+
},
27+
set(target, key, val) {
28+
console.log('set', key, val);
29+
if (target[key] === val) delete delta[key];
30+
else delta[key] = val;
31+
return true;
32+
}
33+
});
34+
};
35+
36+
// Usage
37+
38+
const data = { name: 'Marcus Aurelius', born: 121 };
39+
40+
const transaction = Transaction.start(data);
41+
console.log('data', JSON.stringify(data));
42+
console.log('transaction', JSON.stringify(transaction));
43+
44+
transaction.name = 'Mao Zedong';
45+
transaction.born = 1893;
46+
transaction.city = 'Shaoshan';
47+
48+
console.log('\noutput with JSON.stringify:');
49+
console.log('data', JSON.stringify(data));
50+
console.log('transaction', JSON.stringify(transaction));
51+
52+
console.log('\noutput with console.dir:');
53+
console.dir({ transaction });
54+
55+
console.log('\noutput with for-in:');
56+
for (const key in transaction) {
57+
console.log(key, transaction[key]);
58+
}
59+
60+
transaction.commit();
61+
console.log('data', JSON.stringify(data));
62+
console.log('transaction', JSON.stringify(transaction));

JavaScript/4-delta.js

Lines changed: 0 additions & 73 deletions
This file was deleted.

JavaScript/3-descriptor.js renamed to JavaScript/4-descriptor.js

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
function Transaction() {}
44

55
Transaction.start = (data) => {
6-
console.log('start transaction');
6+
console.log('\nstart transaction');
77
let delta = {};
88

99
const methods = {
1010
commit: () => {
11-
console.log('commit transaction');
11+
console.log('\ncommit transaction');
1212
Object.assign(data, delta);
1313
delta = {};
1414
},
1515
rollback: () => {
16-
console.log('rollback transaction');
16+
console.log('\nrollback transaction');
1717
delta = {};
1818
}
1919
};
@@ -24,11 +24,14 @@ Transaction.start = (data) => {
2424
if (delta.hasOwnProperty(key)) return delta[key];
2525
return target[key];
2626
},
27+
28+
// Added handler
2729
getOwnPropertyDescriptor: (target, key) => (
2830
Object.getOwnPropertyDescriptor(
2931
delta.hasOwnProperty(key) ? delta : target, key
3032
)
3133
),
34+
3235
set(target, key, val) {
3336
console.log('set', key, val);
3437
if (target[key] === val) delete delta[key];
@@ -40,25 +43,30 @@ Transaction.start = (data) => {
4043

4144
// Usage
4245

43-
const data = { name: 'Marcus Aurelius', city: 'Rome', born: 121 };
46+
const data = { name: 'Marcus Aurelius', born: 121 };
4447

4548
const transaction = Transaction.start(data);
46-
console.log(JSON.stringify(data), JSON.stringify(transaction));
47-
console.dir({ data, transaction });
49+
console.log('data', JSON.stringify(data));
50+
console.log('transaction', JSON.stringify(transaction));
4851

4952
transaction.name = 'Mao Zedong';
5053
transaction.born = 1893;
51-
console.log('JSON:', JSON.stringify(data), JSON.stringify(transaction));
52-
console.dir({ data, transaction });
54+
transaction.city = 'Shaoshan';
5355

54-
transaction.commit();
55-
console.log('JSON:', JSON.stringify(data), JSON.stringify(transaction));
56-
console.dir({ data, transaction });
56+
console.log('\noutput with JSON.stringify:');
57+
console.log('data', JSON.stringify(data));
58+
console.log('transaction *', JSON.stringify(transaction));
5759

58-
transaction.city = 'Shaoshan';
59-
console.log('JSON:', JSON.stringify(data), JSON.stringify(transaction));
60-
console.dir({ data, transaction });
60+
console.log('\noutput with console.dir *:');
61+
console.dir({ transaction });
62+
63+
console.log('\noutput with for-in *:');
64+
for (const key in transaction) {
65+
console.log(key, transaction[key]);
66+
}
6167

62-
transaction.rollback();
63-
console.log('JSON:', JSON.stringify(data), JSON.stringify(transaction));
64-
console.dir({ data, transaction });
68+
console.log('\n* partially fixed, except .city\n');
69+
70+
transaction.commit();
71+
console.log('data', JSON.stringify(data));
72+
console.log('transaction', JSON.stringify(transaction));

0 commit comments

Comments
 (0)
0