練習用的 REPL
let youngest = people[0] ? people[0].age : Infinity;
let totalSalary = 0;
for (const p of people) {
if (p.age < youngest) youngest = p.age; // 判斷最年輕的年齡
totalSalary += p.salary; // 加總薪水
}
return `youngestAge: ${youngest}, totalSalary: ${totalSalary}`;
迴圈裡面顯然做了多件事情。
let youngest = people[0] ? people[0].age : Infinity;
let totalSalary = 0;
for (const p of people) {
// if (p.age < youngest) youngest = p.age;
totalSalary += p.salary;
}
for (const p of people) { // 把 loop 拆開,接著移除重複程式碼
if (p.age < youngest) youngest = p.age;
// totalSalary += p.salary;
}
return `youngestAge: ${youngest}, totalSalary: ${totalSalary}`;
挪動程式碼,方便抽取。
let totalSalary = 0;
for (const p of people) {
totalSalary += p.salary;
}
let youngest = people[0] ? people[0].age : Infinity; // 接著用 Slide Statement 為 Extract Function 做準備
for (const p of people) {
if (p.age < youngest) youngest = p.age;
}
return `youngestAge: ${youngest}, totalSalary: ${totalSalary}`;
抽取出不同的任務。
return `youngestAge: ${youngestAge()}, totalSalary: ${totalSalary()}`;
function totalSalary() {
let totalSalary = 0;
for (const p of people) {
totalSalary += p.salary;
}
return totalSalary;
}
function youngestAge() {
let youngest = people[0] ? people[0].age : Infinity;
for (const p of people) {
if (p.age < youngest) youngest = p.age;
}
return youngest;
}
利用 map-reduce 來移除迴圈。
return `youngestAge: ${youngestAge()}, totalSalary: ${totalSalary()}`;
function totalSalary() {
return people.reduce((total,p) => total + p.salary, 0);
}
function youngestAge() {
return Math.min(...people.map(p => p.age));
}