āĻāϏāϞ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ: ryanmcdermott/clean-code-javascript
- āĻā§āĻŽāĻŋāĻāĻž
- āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞāϏ
- āĻĢāĻžāĻāĻļāύāϏ
- āĻ āĻŦāĻā§āĻā§āĻ āĻāĻŦāĻ āĻĄāĻžāĻāĻž āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ
- āĻā§āϞāĻžāϏ
- āϏāϞāĻŋāĻĄ(SOLID)
- āĻā§āϏā§āĻāĻŋāĻ
- āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ
- āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻ
- āĻĢāϰāĻŽā§āϝāĻžāĻāĻŋāĻ
- āĻāĻŽā§āύā§āĻāϏ
- āĻ āύā§āĻŦāĻžāĻĻ
āĻāĻāĻžāύ⧠āϰāĻŦāĻžāϰā§āĻ āϏāĻŋ. āĻŽāĻžāϰā§āĻāĻŋāύ āĻāϰ Clean Code āĻŦāĻā§ā§ āĻŦāϰā§āύāĻŋāϤ āϏāĻĢāĻāĻā§ā§āϝāĻžāϰ āĻāĻā§āĻāĻŋāύāĻŋā§āĻžāϰāĻŋāĻ āĻāϰ āύā§āϤāĻŋāĻā§āϞā§āĻā§ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāϰ āĻāύā§āϝ āĻāĻŋāĻā§āĻāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤ āĻāĻāĻž āĻā§āύ āϏā§āĻāĻžāĻāϞ āĻāĻžāĻāĻĄ āύāĻžāĨ¤ āĻāĻāĻž āĻšāϞ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϏā§āĻĒāĻžāĻ ā§āϝ, āĻĒā§āύāĻŦā§āϝāĻŦāĻšāĻžāϰāϝā§āĻā§āϝ, āϰāĻŋāĻĢā§āϝāĻžāĻā§āĻāϰāϝā§āĻā§āϝ āϏāĻĢāĻāĻā§ā§āϝāĻžāϰ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻāĻžāĻāĻĄāĨ¤
āĻŦā§āϝāĻžāĻĒāĻžāϰāĻāĻž āĻāĻŽāύ āύāĻž āϝ⧠āĻāĻāĻžāύ⧠āĻŦāϰā§āύāĻŋāϤ āϏāĻŦ āύāĻŋā§āĻŽ āĻāĻ ā§āϰāĻāĻžāĻŦā§ āĻŽā§āύ⧠āĻāϞāϤ⧠āĻšāĻŦā§, āĻāĻŽāύāĻāĻŋ āĻāĻāĻžāύ⧠āĻŦāϰā§āύāĻŋāϤ āĻā§āĻŦ āĻāĻŽ āύāĻŋā§āĻŽā§āϰ āϏāĻžāĻĨā§ āϏāĻŦāĻžāĻ āĻāĻāĻŽāϤāĨ¤ āĻāĻā§āϞ⧠āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻž āĻŦā§āϝāĻžāϤāĻŋāϤ āĻāĻŋāĻā§āĻ āύāĻžāĨ¤ āϤāĻŦā§ āĻāĻā§āϞ⧠Clean Code āĻŦāĻā§ā§āϰ āϞā§āĻāĻāĻĻā§āϰ āĻŦāĻšā§ āĻŦāĻāϰā§āϰ āϏāĻŽāώā§āĻāĻŋāĻāϤ āĻ āĻāĻŋāĻā§āĻāϤāĻž āĻĨā§āĻā§ āĻŦāĻŋāϧāĻŋāĻŦāĻĻā§āϧ āĻāϰāĻžāĨ¤
āĻāĻŽāĻžāĻĻā§āϰ āϏāĻĢāĻāĻā§āĻžāϰ āĻāĻā§āĻāĻŋāύāĻŋā§āĻžāϰāĻŋāĻ āĻļāĻŋāϞā§āĻĒā§āϰ āĻŦā§āϏ ā§Ģā§Ļ āĻŦāĻāϰā§āϰ āĻāĻŋāĻā§ āĻŦā§āĻļāĻŋ āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻāĻāύāĻ āĻ āύā§āĻ āĻāĻŋāĻā§ āĻļāĻŋāĻāĻāĻŋāĨ¤ āϝāĻāύ āϏāĻĢāĻāĻā§āĻžāϰ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āϏā§āĻĨāĻžāĻĒāϤā§āϝāĻāϞāĻžāϰ āĻŽāϤ āĻĒā§āϰāύ⧠āĻšāĻŦā§, āϤāĻāύ āĻšā§āϤ āĻāĻŽāϰāĻž āĻŽā§āύ⧠āĻāϞāĻžāϰ āĻāύā§āϝ āĻāĻŋāĻā§ āĻāĻ ā§āϰ āύāĻŋā§āĻŽ āĻĒāĻžāĻŦāĨ¤ āϏā§āĻĻāĻŋāύā§āϰ āĻāĻ āĻĒāϰā§āϝāύā§āϤ āĻāĻŽāϰāĻž āϝ⧠āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻā§āĻĄ āϤā§āϰāĻŋ āĻāϰāĻāĻŋ āϤāĻžāϰ āĻŽāĻžāύ āϝāĻžāĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻžāĻāĻŋāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻā§āĻŽāĻŋāĻāĻž āĻļā§āώ āĻāϰāĻžāϰ āĻāĻā§ āĻāĻāĻāĻž āĻāĻĨāĻž, āĻāĻ āύāĻŋā§āĻŽ āĻā§āϞ⧠āĻāĻžāύāϞā§āĻ āϤā§āĻŽāĻŋ āĻāĻā§āϰ āĻĨā§āĻā§ āĻāĻžāϞ⧠āϏāĻĢāĻāĻā§ā§āϝāĻžāϰ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻšā§ā§ āϝāĻžāĻŦā§ āύāĻž āĻāĻŦāĻ āĻāĻā§āϞ⧠āĻ āύā§āĻ āĻŦāĻāϰ āϧāϰ⧠āĻŽā§āύ⧠āĻāϞāĻž āĻŽāĻžāύ⧠āĻāĻ āύāĻž āϝ⧠āϤā§āĻŽāĻŋ āĻāϰ āĻā§āϞ āĻāϰāĻŦā§ āύāĻžāĨ¤ āĻŽāĻžāĻāĻŋāϰ āĻĻāϞāĻž āĻĨā§āĻā§ āϝā§āĻŽāύ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻā§āϤāĻŋ āϤā§āϰāĻŋ āĻšā§, āϤā§āĻŽāύāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āĻĄ āĻļā§āϰ⧠āĻšā§ āĻĒā§āϰāĻĨāĻŽ āĻāϏā§āĻž āĻĨā§āĻā§āĨ¤ āĻāĻŽāϰāĻž āϝāĻāύ āϏāĻŦāĻļā§āώ⧠āĻāĻŽāĻžāĻĻā§āϰ āϏāĻšāĻāϰā§āĻŽā§āĻĻā§āϰ āϏāĻžāĻĨā§ āĻā§āĻĄ āϰāĻŋāĻāĻŋāĻ āĻāϰāϤ⧠āĻŦāϏāĻŋ āϤāĻāύ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻĄā§āϰ āĻ āϏāĻŽā§āĻĒā§āϰā§āĻŖāϤāĻžāĻā§āϞā§āĻā§ āĻā§āĻāĻā§ āĻĢā§āϞ⧠āĻĻāĻŋāĻāĨ¤ āĻĒā§āϰāĻĨāĻŽ āĻāϏā§āĻžāϤ⧠āĻā§āϞ āĻĨāĻžāĻāĻŦā§āĻāĨ¤ āĻāĻāύā§āϝ āύāĻŋāĻā§āĻā§ āĻļāĻžāϏā§āϤāĻŋ āĻĻāĻŋāĻ āύāĻž, āĻŦāϰāĻ āϤā§āĻŽāĻžāϰ āĻā§āĻĄ āĻā§ā§ā§āĻŽā§āĻā§ āĻ āĻŋāĻ āĻāϰāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const yyyymmdstr = moment().format("YYYY/MM/DD");
āĻāĻžāϞ⧠āĻā§āĻĄ:
const currentDate = moment().format("YYYY/MM/DD");
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻāĻ āϧāϰāĻŖā§āϰ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞā§āϰ āύāĻžāĻŽāĻāϰāύā§āϰ āĻāύā§āϝ āĻāĻāĻ āϧāϰāĻŖā§āϰ āĻļāĻŦā§āĻĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
getUserInfo();
getClientData();
getCustomerRecord();
āĻāĻžāϞ⧠āĻā§āĻĄ:
getUser();
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻā§āĻāĻāϤ⧠āϏā§āĻŦāĻŋāϧāĻž āĻšā§ āĻāĻŽāύ āύāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻā§āĻŦāύ⧠āϝāϤ āĻā§āĻĄ āϞāĻŋāĻāĻŦ, āĻĒā§āϤ⧠āĻšāĻŦā§ āϤāĻžāϰ āĻĨā§āĻā§ āĻ āύā§āĻ āĻŦā§āĻļāĻŋāĨ¤ āĻāĻāĻžāϰāĻŖā§ āϏā§āĻĒāĻžāĻ ā§āϝ āĻāĻŦāĻ āϏāĻšāĻā§ āĻā§āĻāĻā§ āĻĒāĻžāĻā§āĻž āϝāĻžā§ āĻāĻŽāύ āĻā§āĻĄ āϞāĻŋāĻāĻž āĻā§āĻŦāĻ āĻā§āϰā§āϤā§āϤāĻĒā§āϰā§āύāĨ¤ āĻāĻŽāϰāĻž āϝāĻĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āϞāĻŋāĻāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŦā§āĻāĻžāϰ āĻāύā§āϝ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞā§āϰ āύāĻžāĻŽ āϝāĻĨā§āώā§āĻ āĻ āϰā§āĻĨāĻŦāĻš āύāĻž āĻāϰāĻŋ, āĻāĻŽāĻžāĻĻā§āϰ āĻĒāĻžāĻ āĻāĻĻā§āϰ āĻāώā§āĻ āĻŦāĻžā§āĻŦā§ āĻŦāĻ āĻāĻŽāĻŦā§ āύāĻžāĨ¤ āϝā§āϏāĻāϞ āϧā§āϰā§āĻŦāĻ āĻāĻŦāĻ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞā§āϰ āύāĻžāĻŽāĻāϰāύ āĻāϰāĻž āĻšā§ āύāĻŋ āϏā§āĻā§āϞ⧠āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰāϤ⧠buddy.js āĻāĻŦāĻ ESLint āĻāϰ āĻŽāϤ āĻā§āϞāĻā§āϞ⧠āĻāĻŽāĻžāĻĻā§āϰ āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
// What the heck is 86400000 for?
setTimeout(blastOff, 86400000);
āĻāĻžāϞ⧠āĻā§āĻĄ:
// Declare them as capitalized named constants.
const MILLISECONDS_IN_A_DAY = 86400000;
setTimeout(blastOff, MILLISECONDS_IN_A_DAY);
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āύāĻžāĻŽ āĻĻā§āĻā§āĻ āϝā§āύ āĻŦā§āĻāĻž āϝāĻžā§ āĻāĻāϰāĻāĻŽāĻāĻžāĻŦā§ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻāϰ āύāĻžāĻŽāĻāϰāύ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const address = "One Infinite Loop, Cupertino 95014";
const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/;
saveCityZipCode(
address.match(cityZipCodeRegex)[1],
address.match(cityZipCodeRegex)[2]
);
āĻāĻžāϞ⧠āĻā§āĻĄ:
const address = "One Infinite Loop, Cupertino 95014";
const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/;
const [, city, zipCode] = address.match(cityZipCodeRegex) || [];
saveCityZipCode(city, zipCode);
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āύāĻžāĻ āĻŽāĻžāĻŽāĻžāϰ āĻā§ā§ā§ āĻāĻžāύāĻž āĻŽāĻžāĻŽāĻž āĻāĻžāϞā§āĨ¤ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞā§āϰ āύāĻžāĻŽāĻāϰāύā§āϰ āϏāĻŽā§ āĻāϰ āĻā§ā§āĻžāϞ āϰāĻžāĻāϤ⧠āĻšāĻŦā§ āύāĻžāĻŽ āĻĨā§āĻā§ āϝā§āύ āĻāϰ āĻāĻžāĻ āĻŦā§āĻāĻž āϝāĻžā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const locations = ["Austin", "New York", "San Francisco"];
locations.forEach(l => {
doStuff();
doSomeOtherStuff();
// ...
// ...
// ...
// Wait, what is `l` for again?
dispatch(l);
});
āĻāĻžāϞ⧠āĻā§āĻĄ:
const locations = ["Austin", "New York", "San Francisco"];
locations.forEach(location => {
doStuff();
doSomeOtherStuff();
// ...
// ...
// ...
dispatch(location);
});
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻ āĻĒā§āϰā§ā§āĻāύā§ā§ āĻāύā§āĻā§āĻā§āϏāĻ āϝā§āĻ āĻāϰāĻžāϰ āĻĻāϰāĻāĻžāϰ āύā§āĻ
āĻā§āϞāĻžāϏ/āĻ āĻŦāĻā§āĻā§āĻ āĻāϰ āύāĻžāĻŽ āĻĨā§āĻā§ āĻā§āύ āϤāĻĨā§āϝ āĻāĻžāύāĻž āĻā§āϞ⧠āϏā§āĻ āϤāĻĨā§āϝ āĻāĻŦāĻžāϰ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞā§āϰ āύāĻžāĻŽā§āϰ āĻŽāϧā§āϝ⧠āϰāĻžāĻāĻžāϰ āĻĻāϰāĻāĻžāϰ āύā§āĻāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const Car = {
carMake: "Honda",
carModel: "Accord",
carColor: "Blue"
};
function paintCar(car) {
car.carColor = "Red";
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
const Car = {
make: "Honda",
model: "Accord",
color: "Blue"
};
function paintCar(car) {
car.color = "Red";
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻļāϰā§āĻ āϏāĻžāϰā§āĻāĻŋāĻāĻŋāĻ/āĻāύā§āĻĄāĻŋāĻļāύāĻžāϞ āϏā§āĻā§āĻāĻŽā§āύā§āĻ āĻĨā§āĻā§ āĻĄāĻŋāĻĢāύā§āĻ āĻā§āϝāĻžāϞ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻžāϞā§āĨ¤
āĻļāϰā§āĻ āϏāĻžāϰā§āĻāĻŋāĻāĻŋāĻ āĻĨā§āĻā§ āĻĄāĻŋāĻĢāϞā§āĻ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻ
āύā§āĻ āĻŦā§āĻļāĻŋ āĻĒāϰāĻŋāĻā§āĻāύā§āύāĨ¤ āϤāĻŦā§ āĻāĻāĻž āĻŽāĻžāĻĨāĻžā§ āϰāĻžāĻāϤ⧠āĻšāĻŦā§ āϝā§, āϝāĻĻāĻŋ āĻāĻŽāϰāĻž āĻĢāĻžāĻāĻļāύ⧠āĻĄāĻŋāĻĢāϞā§āĻ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ āϤāĻŦā§ āĻ
āϏāĻā§āĻāĻžā§āĻŋāϤ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻāϰ āĻā§āώā§āϤā§āϰā§āĻ āĻļā§āϧ⧠āĻŽāĻžāϤā§āϰ āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāĻŦā§āĨ¤ āĻ
āύā§āϝāĻžāύā§āϝ falsy āĻā§āϝāĻžāϞā§, āϝā§āĻŽāύāĻ ''
, ""
, false
, null
, 0
, āĻāĻŦāĻ NaN
, āĻāĻā§āϞā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞ⧠āĻŦāϏāĻŦā§ āύāĻžāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function createMicrobrewery(name) {
const breweryName = name || "Hipster Brew Co.";
// ...
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function createMicrobrewery(name = "Hipster Brew Co.") {
// ...
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻĢāĻžāĻāĻļāύ āĻāϰā§āĻā§āĻŽā§āύā§āĻāϏ (⧍āĻāĻžāϰ āĻŦā§āĻļāĻŋ āύā§, ā§§ āĻāĻž āĻšāϞ⧠āĻāĻžāϞ āĻšā§)
āĻĢāĻžāĻāĻļāύ āĻā§āϏā§āĻāĻŋāĻ āϏāĻšāĻ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻĢāĻžāĻāĻļāύ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻā§ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āĻāϰāĻž āĻā§āĻŦāĻ āĻā§āϰā§āϤā§āϤāĻĒā§āϰā§āύ āĨ¤ āĻĢāĻžāĻāĻļāύ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ ā§Š āĻāϰ āĻ āϧāĻŋāĻ āĻšāϞā§, āĻŦāĻŋāύā§āϝāĻžāϏ āϏāĻŽāĻžāĻŦā§āĻļā§āϰ āĻāĻžāϰāĻŖā§ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āϏā§āĻ āĻā§āϏā§āϰ āϏāĻāĻā§āϝāĻž āĻŦā§ā§ā§ āϝāĻžā§āĨ¤
āĻāĻāĻĻāĻŽāĻ āĻ āĻĒāĻžāϰāĻ āĻšāĻ˛ā§ ā§Š āĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤ āϤāĻŦā§ āĻāĻĻāϰā§āĻļ āĻšāϞ ⧍ āĻŦāĻž āϤāĻžāϰ āĻāĻŽāĨ¤ āĻāϰ āĻĨā§āĻā§ āĻŦā§āĻļāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻšāϞ⧠āϤāĻžāĻĻā§āϰāĻā§ āĻāĻāĻāĻž āĻ āĻŦāĻā§āĻā§āĻ āĻāϰ āĻŽāϧā§āϝ⧠āĻāĻāϤā§āϰā§āĻāϰāĻŖā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻāϰ āϏāĻāĻā§āϝāĻž āĻāĻŽāĻŋā§ā§ āĻāύāϤ⧠āĻšāĻŦā§āĨ¤
āϝā§āĻšā§āϤ⧠āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻ āĻ āĻŦāĻā§āĻā§āĻ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻā§āϞ⧠āĻā§āϞāĻžāϏ āĻŦā§āϞāĻžāϰāĻĒā§āϞā§āĻ āϞāĻžāĻā§ āύāĻž, āϤāĻžāĻ āϝāĻĻāĻŋ āϤā§āĻŽāĻžāϰ āĻ āύā§āĻāĻā§āϞ⧠āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻĒā§āϰā§ā§āĻāύ āĻšā§ āϤāĻŦā§ āϤā§āĻŽāĻŋ āĻ āĻŦāĻā§āĻā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĨ¤
āĻāĻāĻāĻž āĻĢāĻžāĻāĻļāύ⧠āĻāĻŋ āĻāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻāϏāϞ⧠āϝāĻžāĻā§āĻā§ āϤāĻž āĻŦā§āĻāĻžāύā§āϰ āĻāύā§āϝ ES2015/ES6 āĻāϰ destructuring syntax āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĨ¤ āĻāĻāĻžāϰ āĻāĻŋāĻā§ āϏā§āĻŦāĻŋāϧāĻž āĻāĻā§,
- āϝāĻāύ āĻā§āĻ āĻĢāĻžāĻāĻļāύ āϏāĻŋāĻāύā§āĻāĻžāϰ āĻĻā§āĻāĻŦā§ āϤāĻāύāĻŋ āĻŦā§āĻā§ āĻĢā§āϞāĻŦā§ āĻāĻŋ āĻāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻĻā§ā§āĻž āĻšāĻā§āĻā§ āĻĢāĻžāĻāĻļāύā§āϰ āĻŽāϧā§āϝā§āĨ¤
- Destructring āĻāϰāϞā§, āĻĢāĻžāĻāĻļāύā§āϰ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ āϝ⧠āĻĒā§āϰāĻŋāĻŽāĻŋāĻāĻŋāĻ āĻā§āϝāĻžāϞ⧠āĻĻā§ā§āĻž āĻšā§ā§āĻā§ āϏā§āĻā§āϞ⧠āĻā§āϞā§āύ āĻšā§ā§ āϝāĻžā§āĨ¤ āϝāĻž āĻāĻŋāύāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻā§ āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻ āĻĒā§āϰāϤāĻŋāϰā§āϧ āĻāϰāϤ⧠āϏāĻšāĻžā§āϤāĻž āĻāϰā§āĨ¤ āϤāĻŦā§ āĻŽāĻžāĻĨāĻžā§ āϰāĻžāĻāϤ⧠āĻšāĻŦā§, āϝāĻĻāĻŋ āĻāϰ⧠āĻŦāĻž āĻ āĻŦāĻā§āĻā§āĻ destructure āĻāϰāĻž āĻšā§, āϏā§āĻā§āώā§āϤā§āϰ⧠āĻāϰāĻž āĻā§āϞā§āύ āĻšā§ āύāĻžāĨ¤
- āĻ āĻŦā§āϝāĻŦāĻšā§āϤ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāϤ⧠āϞā§āύāĻāĻžāϰ āĻāĻŽāĻžāĻĻā§āϰ āĻšā§āϞā§āĻĒ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŋāύā§āϤ⧠Destructure āύāĻž āĻāϰāϞ⧠āĻšā§āϤ āĻāĻāĻž āϏāĻŽā§āĻāĻŦ āĻšāϤ āύāĻžāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function createMenu(title, body, buttonText, cancellable) {
// ...
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function createMenu({ title, body, buttonText, cancellable }) {
// ...
}
createMenu({
title: "Foo",
body: "Bar",
buttonText: "Baz",
cancellable: true
});
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻĒā§āϰāϤāĻŋāĻāĻž āĻĢāĻžāĻāĻļāύā§āϰ āĻļā§āϧ⧠āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āĻāĻžāĻ āĻāϰāĻž āĻāĻāĻŋāϤ
āϏāĻĢāĻāĻā§ā§āϝāĻžāϰ āĻāĻā§āĻāĻŋāύāĻŋā§āĻžāϰāĻŋāĻ āĻ āĻāĻāύ āĻĒāϰā§āϝāύā§āϤ āĻāĻāĻžāĻ āϏāĻŦ āĻĨā§āĻā§ āĻā§āϰā§āϤā§āϤāĻĒā§āϰā§āύ āύā§āϤāĻŋāĨ¤ āϝā§āϏāĻŦ āĻĢāĻžāĻāĻļāύ āϝāĻĻāĻŋ āĻāĻā§āϰ āĻ āϧāĻŋāĻ āĻāĻžāĻ āĻāϰā§, āϏā§āϏāĻŦ āĻĢāĻžāĻāĻļāύ āĻā§āϏā§āĻ āĻāϰāĻž, āĻ āύā§āϝ āϝāĻžā§āĻāĻžā§ āĻĒā§āύāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻ āĻŋāύ āĻšā§ā§ āϝāĻžā§āĨ¤ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϝāĻĻāĻŋ āĻā§āĻŦāϞ āĻāĻāĻāĻŋ āĻāĻžāĻ āĻāϰ⧠āϤāĻŦā§ āϤā§āĻŽāĻžāϰ āĻā§āĻĄ āϏā§āĻĒāĻžāĻ ā§āϝ āĻāĻŦāĻ āϏāĻšāĻā§ āĻĒā§āύāϰāĻžā§ āϞā§āĻāĻž āϝāĻžāĻŦā§āĨ¤ āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ āĻāĻ āĻāĻžāĻāĻĄā§āϰ āĻāϰ āĻāĻŋāĻā§ āύāĻž āĻā§āϰāĻšāĻŖ āĻāϰ⧠āĻļā§āϧ⧠āĻāĻ āύāĻŋā§āĻŽāĻāĻŋ āĻā§āϰāĻšāĻŖ āĻāϰ, āϤāĻžāĻšāϞā§āĻ āϤā§āĻŽāĻŋ āĻ āύā§āϝ āĻĄā§āĻā§āϞāĻĒā§āϰ āĻĨā§āĻā§ āĻ āύā§āĻ āĻāĻāĻŋā§ā§ āϝāĻžāĻŦā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function emailClients(clients) {
clients.forEach(client => {
const clientRecord = database.lookup(client);
if (clientRecord.isActive()) {
email(client);
}
});
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function emailActiveClients(clients) {
clients.filter(isActiveClient).forEach(email);
}
function isActiveClient(client) {
const clientRecord = database.lookup(client);
return clientRecord.isActive();
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻĢāĻžāĻāĻļāύā§āϰ āύāĻžāĻŽā§āĻ āĻŦāϞāĻž āĻĨāĻžāĻāϤ⧠āĻšāĻŦā§ āϏā§āĻāĻŋ āĻāĻŋ āĻāϰā§
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function addToDate(date, month) {
// ...
}
const date = new Date();
// It's hard to tell from the function name what is added
addToDate(date, 1);
āĻāĻžāϞ⧠āĻā§āĻĄ:
function addMonthToDate(month, date) {
// ...
}
const date = new Date();
addMonthToDate(1, date);
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻĢāĻžāĻāĻļāύ⧠āĻļā§āϧ⧠āĻāĻāϧāĻžāĻĒ āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰāĻŦā§
āϤā§āĻŽāĻžāϰ āĻĢāĻžāĻāĻļāύ⧠āĻāĻā§āϰ āĻ āϧāĻŋāĻ āϧāĻžāĻĒā§ āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύ āĻĨāĻžāĻāĻž āĻŽāĻžāύā§āĻ āϤā§āĻŽāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻāĻā§āϰ āĻ āϧāĻŋāĻ āĻāĻžāĻ āĻāϰāĻā§āĨ¤ āĻāĻā§ āĻŦāĻŋāĻāĻŋāύā§āύ āĻā§āĻāĻā§āĻ āĻāĻžāĻā§ āĻŦāĻŋāĻāĻā§āϤ āĻāϰāϞ⧠āĻĒā§āύāϰāĻžā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž , āĻā§āϏā§āĻāĻŋāĻ āĻāϰāĻž āϏāĻšāĻ āĻšā§ā§ āϝāĻžā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function parseBetterJSAlternative(code) {
const REGEXES = [
// ...
];
const statements = code.split(" ");
const tokens = [];
REGEXES.forEach(REGEX => {
statements.forEach(statement => {
// ...
});
});
const ast = [];
tokens.forEach(token => {
// lex...
});
ast.forEach(node => {
// parse...
});
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function parseBetterJSAlternative(code) {
const tokens = tokenize(code);
const syntaxTree = parse(tokens);
syntaxTree.forEach(node => {
// parse...
});
}
function tokenize(code) {
const REGEXES = [
// ...
];
const statements = code.split(" ");
const tokens = [];
REGEXES.forEach(REGEX => {
statements.forEach(statement => {
tokens.push(/* ... */);
});
});
return tokens;
}
function parse(tokens) {
const syntaxTree = [];
tokens.forEach(token => {
syntaxTree.push(/* ... */);
});
return syntaxTree;
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āϤā§āĻŽāĻžāϰ āϏāϰā§āĻŦā§āĻā§āĻ āĻā§āώā§āĻāĻž āĻāϰāĻŦā§ āϝā§āύ āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āĻā§āĻĄ āύāĻž āĻĨāĻžāĻā§āĨ¤ āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āĻā§āĻĄ āĻĨāĻžāĻāĻž āĻŽāĻžāύā§āĻ, āĻāĻāύ⧠āĻā§āύ āĻāĻāĻāĻžāϰ āϞāĻāĻŋāĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āϞāĻžāĻāϞ⧠āϤā§āĻŽāĻžāϰ āϏāĻŦāĻā§āϞ⧠āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āĻā§āĻĄā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤
āĻāĻŋāύā§āϤāĻž āĻāϰ āϤā§āĻŽāĻŋ āĻāĻāĻāĻž āϰā§āϏā§āĻā§āϰā§āύā§āĻ āĻ āĻāĻā§ āĻāĻŦāĻ āϤā§āĻŽāĻžāϰ āĻāĻžāĻ āĻšāĻā§āĻā§ āϰā§āϏā§āĻā§āϰā§āύā§āĻ āĻāϰ āϏā§āĻā§āϰ⧠āĻāĻŋ āĻāĻŋ āĻāĻā§ āϏā§āĻā§āϞā§āϰ āĻāĻŦāϰ āϰāĻžāĻāĻžāĨ¤ āĻŽāĻžāύ⧠āĻšāϞ āϰā§āϏā§āĻā§āϰā§āύā§āĻā§ āĻāϤāĻā§āĻā§ āĻāĻŽāĻžāĻā§, āĻĒā§āĻā§āĻžāĻ, āĻšāϞā§āĻĻ, āĻŽāĻļāϞāĻž āĻāĻā§ āϏā§āĻā§āϞā§āϰ āĻšāĻŋāϏāĻžāĻŦ āϰāĻžāĻāĻžāĨ¤ āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ āĻ āύā§āĻāĻā§āϞ⧠āϝāĻžā§āĻāĻžā§ āĻāĻĻā§āϰ āĻšāĻŋāϏāĻžāĻŦ āϰāĻžāĻ, āĻā§āύ āĻāĻāĻāĻžāϰ āĻšāĻŋāĻļāĻžāĻŦ āĻāĻŽāϞ⧠āĻŦāĻž āĻŦāĻžā§āϞ⧠āϤā§āĻŽāĻžāϰ āϏāĻŦ āϞāĻŋāϏā§āĻā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤ āĻāĻŋāύā§āϤ⧠āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ āĻāĻāĻāĻž āϞāĻŋāϏā§āĻā§ āĻāĻĻā§āϰ āĻšāĻŋāϏāĻžāĻŦ āϰāĻžāĻāϤ⧠āϤāĻžāĻšāϞ⧠āĻāĻāĻāĻž āϞāĻŋāϏā§āĻā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϞā§āĻ āĻšāϤāĨ¤
āĻŽāĻžāĻā§ āĻŽāĻžāĻā§ āĻāĻŽāύ āĻšā§ āϝ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āĻā§āĻĄ āϞāĻŋāĻāϤ⧠āĻšā§, āĻāĻžāϰāĻŖ āĻĻā§āĻāĻž āϝāĻžā§, ⧍ āĻāĻž āĻĢāĻžāĻāĻļāύ āĻĒā§āϰāĻžā§ āĻāĻāĻ āĻāĻžāĻ āĻāϰāĻā§ āĻļā§āϧ⧠āϏāĻžāĻŽāĻžāύā§āϝ āĻāĻāĻā§ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻāĻā§āĨ¤ āĻāĻ āϏāĻžāĻŽāĻžāύā§āϝ āĻĒāĻžāϰā§āĻĨāĻā§āϝā§āϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ ⧍ āĻāĻž āĻĢāĻžāĻāĻļāύ āϞā§āĻāĻž āϞāĻžāĻā§āĨ¤ āĻāĻā§āώā§āϤā§āϰ⧠āĻāĻāĻāĻž āϏāĻŽāĻžāϧāĻžāύ āĻšāϞ, āĻāĻāĻāĻž āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻžāĨ¤
āĻāĻ āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύāĻāĻž āĻ āĻŋāĻāĻ āĻžāĻ āĻāĻžāĻŦā§ āĻāϰāϤ⧠āĻĒāĻžāϰāĻž āĻā§āĻŦāĻ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āύāĨ¤ āĻāĻāĻžāϰāĻŖā§ āϤā§āĻŽāĻžāϰ āĻāĻāĻŋāϤ āĻā§āϞāĻžāϏ āĻ āϧā§āϝāĻžā§ā§ āĻŦāϰā§āύāĻŋāϤ SOLID āĻĒā§āϰāĻŋāύā§āϏāĻŋāĻĒāĻžāϞ āĻŽā§āύ⧠āĻāϞāĻžāĨ¤ āĻā§āϞ āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύ āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āĻā§āĻĄ āĻĨā§āĻā§āĻ āĻā§āώāϤāĻŋāĻāϰ, āĻ āϤāĻāĻŦ āϏāĻžāϧ⧠āϏāĻžāĻŦāϧāĻžāύ! āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ āϏāĻ āĻŋāĻ āĻāĻžāĻŦā§ āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰ āϤāĻŦā§ āĻāϰ⧠āĻĢā§āϞāĨ¤ āϤāĻž āύāĻžāĻšāϞ⧠āĻāĻāĻāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϰ āĻāύā§āϝ āĻāĻāĻžāϧāĻŋāĻ āĻāĻžā§āĻāĻžā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function showDeveloperList(developers) {
developers.forEach(developer => {
const expectedSalary = developer.calculateExpectedSalary();
const experience = developer.getExperience();
const githubLink = developer.getGithubLink();
const data = {
expectedSalary,
experience,
githubLink
};
render(data);
});
}
function showManagerList(managers) {
managers.forEach(manager => {
const expectedSalary = manager.calculateExpectedSalary();
const experience = manager.getExperience();
const portfolio = manager.getMBAProjects();
const data = {
expectedSalary,
experience,
portfolio### Function names should say what they do
};
render(data);
});
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function showEmployeeList(employees) {
employees.forEach(employee => {
const expectedSalary = employee.calculateExpectedSalary();
const experience = employee.getExperience();
const data = {
expectedSalary,
experience
};
switch (employee.type) {
case "manager":
data.portfolio = employee.getMBAProjects();
break;
case "developer":
data.githubLink = employee.getGithubLink();
break;
}
render(data);
});
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻĄāĻŋāĻĢāϞā§āĻ āĻ āĻŦāĻā§āĻā§āĻ āϏā§āĻ āĻāϰāĻžāϰ āϏāĻŽā§ Object.assign āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const menuConfig = {
title: null,
body: "Bar",
buttonText: null,
cancellable: true
};
function createMenu(config) {
config.title = config.title || "Foo";
config.body = config.body || "Bar";
config.buttonText = config.buttonText || "Baz";
config.cancellable =
config.cancellable !== undefined ? config.cancellable : true;
}
createMenu(menuConfig);
āĻāĻžāϞ⧠āĻā§āĻĄ:
const menuConfig = {
title: "Order",
// User did not include 'body' key
buttonText: "Send",
cancellable: true
};
function createMenu(config) {
config = Object.assign(
{
title: "Foo",
body: "Bar",
buttonText: "Baz",
cancellable: true
},
config
);
// config now equals: {title: "Order", body: "Bar", buttonText: "Send", cancellable: true}
// ...
}
createMenu(menuConfig);
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻĢāĻžāĻāĻļāύ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻšāĻŋāϏā§āĻŦā§ āĻĢā§āϞā§āϝāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§ āύāĻž
āĻĢā§āϞā§āϝāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠āϤā§āĻŽāĻžāϰ āĻā§āĻĄ āϰāĻŋāĻāĻŋāĻā§āĻžāϰ āĻŦā§āĻāϤ⧠āĻĒāĻžāϰ⧠āϝ⧠āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āĻāϰāĻā§āĨ¤ āϝāĻĻāĻŋ āĻĢā§āϞā§āϝāĻžāĻ āĻāϰ āĻā§āϝāĻžāϞ⧠āĻāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āϤā§āĻŽāĻžāϰ āĻā§āĻĄāĻĢā§āϞ⧠āĻŦāĻŋāĻāĻŋāύā§āύ āĻĻāĻŋāĻā§ āϝāĻžā§, āϤāĻŦā§ āϤāĻžāĻĻā§āϰ āĻā§ āĻāϞāĻžāĻĻāĻž āĻĢāĻžāĻāĻļāύ⧠āϰā§āĻĒāĻžāύā§āϤāϰāĻŋāϤ āĻāϰāĨ¤ āϤāĻžāϰāĻĒāϰ āϤā§āĻŽāĻžāϰ āĻĢā§āϞā§āϝāĻžāĻ āĻāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻŦāĻŋāĻāĻŋāύā§āύ āĻĢāĻžāĻāĻļāύ āĻā§ āĻāϞ āĻāϰāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function createFile(name, temp) {
if (temp) {
fs.create(`./temp/${name}`);
} else {
fs.create(name);
}
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function createFile(name) {
fs.create(name);
}
function createTempFile(name) {
createFile(`./temp/${name}`);
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āϝāĻāύ āĻāĻāĻāĻž āĻĢāĻžāĻāĻļāύ āĻā§āϝāĻžāϞ⧠āĻāĻĻāĻžāύāĻĒā§āϰāĻĻāĻžāύ āĻāĻžā§āĻž āĻ āύā§āϝ āĻāĻžāĻ āĻāϰāĻŦā§ āϤāĻāύāĻ āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻ āϤā§āϰāĻŋ āĻšā§āĨ¤ āĻĢāĻžāĻāϞ⧠āϰāĻžāĻāĻ āĻāϰāĻž, āĻā§āϞā§āĻŦāĻžāϞ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻāĻĒāĻĄā§āĻ āĻāϰāĻž āĻāĻā§āϞ⧠āĻšāϞ āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻ āĻāϰ āĻāĻĻāĻžāĻšāϰāĻŖāĨ¤
āĻŽāĻžāĻā§ āĻŽāĻžāĻā§ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻ āĻāϰ āĻĒā§āϰā§ā§āĻāύ āĻšā§, āϝā§āĻŽāύāĻ āĻĢāĻžāĻāϞ⧠āϰāĻžāĻāĻ āĻāϰāĻžāĨ¤ āϏā§āĻā§āώā§āϤā§āϰ⧠āĻāĻŽāϰāĻž āĻāĻ āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻāĻāĻžāĻā§ āĻāĻāĻāĻž āĻāϞāĻžāĻĻāĻž āϏāĻžāϰā§āĻāĻŋāϏ āĻŦāĻžāύāĻŋā§ā§ āϰāĻžāĻāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āϤāĻžāϰāĻĒāϰ āϝā§āĻāĻžāύ⧠āϝā§āĻāĻžāύ⧠āĻĻāϰāĻāĻžāϰ āĻāĻ āϏāĻžāϰā§āĻāĻŋāϏ āĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻāϏāϞ āĻāĻĨāĻž āĻšāϞ, āϏāĻžāϧāĻžāϰāĻŖ āĻā§āϞāĻā§āϞ⧠āĻā§āĻŋā§ā§ āĻāϞāϤ⧠āĻšāĻŦā§āĨ¤ āϝā§āĻŽāύāĻ āĻ āĻŦāĻā§āĻā§āĻ āĻāϰ āĻŽāϧā§āϝ⧠state āĻļā§ā§āĻžāϰ āĻāϰāĻž, mutable āĻĄāĻžāĻāĻž āĻāĻžāĻāĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž, āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻ āĻā§āϞā§āĻā§ āĻŽā§āϝāĻžāύā§āĻ āύāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻž āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤ āϝāĻĻāĻŋ āϤā§āĻŽāĻŋ āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻ āĻā§āϞā§āĻā§ āĻ āĻŋāĻāĻ āĻžāĻ āĻŽā§āϝāĻžāύā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰ āϤāĻžāĻšāϞ⧠āϤā§āĻŽāĻŋ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻžāϰāĻĻā§āϰ āĻĨā§āĻā§ āĻļāĻžāύā§āϤāĻŋāϤ⧠āĻĨāĻžāĻāĻŦā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
// Global variable referenced by following function.
// If we had another function that used this name, now it'd be an array and it could break it.
let name = "Ryan McDermott";
function splitIntoFirstAndLastName() {
name = name.split(" ");
}
splitIntoFirstAndLastName();
console.log(name); // ['Ryan', 'McDermott'];
āĻāĻžāϞ⧠āĻā§āĻĄ:
function splitIntoFirstAndLastName(name) {
return name.split(" ");
}
const name = "Ryan McDermott";
const newName = splitIntoFirstAndLastName(name);
console.log(name); // 'Ryan McDermott';
console.log(newName); // ['Ryan', 'McDermott'];
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ primitive āĻĄāĻžāĻāĻž pass-by-value āĻāĻŦāĻ āĻāϰā§/āĻ āĻŦāĻā§āĻā§āĻ pass-by-reference āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āĻĢāĻžāĻāĻļāύ⧠āϝāĻžā§āĨ¤ āĻāϰ⧠āĻāĻŦāĻ āĻ āĻŦāĻā§āĻā§āĻ āĻāϰ āĻā§āώā§āϤā§āϰā§, āϝāĻĻāĻŋ āϤā§āĻŽāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻļāĻĒāĻŋāĻ āĻāĻžāϰā§āĻ āĻāϰā§āϤ⧠āĻĄāĻžāĻāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰ⧠āϤāĻŦā§ āĻ āύā§āϝ āϝāϤ āĻĢāĻžāĻāĻļāύ cart āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻŦāĻžāϰ cart āĻāϰ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšā§ā§ āϝāĻžāĻŦā§āĨ¤ āĻāĻāĻž āĻšā§āϤ āĻāĻžāϞ āĻŽāύ⧠āĻšāĻā§āĻā§, āĻāĻāĻāĻž āĻāĻžāϰāĻžāĻĒ āĻā§āϏ āĻāĻŋāύā§āϤāĻž āĻāϰāĻž āϝāĻžāĻ,
āϧāϰ, āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϤā§āĻŽāĻžāϰ āϏāĻžāĻāĻā§āϰ "Purchase" āĻŦāĻžāĻāύ āĻ āĻā§āϞāĻŋāĻ āĻāϰāϞ, āϝā§āĻāĻž āĻāĻŋāύāĻž "purchase" āĻŽā§āĻĨāĻĄ āĻā§ āĻāϞ āĻāϰ⧠āĻāĻŦāĻ cart āĻāϰ⧠āĻā§ āύā§āĻāĻā§āĻžāϰā§āĻ āĻāϞā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϏāĻžāϰā§āĻāĻžāϰ āĻ āĻĒā§āϰā§āϰāĻŖ āĻāϰā§āĨ¤ āĻāĻžāϰāĻžāĻĒ āĻāύā§āĻāĻžāϰāύā§āĻ āĻāĻžāύā§āĻāĻļāύ āĻāϰ āĻāĻžāϰāĻŖā§, "purchase" āĻĢāĻžāĻāĻļāύāĻā§ āĻŦāĻžāϰāĻŦāĻžāϰ āύā§āĻāĻā§āĻžāϰā§āĻā§ āĻāϞ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻāĻāύ āϝāĻĻāĻŋ āĻĻā§āϰā§āĻāĻāύāĻžāĻŦāĻļāϤ āϤā§āĻŽāĻŋ "Add to cart" āĻŦāĻžāĻāύ⧠āĻā§āϞāĻŋāĻ āĻāϰ āϤāĻžāĻšāϞ⧠āύāϤā§āύ āĻāĻāĻā§āĻŽ addItemToCart āĻĢāĻžāĻāĻļāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ cart āĻāϰā§āϤ⧠āϝā§āĻ āĻšā§ā§ āϝāĻžāĻŦā§āĨ¤ āĻāĻŦāĻ āύāϤā§āύ āĻāĻāĻā§āĻŽ āϏāĻš āϤā§āĻŽāĻžāϰ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āϏāĻžāϰā§āĻāĻžāϰ āĻ āĻāϞ⧠āϝāĻžāĻŦā§āĨ¤
āĻāĻāĻžāϰ āĻā§āĻŦ āĻāĻžāϞ⧠āĻāĻāĻāĻž āϏāĻŽāĻžāϧāĻžāύ āĻšāϞ, addToItemCart āϏāĻŦ āϏāĻŽā§ cart āĻā§ āĻā§āϞā§āύ āĻāϰ⧠āύāϤā§āύ āĻāϰ⧠āĻŦāĻžāύāĻžāĻŦā§, āϤāĻžāϰāĻĒāϰ āϏā§āĻ āĻāϰā§āϤ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰ⧠āύāϤā§āύ āĻāϰ⧠āĻāĻž āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻŦā§āĨ¤ āĻāϤā§āĻāϰ⧠āĻāϏāϞ cart āĻāϰ⧠āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻĨāĻžāĻāĻŦā§āĨ¤
āĻāĻ āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠⧍ āĻāĻž āĻāĻŋāύā§āϤ⧠āĻāĻā§,
- āĻāĻŽāύ āĻšāϤ⧠āĻĒāĻžāϰ⧠āϝ⧠āϤā§āĻŽāĻžāϰ āĻāύāĻĒā§āĻ āĻ āĻŦā§āĻā§āĻā§āĻāĻāĻžāĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āĻĻāϰāĻāĻžāϰ, āĻā§āϞā§āύ āĻāϰ⧠āĻāĻžāĻ āĻšāĻā§āĻā§āύāĻžāĨ¤ āϤāĻŦā§ āĻāĻāĻž āĻā§āĻŦāĻ āĻāĻŽ āĻĻā§āĻāĻž āϝāĻžāĨ¤ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻāĻŋāύāĻŋāĻļāĻ āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻ āĻāĻžā§āĻžāĻ āϰāĻŋāĻĢā§āϝāĻžāĻā§āĻāϰ āĻāϰāĻž āϝāĻžā§āĨ¤
- āĻ āύā§āĻ āĻŦā§ āĻāĻāĻāĻž āĻ āĻŦāĻā§āĻā§āĻ āĻā§āϞā§āύ āĻāϰāĻž āĻĒāĻžāϰā§āĻĢāϰāĻŽā§āύā§āϏ āĻāϰ āĻĒā§āϰā§āĻā§āώāĻŋāϤ⧠āĻā§āĻŦāĻ āĻŦā§āϝā§āĻŦāĻšā§āϞāĨ¤ āϏā§āĻāĻžāĻā§āϝāĻŦāĻļāϤ āĻŦāĻžāϏā§āϤāĻŦā§ āĻāĻŽāύ āύāĻž, āĻāĻžāϰāĻŖ āĻāĻŋāĻā§ āĻ āϏāĻžāϧāĻžāϰāĻŖ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻāĻā§ āϝāĻžāĻĻā§āϰ āĻāĻžāϰāĻŖā§ āĻ āĻŦāĻā§āĻā§āĻ āĻā§āϞā§āύāĻŋāĻ āĻ āύā§āĻ āĻĻā§āϰā§āϤ āĻāĻŦāĻ āĻāĻŽ āĻŽā§āĻŽāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰāĻž āϝāĻžā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const addItemToCart = (cart, item) => {
cart.push({ item, date: Date.now() });
};
āĻāĻžāϞ⧠āĻā§āĻĄ:
const addItemToCart = (cart, item) => {
return [...cart, { item, date: Date.now() }];
};
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻā§āϞā§āĻŦāĻžāϞ āĻ āĻŦāĻā§āĻā§āĻ āĻ āĻāĻŋāĻā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āĻā§āĻŦāĻ āĻāĻžāϰāĻžāĻĒ āĻāĻāĻāĻŋ āĻ āĻā§āϝāĻžāϏāĨ¤ āĻāĻžāϰāĻŖ āĻ āύā§āĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻā§āϞā§āĻŦāĻžāϞ āĻ āĻŦāĻā§āĻā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ āϤā§āĻŽāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰ āĻāĻžāϰāĻŖā§ āϏā§āĻāϏāĻŦ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋāϰ āĻāĻžāĻā§āϰ āĻŦā§āϝāĻāĻžāϤ āĻāĻāĻžāϰ āϏāĻŽā§āĻāĻžāĻŦāύāĻž āĻĨāĻžāĻā§āĨ¤ āĻāĻāĻāĻž āϏāĻŽā§āĻāĻžāĻŦāύāĻž āϧāϰāĻž āϝāĻžāĻ, āĻāĻŋ āĻšāĻŦā§ āϝāĻĻāĻŋ āϤā§āĻŽāĻŋ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻĄāĻŋāĻĢāϞā§āĻ āĻāϰ⧠āĻŽā§āĻĨāĻĄ āĻ "diff" āύāĻžāĻŽāĻ āĻāĻāĻāĻŋ āĻŽā§āĻĨāĻĄ āϝā§āĻ āĻāϰ, āϝā§āĻāĻž āĻāĻŋāύāĻž ⧍ āĻāĻž āĻāϰā§āϰ āĻŽāϧā§āϝ⧠āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻĻā§āĻāĻžā§āĨ¤ āĻāĻ āĻŽā§āĻĨāĻĄāĻāĻž Array.prototype āĻ āϰāĻžāĻāϞā§, āĻ āύā§āϝ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϝāĻĻāĻŋ āĻāĻāĻ "diff" āύāĻžāĻŽāĻ āĻŽā§āĻĨāĻĄ āĻĻāĻŋā§ā§ āĻāĻāĻāĻž āĻāϰā§āϰ āĻĒā§āϰāĻĨāĻŽ āĻāĻŦāĻ āĻļā§āώ āĻāĻāĻā§āĻŽ āĻāϰ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻĻā§āĻāĻžāϤ⧠āĻāĻžā§ āϤāĻžāĻšāϞ⧠āĻāĻŋ āĻšāĻŦā§? āĻāĻ āĻāύā§āϝ ES2015/ES6 āĻāϰ āĻā§āϞāĻžāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Array āĻā§āϞā§āĻŦāĻžāϞ āĻā§ āĻāĻā§āϏāĻā§āύā§āĻĄ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻŦā§āĻļāĻŋ āĻāĻžāϞā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
Array.prototype.diff = function diff(comparisonArray) {
const hash = new Set(comparisonArray);
return this.filter(elem => !hash.has(elem));
};
āĻāĻžāϞ⧠āĻā§āĻĄ:
class SuperArray extends Array {
diff(comparisonArray) {
const hash = new Set(comparisonArray);
return this.filter(elem => !hash.has(elem));
}
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻŽā§āĻĒā§āϰāĻžāĻāĻŋāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻĨā§āĻā§ āĻĢāĻžāĻāĻļāύāĻžāϞ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻ āĻŦā§āĻļāĻŋ āĻā§āϰā§āϤā§āĻŦ āĻĻāĻžāĻ
āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻšāĻžāϏā§āĻā§āϞ āĻāϰ āĻŽāϤ āĻĢāĻžāĻāĻļāύāĻžāϞ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻ āύāĻžāĨ¤ āĻāĻŋāύā§āϤ⧠āĻāĻāĻāĻžā§ āĻāĻāϧāϰāύā§āϰ āĻĢāĻžāĻāĻļāύāĻžāϞ āĻĢā§āϞā§āĻāĻžāϰ āĻāĻā§āĨ¤ āĻĢāĻžāĻāĻļāύāĻžāϞ āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻ āĻā§āϏā§āĻ āĻāϰāĻž āϤā§āϞāύāĻžāĻŽā§āϞāĻāĻāĻžāĻŦā§ āϏāĻšāĻāĨ¤ āϝāĻāύāĻ āĻĒāĻžāϰāĻŦā§ āĻāĻ āϏā§āĻāĻžāĻāϞ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻāϰāĻŦā§,
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const programmerOutput = [
{
name: "Uncle Bobby",
linesOfCode: 500
},
{
name: "Suzie Q",
linesOfCode: 1500
},
{
name: "Jimmy Gosling",
linesOfCode: 150
},
{
name: "Gracie Hopper",
linesOfCode: 1000
}
];
let totalOutput = 0;
for (let i = 0; i < programmerOutput.length; i++) {
totalOutput += programmerOutput[i].linesOfCode;
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
const programmerOutput = [
{
name: "Uncle Bobby",
linesOfCode: 500
},
{
name: "Suzie Q",
linesOfCode: 1500
},
{
name: "Jimmy Gosling",
linesOfCode: 150
},
{
name: "Gracie Hopper",
linesOfCode: 1000
}
];
const totalOutput = programmerOutput.reduce(
(totalLines, output) => totalLines + output.linesOfCode,
0
);
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
if (fsm.state === "fetching" && isEmpty(listNode)) {
// ...
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function shouldShowSpinner(fsm, listNode) {
return fsm.state === "fetching" && isEmpty(listNode);
}
if (shouldShowSpinner(fsmInstance, listNodeInstance)) {
// ...
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function isDOMNodeNotPresent(node) {
// ...
}
if (!isDOMNodeNotPresent(node)) {
// ...
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function isDOMNodePresent(node) {
// ...
}
if (isDOMNodePresent(node)) {
// ...
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻļā§āϰā§āϤ⧠āĻāĻāĻž āĻ āϏāĻŽā§āĻāĻŦ āĻŽāύ⧠āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻŽāĻžāύā§āώ āĻāĻāĻž āĻļā§āύā§āĻ āĻŦāϞāĻŦā§, "If āϏā§āĻā§āĻāĻŽā§āύā§āĻ āĻāĻžā§āĻž āĻāĻŽāĻŋ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻŋāĻā§ āĻāϰāĻŦā§?" āĻāĻāĻžāϰ āĻāϤā§āϤāϰ āĻšāϞ, āĻāĻŽāϰāĻž "Polymorphism" āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āϤāĻāύ āϤāĻžāϰāĻž āĻāĻŋāĻā§āĻā§āϏ āĻāϰāĻŦā§, "āĻāĻāĻž āĻāĻŽāĻŋ āĻā§āύ āĻāϰāĻŦ?" āĻāĻāĻžāϰ āĻāϤā§āϤāϰ āĻšāϞ, āĻāĻŽāϰāĻž āĻāϤāĻā§āώāĻŖ āϝ⧠āĻā§āϞāĻŋāύ āĻā§āĻĄ āĻāϰ āύāĻŋā§āĻŽāύā§āϤāĻŋ āĻĒāϰ⧠āĻāϏāϞāĻžāĻŽ āϤāĻžāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻž, "āĻāĻāĻāĻž āĻĢāĻžāĻāĻļāύ āĻļā§āϧ⧠āĻāĻāĻāĻž āĻāĻžāĻ āĻāϰāĻŦā§"āĨ¤ āϝāĻāύāĻ āϤā§āĻŽāĻžāϰ āĻĢāĻžāĻāĻļāύ⧠if āĻĨāĻžāĻāĻŦā§ āϤāĻžāϰ āĻŽāĻžāύā§āĻ āĻšāϞ āϤā§āĻŽāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āĻāϰāĻā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class Airplane {
// ...
getCruisingAltitude() {
switch (this.type) {
case "777":
return this.getMaxAltitude() - this.getPassengerCount();
case "Air Force One":
return this.getMaxAltitude();
case "Cessna":
return this.getMaxAltitude() - this.getFuelExpenditure();
}
}
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
class Airplane {
// ...
}
class Boeing777 extends Airplane {
// ...
getCruisingAltitude() {
return this.getMaxAltitude() - this.getPassengerCount();
}
}
class AirForceOne extends Airplane {
// ...
getCruisingAltitude() {
return this.getMaxAltitude();
}
}
class Cessna extends Airplane {
// ...
getCruisingAltitude() {
return this.getMaxAltitude() - this.getFuelExpenditure();
}
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻĢāĻžāĻāĻļāύ āϝā§āĻā§āύ āĻāĻžāĻāĻĒā§āϰ āĻĄāĻžāĻāĻž āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ āύāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻŽāĻžāĻā§ āĻŽāϧā§āϝ⧠āĻāĻ āϏā§āĻŦāĻžāϧā§āύāϤāĻžāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāϞ āĻšā§ā§ āĻĻāĻžā§āĻžā§āĨ¤ āĻĢāĻžāĻāĻļāύā§āϰ āĻāĻŋāϤāϰ⧠āĻāĻžāĻāĻĒ āĻā§āĻ āĻāϰāĻž āĻāĻāĻāĻž āϞā§āĻāύā§ā§ āĻāĻžāĻāĨ¤ āĻāĻāĻž āĻā§āĻžāύāϰ āĻ āύā§āĻ āĻāĻĒāĻžā§ āĻāĻā§āĨ¤ āĻĒā§āϰāĻĨāĻŽ āĻāĻĨāĻž āĻšāϞ āĻāĻāĻāĻž āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function travelToTexas(vehicle) {
if (vehicle instanceof Bicycle) {
vehicle.pedal(this.currentLocation, new Location("texas"));
} else if (vehicle instanceof Car) {
vehicle.drive(this.currentLocation, new Location("texas"));
}
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function travelToTexas(vehicle) {
vehicle.move(this.currentLocation, new Location("texas"));
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āϤā§āĻŽāĻŋ āĻŦā§āϏāĻŋāĻ āĻĒā§āϰāĻŋāĻŽāĻŋāĻāĻŋāĻ āϝā§āĻŽāύ āϏā§āĻā§āϰāĻŋāĻ, āĻāύā§āĻāĻŋāĻāĻžāϰā§āϰ āĻā§āώā§āϤā§āϰ⧠polymorphism āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§ āύāĻžāĨ¤ āĻāĻŋāύā§āϤ⧠āϤāĻŦā§āĻ āϤā§āĻŽāĻžāϰ āĻšā§āϤ āĻāĻžāĻāĻĒāĻā§āĻāĻŋāĻ āĻāϰ āĻĻāϰāĻāĻžāϰ āĻĒāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϤā§āĻŽāĻŋ Typescript āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĨ¤ āĻāĻāĻž āϏāĻžāϧāĻžāϰāĻŖ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻā§āĻŦ āĻāĻžāϞ⧠āĻāĻāĻāĻž āĻŦāĻŋāĻāϞā§āĻĒāĨ¤ āĻāĻāĻž āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻāĻžāĻāĻĒāĻŋāĻ āϏāĻžāĻĒā§āϰā§āĻ āĻāϰā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻĒā§āϰāĻŦā§āϞā§āĻŽ āĻšāϞ āĻāĻāĻžā§ āĻāĻžāĻāĻĒāĻā§āĻāĻŋāĻ āĻāϰ āĻāύā§āϝ āĻ āύā§āĻ āĻāĻŋāĻā§ āĻāϰāĻž āϞāĻžāĻā§ āϝā§āĻāĻž Typescript āĻ āϞāĻžāĻāĻŦā§ āύāĻžāĨ¤ āĻāĻŦāĻžāϰāĻ āĻŦāϞāĻāĻŋ Typescript āϏāĻžāϧāĻžāϰāĻŖ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻā§āĻŦ āĻāĻžāϞ⧠āĻāĻāĻāĻž āĻŦāĻŋāĻāϞā§āĻĒāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function combine(val1, val2) {
if (
(typeof val1 === "number" && typeof val2 === "number") ||
(typeof val1 === "string" && typeof val2 === "string")
) {
return val1 + val2;
}
throw new Error("Must be of type String or Number");
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function combine(val1, val2) {
return val1 + val2;
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāϧā§āύāĻŋāĻ āĻŦā§āϰāĻžāĻāĻāĻžāϰ āĻĒāϰā§āĻĻāĻžāϰ āĻĒā§āĻāύ⧠āĻ āύā§āĻ āϧāϰāĻŖā§āϰ āĻ āĻĒāĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύ āĻāϰā§āĨ¤ āĻ āύā§āĻ āĻā§āώā§āϤā§āϰā§āĻ āϤā§āĻŽāĻžāϰ āĻ āĻĒāĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύ āϏāĻŽā§ā§āϰ āĻ āĻĒāĻā§āĨ¤ āĻāĻžāϰāĻŖ āĻŦā§āϰāĻžāĻāĻāĻžāϰ āĻāĻāĻž āύāĻŋāĻā§āĻ āĻāĻŦāĻžāϰāĻ āĻāϰāĻŦā§āĨ¤ āĻā§āĻĨāĻžā§ āĻ āĻĒāĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύ āĻĻāϰāĻāĻžāϰ āϏā§āĻāĻž āĻā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻā§āĻŦ āĻāĻžāϞ⧠āϰāĻŋāϏā§āϰā§āϏ āĻāĻā§āĨ¤ āĻāĻĒāĻžāϤāϤ āϏāĻā§āϞ⧠āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
// On old browsers, each iteration with uncached `list.length` would be costly
// because of `list.length` recomputation. In modern browsers, this is optimized.
for (let i = 0, len = list.length; i < len; i++) {
// ...
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
for (let i = 0; i < list.length; i++) {
// ...
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻ āĻŦā§āϝāĻŦāĻšā§āϤ āĻā§āĻĄ āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āĻā§āĻĄ āĻāϰ āĻŽāϤāĻ āĻāĻžāϰāĻžāĻĒāĨ¤ āϤā§āĻŽāĻžāϰ āĻā§āĻĄāĻŦā§āĻā§ āĻāĻā§āϞā§āĻā§ āϰāĻžāĻāĻžāϰ āĻā§āύ āĻāĻžāϰāĻŖ āύā§āĻāĨ¤ āϤā§āĻŽāĻŋ āύāĻŋāĻļā§āĻāĻŋāύā§āϤ⧠āĻ āĻŦā§āϝāĻŦāĻšā§āϤ āĻā§āĻĄ āĻĢā§āϞ⧠āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻžāϰāĻŖ āĻāĻā§āϞ⧠āĻāĻžāϰā§āĻļāύ āĻšāĻŋāϏā§āĻāϰāĻŋ āϤ⧠āĻĨāĻžāĻāĻŦā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function oldRequestModule(url) {
// ...
}
function newRequestModule(url) {
// ...
}
const req = newRequestModule;
inventoryTracker("apples", req, "www.inventory-awesome.io");
āĻāĻžāϞ⧠āĻā§āĻĄ:
function newRequestModule(url) {
// ...
}
const req = newRequestModule;
inventoryTracker("apples", req, "www.inventory-awesome.io");
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻ āĻŦāĻā§āĻā§āĻ āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋ āĻā§āĻāĻžāϰ āĻā§ā§ā§ āĻā§āĻāĻžāϰ āϏā§āĻāĻžāϰ āĻŽā§āĻĨāĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ āĻŦāĻā§āĻā§āĻ āĻāϰ āĻĄāĻžāĻāĻž āĻāĻā§āϏā§āϏ āĻāϰāĻž āĻāĻžāϞā§āĨ¤ āϤā§āĻŽāĻŋ āĻāĻŋāĻā§āĻā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰā§, āĻā§āύ? āύāĻŋāĻā§ āĻāĻāĻāĻž āϞāĻŋāϏā§āĻ āĻĻāĻŋā§ā§ āĻĻāĻŋāϞāĻžāĻŽ,
- āϝāĻāύ āϤā§āĻŽāĻŋ āĻ āĻŦāĻā§āĻā§āĻ āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋ āĻā§āĻāĻžāϰ āĻā§ā§ā§ āĻāϰāĻ āĻŦā§āĻļāĻŋ āĻāĻŋāĻā§ āĻāϰāϤ⧠āĻāĻžāĻ, āϤāĻāύ āϤā§āĻŽāĻžāϰ āϏāĻŦ āĻāĻā§āϏā§āϏāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āϞāĻžāĻāĻŦā§ āύāĻžāĨ¤
- setter āĻŽā§āĻĨāĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠āĻā§āϝāĻžāϞāĻŋāĻĄā§āĻļāύ āϏāĻšāĻ āĻšā§āĨ¤
- āĻ āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻ āĻĒā§āϰā§ā§āĻāύā§ā§ āĻĄāĻžāĻāĻž āĻāĻŦāĻĻā§āϧ āĻĨāĻžāĻā§
- getting āĻāĻŦāĻ setting āĻāϰ āϏāĻŽā§ āϞāĻ āĻāϰāĻž, āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻ āĻāϰāĻž āϏāĻšāĻ āĻšā§āĨ¤
- āϤā§āĻŽāĻŋ āϏāĻžāϰā§āĻāĻžāϰ āĻĨā§āĻā§ āĻĄāĻžāĻāĻž āϞā§āĻĄ āĻāϰāĻžāϰ āϏāĻŽā§ 'lazy-load' āĻāϰāϤ⧠āĻĒāĻžāϰāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function makeBankAccount() {
// ...
return {
balance: 0
// ...
};
}
const account = makeBankAccount();
account.balance = 100;
āĻāĻžāϞ⧠āĻā§āĻĄ:
function makeBankAccount() {
// this one is private
let balance = 0;
// a "getter", made public via the returned object below
function getBalance() {
return balance;
}
// a "setter", made public via the returned object below
function setBalance(amount) {
// ... validate before updating the balance
balance = amount;
}
return {
// ...
getBalance,
setBalance
};
}
const account = makeBankAccount();
account.setBalance(100);
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻ āĻŦāĻā§āĻā§āĻ āĻāϰ āĻāĻŋāϤāϰ⧠āĻĒā§āϰāĻžāĻāĻā§āĻ āĻŽā§āĻŽā§āĻŦāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ
āĻāĻāĻž āϤā§āĻŽāĻŋ 'closures' āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰāϤ⧠āĻĒāĻžāϰ(ES5 āĻāĻŦāĻ āϤāĻžāϰ āύāĻŋāĻā§)
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const Employee = function(name) {
this.name = name;
};
Employee.prototype.getName = function getName() {
return this.name;
};
const employee = new Employee("John Doe");
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: undefined
āĻāĻžāϞ⧠āĻā§āĻĄ:
function makeEmployee(name) {
return {
getName() {
return name;
}
};
}
const employee = makeEmployee("John Doe");
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
ES2015/ES6 āĻāϰ āĻā§āϞāĻžāϏāĻā§ ES5 āĻāϰ āĻĢāĻžāĻāĻļāύ āĻĨā§āĻā§ āĻŦā§āĻļāĻŋ āĻā§āϰā§āϤā§āĻŦ āĻĻāĻžāĻ
ES5 āĻāϰ āĻā§āϞāĻžāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏā§āĻĒāĻžāĻ ā§āϝ āĻā§āϞāĻžāϏ āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ, āĻāύā§āϏāĻā§āϰāĻžāĻāĻļāύ, āĻŽā§āĻĨāĻĄ āϞā§āĻāĻž āĻā§āĻŦāĻ āĻāĻ āĻŋāύāĨ¤ āϤā§āĻŽāĻžāϰ āϝāĻĻāĻŋ āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āĻĻāϰāĻāĻžāϰ āĻšā§, āϏā§āĻā§āώā§āϤā§āϰ⧠ES2015/ES6 āĻā§āϞāĻžāϏāĻā§ āĻĒā§āϰāĻžāϧāĻžāύā§āϝ āĻĻāĻžāĻāĨ¤ āϤāĻŦā§ āϝāϤāĻā§āώāĻŖ āύāĻž āϤā§āĻŽāĻžāϰ āĻŦā§ āĻāĻŦāĻ āĻāĻāĻŋāϞ āĻ āĻŦāĻā§āĻā§āĻ āĻĒā§āϰā§ā§āĻāύ āύāĻž āĻšāĻā§āĻā§ āϤāϤāĻā§āώāĻŖ āĻĒāϰā§āϝāύā§āϤ āĻā§āĻ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const Animal = function(age) {
if (!(this instanceof Animal)) {
throw new Error("Instantiate Animal with `new`");
}
this.age = age;
};
Animal.prototype.move = function move() {};
const Mammal = function(age, furColor) {
if (!(this instanceof Mammal)) {
throw new Error("Instantiate Mammal with `new`");
}
Animal.call(this, age);
this.furColor = furColor;
};
Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.constructor = Mammal;
Mammal.prototype.liveBirth = function liveBirth() {};
const Human = function(age, furColor, languageSpoken) {
if (!(this instanceof Human)) {
throw new Error("Instantiate Human with `new`");
}
Mammal.call(this, age, furColor);
this.languageSpoken = languageSpoken;
};
Human.prototype = Object.create(Mammal.prototype);
Human.prototype.constructor = Human;
Human.prototype.speak = function speak() {};
āĻāĻžāϞ⧠āĻā§āĻĄ:
class Animal {
constructor(age) {
this.age = age;
}
move() {
/* ... */
}
}
class Mammal extends Animal {
constructor(age, furColor) {
super(age);
this.furColor = furColor;
}
liveBirth() {
/* ... */
}
}
class Human extends Mammal {
constructor(age, furColor, languageSpoken) {
super(age, furColor);
this.languageSpoken = languageSpoken;
}
speak() {
/* ... */
}
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻāĻ āĻĒā§āϝāĻžāĻāĻžāϰā§āύāĻāĻŋ āĻā§āĻŦ āĻāĻĒāĻāĻžāϰ⧠āĻāĻŦāĻ āϤā§āĻŽāĻŋ āĻ āύā§āĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϝā§āĻŽāύ jQuery, Lodash āĻ āĻāϰāĻāĻŽ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āĨ¤ āĻāĻāĻž āϤā§āĻŽāĻžāϰ āĻā§āĻĄ āĻā§ āĻ āύā§āĻ āĻŦā§āĻļāĻŋ āϏāĻšāĻāĻŦā§āϧā§āϝ āĻāϰ⧠āϤā§āϞāĻŦā§āĨ¤ āĻāĻ āĻāύā§āϝ āĻŦāϞāĻŋ, āĻŽā§āĻĨāĻĄ āĻā§āĻāύāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ āĻāĻŦāĻ āĻĻā§āĻ āϤā§āĻŽāĻžāϰ āĻā§āĻĄ āĻāĻā§āϰ āĻĨā§āĻā§ āĻ āύā§āĻ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻšāĻŦā§āĨ¤ āϤā§āĻŽāĻžāϰ āĻā§āϞāĻžāϏ āĻŽā§āĻĨāĻĄā§āϰ āĻļā§āώ⧠this āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāϞā§āĻ āĻšāĻŦā§āĨ¤ āϤāĻžāϰāĻĒāϰ āϤā§āĻŽāĻŋ āϏā§āĻ āĻĢāĻžāĻāĻļāύā§āĻ āĻŽā§āĻĨāĻĄ āĻā§āĻāύāĻŋāĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class Car {
constructor(make, model, color) {
this.make = make;
this.model = model;
this.color = color;
}
setMake(make) {
this.make = make;
}
setModel(model) {
this.model = model;
}
setColor(color) {
this.color = color;
}
save() {
console.log(this.make, this.model, this.color);
}
}
const car = new Car("Ford", "F-150", "red");
car.setColor("pink");
car.save();
āĻāĻžāϞ⧠āĻā§āĻĄ:
class Car {
constructor(make, model, color) {
this.make = make;
this.model = model;
this.color = color;
}
setMake(make) {
this.make = make;
// NOTE: Returning this for chaining
return this;
}
setModel(model) {
this.model = model;
// NOTE: Returning this for chaining
return this;
}
setColor(color) {
this.color = color;
// NOTE: Returning this for chaining
return this;
}
save() {
console.log(this.make, this.model, this.color);
// NOTE: Returning this for chaining
return this;
}
}
const car = new Car("Ford", "F-150", "red").setColor("pink").save();
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āĻĨā§āĻā§ āĻāĻŽā§āĻĒā§āĻāĻŋāĻļāύ⧠āĻā§āϰā§āϤā§āĻŦ āĻĻāĻžāĻ
The gang of Four āĻāϰ āϞā§āĻāĻž āĻĄāĻŋāĻāĻžāĻāύ āĻĒā§āϝāĻžāĻāĻžāϰā§āύā§āϏ āĻŦāĻā§ā§ āĻā§āĻŦ āĻāύāĻĒā§āϰāĻŋā§ āĻāĻāĻāĻŋ āĻāĻĨāĻž āĻšāϞ, "āϝāĻāύāĻ āĻĒāĻžāϰāĻŦā§ āϤāĻāύāĻ āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āĻĨā§āĻā§ āĻāĻŽā§āĻĒā§āĻāĻŋāĻļāύ āĻā§ āĻŦā§āĻļāĻŋ āĻā§āϰā§āϤā§āĻŦ āĻĻāĻŋāĻŦā§"āĨ¤ āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāĻŦāĻ āĻāĻŽā§āĻĒā§āĻāĻŋāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻ āύā§āĻ āĻāĻžāϞ⧠āĻāĻžāϰāĻŖ āϰā§ā§āĻā§āĨ¤ āĻŽā§āĻĻā§āĻĻāĻž āĻāĻĨāĻž āĻšāϞ, āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ āϏā§āĻŦāϤāĻāϏā§āĻĢā§āϰā§āϤ āĻāĻžāĻŦā§āĻ āĻāĻŋāύā§āϤāĻž āĻāϰ āϝ⧠āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āϤā§āĻŽāĻžāϰ āϏāĻŽāϏā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻž āĻāϰāĻŦā§ āϤāĻŦā§ āĻāϰā§āĻāĻŦāĻžāϰ āĻāĻžāĻŦ āϝ⧠āĻāĻŽā§āĻĒā§āĻāĻŋāĻļāύ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāĻž āĻāϰāĻž āϝāĻžā§ āĻāĻŋāύāĻžāĨ¤ āĻ āύā§āĻ āĻā§āώā§āϤā§āϰā§āĻ āϤā§āĻŽāĻŋ āĻĒāĻžāϰāĻŦā§,
āϤā§āĻŽāĻŋ āĻšā§āϤ āĻāĻžāĻŦāϤ⧠āĻĒāĻžāϰ, "āϤāĻžāĻšāϞ⧠āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦ"? āĻāĻāĻž āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āϤā§āĻŽāĻžāϰ āĻĒā§āϰāĻŦā§āϞā§āĻŽ āĻāϰ āĻāĻĒāϰāĨ¤ āϝā§āϏāĻŦ āĻā§āώā§āϤā§āϰ⧠āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āĻāĻŽā§āĻĒāĻāĻŋāĻļāύ⧠āĻĨā§āĻā§ āĻāĻžāϞ⧠āύāĻŋāĻā§ āϤāĻžāϰ āĻāĻāĻāĻž āϞāĻŋāϏā§āĻ āĻĻāĻŋāϞāĻžāĻŽ,
- āϤā§āĻŽāĻžāϰ āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āĻ "has-a" āĻāϰ āĻŦāĻĻāϞ⧠"is-a" āϏāĻŽā§āĻĒāϰā§āĻ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύāĨ¤ (āĻŽāĻžāύā§āώ>āĻĒā§āϰāĻžāύāĻŋ vs. āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§>āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰāĻŋāϰ āϤāĻĨā§āϝ )
- āϤā§āĻŽāĻŋ āĻŦā§āĻ āĻā§āϞāĻžāϏ āĻĨā§āĻā§ āĻā§āĻĄ āĻĒā§āύāϰāĻžā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāϞā§(human can move like all animals)āĨ¤
- āϤā§āĻŽāĻŋ āĻāĻžāĻāϞā§āĻĄ āĻā§āϞāĻžāϏ⧠āĻā§āϞā§āĻŦāĻžāϞ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāύāϤ⧠āĻāĻžāĻ āĻŦā§āĻ āĻā§āϞāĻžāϏ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§āĨ¤ (Change the caloric expenditure of all animals when they move).
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class Employee {
constructor(name, email) {
this.name = name;
this.email = email;
}
// ...
}
// Bad because Employees "have" tax data. EmployeeTaxData is not a type of Employee
class EmployeeTaxData extends Employee {
constructor(ssn, salary) {
super();
this.ssn = ssn;
this.salary = salary;
}
// ...
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
class EmployeeTaxData {
constructor(ssn, salary) {
this.ssn = ssn;
this.salary = salary;
}
// ...
}
class Employee {
constructor(name, email) {
this.name = name;
this.email = email;
}
setTaxData(ssn, salary) {
this.taxData = new EmployeeTaxData(ssn, salary);
}
// ...
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻā§āϞāĻŋāύ āĻā§āĻĄ āĻŦāĻā§ā§ āϝā§āĻŽāύāĻāĻž āĻŦāϞāĻž āĻšā§ā§āĻā§, "āĻāĻāĻāĻž āĻā§āϞāĻžāϏ āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻžāϰ āĻŦā§āĻļāĻŋ āĻāĻžāϰāύ āĻĨāĻžāĻāĻž āĻāĻāĻŋāϤ āύāĻž"āĨ¤ āĻĢā§āϞāĻžāĻāĻā§ āĻāĻāĻāĻž āĻŽāĻžāϤā§āϰ āϏā§āĻāĻā§āϏ āύā§ā§āĻžāϰ āĻŽāϤ, āĻāĻāĻāĻž āĻā§āϞāĻžāϏ⧠āĻ āύā§āĻ āĻĢāĻžāĻāĻļāύ āĻĸā§āĻāĻŋā§ā§ āĻĻā§ā§āĻžāĻāĻž āĻā§āĻŦ āϞā§āĻāύā§ā§āĨ¤ āĻāĻāĻāĻž āĻā§āϞāĻžāϏ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻžāϰ āĻšāĻžāϰ āĻāĻŽāĻžāϤ⧠āĻĒāĻžāϰāĻžāĻāĻž āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āύ āĨ¤ āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ āĻā§āϞāĻžāϏ⧠āĻ āύā§āĻ āĻĢāĻžāĻāĻļāύ āϰāĻžāĻ, āϤāĻŦā§ āĻāĻāĻāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻā§āĻĨāĻžā§ āĻāĻŋāĻāĻžāĻŦā§ āĻĒā§āϰāĻāĻžāĻŦ āĻĢā§āϞāĻā§ āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻž āĻāĻ āĻŋāύ āĻšā§ā§ āϝāĻžā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class UserSettings {
constructor(user) {
this.user = user;
}
changeSettings(settings) {
if (this.verifyCredentials()) {
// ...
}
}
verifyCredentials() {
// ...
}
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
class UserAuth {
constructor(user) {
this.user = user;
}
verifyCredentials() {
// ...
}
}
class UserSettings {
constructor(user) {
this.user = user;
this.auth = new UserAuth(user);
}
changeSettings(settings) {
if (this.auth.verifyCredentials()) {
// ...
}
}
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻŦāĻžāϰāĻā§āϰāĻžāύā§āĻĄ āĻŽā§ā§āĻžāϰ āĻāϰ āĻŽāϤā§, "āϏāĻĢāĻāĻā§āĻžāϰā§āϰ āĻāĻāύāĻŋāĻ(āĻā§āϞāĻžāϏ, āĻŽāĻĄāĻŋāĻāϞāϏ, āĻĢāĻžāĻāĻļāύā§āϏ āĻāϤā§āϝāĻžāĻĻāĻŋ) āĻā§āϞ⧠āĻāĻā§āϏāĻā§āύā§āĻĄ āĻāϰāĻžāϰ āĻāύā§āϝ āĻā§āϞāĻž āĻĨāĻžāĻāϤ⧠āĻšāĻŦā§ , āĻāĻŋāύā§āϤ⧠āĻŽāĻĄāĻŋāĻĢāĻŋāĻā§āĻļāύā§āϰ āĻāύā§āϝ āĻŦāύā§āϧ āĻĨāĻžāĻāϤ⧠āĻšāĻŦā§" āĨ¤ āĻāĻāĻž āĻāϏāϞ⧠āĻāĻŋ āĻŦā§āĻāĻžā§? āĻāĻāĻž āĻĻāĻŋā§ā§ āĻāϏāϞ⧠āĻŦā§āĻāĻžā§, āϤā§āĻŽāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āύāϤā§āύ āĻĢāĻžāĻāĻļāύ āϝā§āĻ āĻāϰāϤ⧠āĻĻāĻŋāϤ⧠āĻšāĻŦā§, āĻāĻŋāύā§āϤ⧠āϝ⧠āĻĢāĻžāĻāĻļāύ āĻāĻā§ āĻĨā§āĻā§ āĻāĻā§ āϏā§āĻā§āϞ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āĻāĻāĻāĻžāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class AjaxAdapter extends Adapter {
constructor() {
super();
this.name = "ajaxAdapter";
}
}
class NodeAdapter extends Adapter {
constructor() {
super();
this.name = "nodeAdapter";
}
}
class HttpRequester {
constructor(adapter) {
this.adapter = adapter;
}
fetch(url) {
if (this.adapter.name === "ajaxAdapter") {
return makeAjaxCall(url).then(response => {
// transform response and return
});
} else if (this.adapter.name === "nodeAdapter") {
return makeHttpCall(url).then(response => {
// transform response and return
});
}
}
}
function makeAjaxCall(url) {
// request and return promise
}
function makeHttpCall(url) {
// request and return promise
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
class AjaxAdapter extends Adapter {
constructor() {
super();
this.name = "ajaxAdapter";
}
request(url) {
// request and return promise
}
}
class NodeAdapter extends Adapter {
constructor() {
super();
this.name = "nodeAdapter";
}
request(url) {
// request and return promise
}
}
class HttpRequester {
constructor(adapter) {
this.adapter = adapter;
}
fetch(url) {
return this.adapter.request(url).then(response => {
// transform response and return
});
}
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
This is a scary term for a very simple concept. It's formally defined as "If S is a subtype of T, then objects of type T may be replaced with objects of type S (i.e., objects of type S may substitute objects of type T) without altering any of the desirable properties of that program (correctness, task performed, etc.)." That's an even scarier definition.
The best explanation for this is if you have a parent class and a child class, then the base class and child class can be used interchangeably without getting incorrect results. This might still be confusing, so let's take a look at the classic Square-Rectangle example. Mathematically, a square is a rectangle, but if you model it using the "is-a" relationship via inheritance, you quickly get into trouble.
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class Rectangle {
constructor() {
this.width = 0;
this.height = 0;
}
setColor(color) {
// ...
}
render(area) {
// ...
}
setWidth(width) {
this.width = width;
}
setHeight(height) {
this.height = height;
}
getArea() {
return this.width * this.height;
}
}
class Square extends Rectangle {
setWidth(width) {
this.width = width;
this.height = width;
}
setHeight(height) {
this.width = height;
this.height = height;
}
}
function renderLargeRectangles(rectangles) {
rectangles.forEach(rectangle => {
rectangle.setWidth(4);
rectangle.setHeight(5);
const area = rectangle.getArea(); // BAD: Returns 25 for Square. Should be 20.
rectangle.render(area);
});
}
const rectangles = [new Rectangle(), new Rectangle(), new Square()];
renderLargeRectangles(rectangles);
āĻāĻžāϞ⧠āĻā§āĻĄ:
class Shape {
setColor(color) {
// ...
}
render(area) {
// ...
}
}
class Rectangle extends Shape {
constructor(width, height) {
super();
this.width = width;
this.height = height;
}
getArea() {
return this.width * this.height;
}
}
class Square extends Shape {
constructor(length) {
super();
this.length = length;
}
getArea() {
return this.length * this.length;
}
}
function renderLargeShapes(shapes) {
shapes.forEach(shape => {
const area = shape.getArea();
shape.render(area);
});
}
const shapes = [new Rectangle(4, 5), new Rectangle(4, 5), new Square(5)];
renderLargeShapes(shapes);
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āϝāĻĻāĻŋāĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āύāĻž āĻĨāĻžāĻāĻžāϰ āĻāĻžāϰāĻŖā§ āĻāĻ āύā§āϤāĻŋ āĻāĻžāĻā§ āύāĻžāĨ¤ āϤāĻŦā§, āĻāĻāĻž āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āύ āĻāĻŦāĻ āĻāύā§āϏāĻžāĻāĻāĻŋāĻāĨ¤ ISP āĻ āύā§āϝāĻžā§ā§, " āĻā§āϞāĻžā§ā§āύā§āĻ āϝ⧠āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āύāĻž āϏā§āĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻāĻžāĻĒāĻŋā§ā§ āĻĻā§ā§āĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤ " āĻāĻ āύā§āϤāĻŋāĻāĻŋ āĻŦā§āĻāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻž āĻāĻžāϞ⧠āĻāĻĻāĻžāĻšāϰāĻŖ āĻšāϞ, āĻā§āϞāĻžāϏā§āϰ āϏā§āĻāĻŋāĻ āĻ āĻŦāĻā§āĻā§āĻ āĻā§ āĻāĻŦāĻļā§āϝāĻŋāĻ āύāĻž āĻāϰāĻžāĨ¤ āĻāϤ⧠āĻāϰ⧠āϝ⧠āϏāĻāϞ āĻā§āϞāĻžāϏā§āϰ āϏā§āĻāĻŋāĻ āĻ āĻŦāĻā§āĻā§āĻ āĻ āύā§āĻ āĻŦā§ āĻāĻŦāĻ āĻā§āϞāĻžā§ā§āύā§āĻā§āϰ āϏāĻŦ āϏā§āĻāĻŋāĻ āĻĒā§āϰā§ā§āĻāύ āύā§āĻ, āϏā§āĻā§āϤā§āϰ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻž āĻŦāĻŋāĻļāĻžāϞ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāύāĻžāύ⧠āĻĨā§āĻā§ āĻŦā§āĻā§ āϝāĻžāĻāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class DOMTraverser {
constructor(settings) {
this.settings = settings;
this.setup();
}
setup() {
this.rootNode = this.settings.rootNode;
this.animationModule.setup();
}
traverse() {
// ...
}
}
const $ = new DOMTraverser({
rootNode: document.getElementsByTagName("body"),
animationModule() {} // Most of the time, we won't need to animate when traversing.
// ...
});
āĻāĻžāϞ⧠āĻā§āĻĄ:
class DOMTraverser {
constructor(settings) {
this.settings = settings;
this.options = settings.options;
this.setup();
}
setup() {
this.rootNode = this.settings.rootNode;
this.setupOptions();
}
setupOptions() {
if (this.options.animationModule) {
// ...
}
}
traverse() {
// ...
}
}
const $ = new DOMTraverser({
rootNode: document.getElementsByTagName("body"),
options: {
animationModule() {}
}
});
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻ āĻŽā§āϞāύā§āϤāĻŋ ⧍āĻāĻž āĻā§āϰāϤā§āϤāĻĒā§āϰā§āύ āĻāĻŋāύāĻŋāϏ āĻŦāϞ⧠āĻĨāĻžāĻā§,
- āĻšāĻžāĻ āϞā§āĻā§āϞ āĻŽāĻĄāĻŋāĻāϞ āĻāĻāύā§āĻ āϞ⧠āϞā§āĻā§āϞ āĻŽāĻĄāĻŋāĻāϞ āĻāϰ āĻāĻĒāϰ⧠āύāĻŋāϰā§āĻāϰ āĻāϰāĻŦā§ āύāĻžāĨ¤
- āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύ āĻĄāĻŋāĻā§āĻāϞā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰāĻŦā§āύ āύāĻžāĨ¤ āĻĄāĻŋāĻā§āĻāϞ āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύā§āϰ āĻāĻĒāϰ⧠āύāĻŋāϰā§āĻāϰ āĻāϰāĻŦā§āĨ¤
āĻšā§āϤ āϏāĻšāĻā§ āĻŦā§āĻāĻŦā§ āύāĻž, āĻāĻŋāύā§āϤ⧠āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ AngularJS āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĨāĻžāĻ, āϤāĻžāĻšāϞ⧠āĻāĻ āĻŽā§āϞāύā§āϤāĻŋāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĻā§āĻāĻžāϰ āĻāĻĨāĻžāĨ¤ AngularJS āĻĄāĻŋāĻĒā§āύā§āĻĄā§āύā§āϏāĻŋ āĻāύāĻā§āĻāĻļāύā§āϰ āĻŽāϧā§āϝ⧠āĻāĻ āĻŽā§āϞāύā§āϤāĻŋāϰ āĻĒā§āϰā§ā§āĻ āĻāϰā§āĨ¤ āϝāĻĻāĻŋāĻ ā§¨ āĻāĻž āĻāĻāĻ āϧāĻžāϰāĻŖāĻž āύāĻžāĨ¤ DIP āĻšāĻžāĻ āϞā§āĻā§āϞ āĻŽāĻĄāĻŋāĻāϞ āĻā§ āϞ⧠āϞā§āĻā§āϞ āĻŽāĻĄāĻŋāĻāϞ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻžāύāϤ⧠āĻŦāĻžāϧāĻž āĻĻā§ā§āĨ¤ āĻāĻāĻžāϰ āĻ āύā§āĻ āĻŦā§ āĻāĻĒāĻāĻžāϰ āĻšāϞ, āĻāĻāĻž āĻŽāĻĄāĻŋāĻāϞāĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠āĻā§āύ āĻŦāύā§āϧāύ āϰāĻžāĻā§āύāĻžāĨ¤ āĻāĻžāĻĒāϞāĻŋāĻ āĻā§āĻĄ āϰā§āĻĢā§āϝāĻžāĻā§āĻāϰā§āϰ āĻāύā§āϝ āĻā§āĻŦ āĻāĻžāϰāĻžāĻĒ āĻāĻāĻāĻž āĻāĻŋāύāĻŋāϏāĨ¤
āĻāĻā§āĻ āĻŦāϞāĻž āĻšā§ā§āĻā§, āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻā§āύ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āύāĻžāĻ, āϏā§āϤāϰāĻžāĻ, āĻāĻāĻžāύ⧠āĻ ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύ āĻ āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§āĨ¤ āĻŽāĻžāύ⧠āĻāĻāĻāĻž āĻā§āϞāĻžāϏ/āĻ āĻŦāĻā§āĻā§āĻ āĻ āύā§āϝ āĻā§āϞāĻžāϏ āĻŦāĻž āĻ āĻŦāĻā§āĻā§āĻ āĻāϰ āĻāύā§āϝ āύāĻŋāĻā§āϰ āϝ⧠āĻŽā§āĻĨāĻĄ āĻŦāĻž āĻŽā§āĻŽā§āĻŦāĻžāϰ āĻā§āϞ⧠āĻāύā§āĻŽā§āĻā§āϤ āĻāϰ⧠āĻĻā§ā§ āϤāĻžāĻĻā§āϰāĻā§ āĻāĻŽāϰāĻž āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻŦāϞāĻāĻŋāĨ¤ āύāĻŋāĻā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§, inventoryTracker āĻāϰ āϝā§āĻā§āύ⧠āĻŽāĻĄāĻŋāĻāϞ āĻ requestitems āĻŽā§āĻĨāĻĄ āĻĨāĻžāĻāĻžāĻāĻžāĻ implicit āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class InventoryRequester {
constructor() {
this.REQ_METHODS = ["HTTP"];
}
requestItem(item) {
// ...
}
}
class InventoryTracker {
constructor(items) {
this.items = items;
// BAD: We have created a dependency on a specific request implementation.
// We should just have requestItems depend on a request method: `request`
this.requester = new InventoryRequester();
}
requestItems() {
this.items.forEach(item => {
this.requester.requestItem(item);
});
}
}
const inventoryTracker = new InventoryTracker(["apples", "bananas"]);
inventoryTracker.requestItems();
āĻāĻžāϞ⧠āĻā§āĻĄ:
class InventoryTracker {
constructor(items, requester) {
this.items = items;
this.requester = requester;
}
requestItems() {
this.items.forEach(item => {
this.requester.requestItem(item);
});
}
}
class InventoryRequesterV1 {
constructor() {
this.REQ_METHODS = ["HTTP"];
}
requestItem(item) {
// ...
}
}
class InventoryRequesterV2 {
constructor() {
this.REQ_METHODS = ["WS"];
}
requestItem(item) {
// ...
}
}
// By constructing our dependencies externally and injecting them, we can easily
// substitute our request module for a fancy new one that uses WebSockets.
const inventoryTracker = new InventoryTracker(
["apples", "bananas"],
new InventoryRequesterV2()
);
inventoryTracker.requestItems();
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻĒā§āϰā§āĻĄāĻžāĻā§āĻ āĻļāĻŋāĻĒāĻŋāĻ āĻāϰ āĻĨā§āĻā§ āĻā§āϏā§āĻāĻŋāĻ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āύ āĨ¤ āϝāĻĻāĻŋ āϤā§āĻŽāĻŋ āĻāĻžāϞāĻāĻžāĻŦā§ āĻā§āϏā§āĻ āύāĻž āĻāϰ āĻŦāĻž āĻāĻŽ āĻā§āϏā§āĻ āĻāϰ, āϤāĻžāĻšāϞ⧠āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻļāĻŋāĻĒāĻŋāĻ āĻāϰ āϏāĻŽā§ āϤā§āĻŽāĻŋ āύāĻŋāĻļā§āĻāĻŋāϤ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰāĻŦā§ āύāĻžāĨ¤ āĻĒāϰā§āϝāĻžāĻĒā§āϤ āĻā§āϏā§āĻ āĻŦāϞāϤ⧠āĻāĻŋ āĻŦā§āĻāĻžā§ āϏā§āĻāĻž āϤā§āĻŽāĻžāϰ āĻāĻŋāĻŽ āĻāϰ āĻāĻĒāϰ āĻĄāĻŋāĻĒā§āύā§āĻĄ āĻāϰā§āĨ¤ āϤāĻŦā§ ā§§ā§Ļā§Ļ% āĻā§āϏā§āĻ āĻāĻāĻžāϰā§āĻ āĻĨāĻžāĻāϞ⧠āϤā§āĻŽāĻŋ āĻ āύā§āĻ āĻŦā§āĻļāĻŋ āĻāϤā§āĻŽāĻŦāĻŋāĻļā§āĻŦāĻžāϏ⧠āĻāĻŦāĻ āĻĄā§āĻā§āϞāĻĒā§āϰ āĻšāĻŋāϏā§āĻŦā§ āĻļāĻžāύā§āϤāĻŋ āϤ⧠āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰāĻŦā§āĨ¤ āϤāĻžāϰ āĻŽāĻžāύ⧠āĻšāϞ āĻāĻžāϞ⧠āĻā§āϏā§āĻāĻŋāĻ āĻĢā§āϰā§āĻŽāĻā§āĻžāϰā§āĻ āĻāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāĻžāϞ⧠āĻāĻāĻžāϰā§āĻ āĻā§āϞ āĻ āĻĒā§āϰā§ā§āĻāύāĨ¤
āĻā§āϏā§āĻ āύāĻž āϞā§āĻāĻžāϰ āĻā§āύ āĻ āĻā§āĻšāĻžāϤ āύā§āĻāĨ¤ āĻ āύā§āĻ āĻāĻžāϞ⧠āĻā§āϏā§āĻ āĻĢā§āϰā§āĻŽāĻā§āĻžāϰā§āĻ āĻāĻā§āĨ¤ āϏā§āϤāϰāĻžāĻ, āϤā§āĻŽāĻžāϰ āĻāĻŋāĻŽ āϝā§āĻāĻž āĻĒāĻāύā§āĻĻ āĻāϰ⧠āϏā§āĻāĻž āĻŦā§āĻā§ āύāĻžāĻāĨ¤ āϤāĻžāϰāĻĒāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āύāϤā§āύ āĻĢāĻŋāĻāĻžāϰ, āĻŽāĻĄāĻŋāĻāϞ āϞā§āĻāĻžāϰ āϏāĻŽā§ āĻā§āϏā§āĻ āϞā§āĻāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĨ¤ āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ Test Driven Development āĻĒāĻāύā§āĻĻ āĻāϰ āϤāĻžāĻšāϞ⧠āĻā§āĻŦ āĻāĻžāϞā§āĨ¤ āϤāĻŦā§ āĻāϏāϞ āĻāĻĨāĻž āĻšāϞ, āĻĒā§āϰāϤāĻŋāĻāĻŋ āύāϤā§āύ āĻĢāĻŋāĻāĻžāϰ āĻļāĻŋāĻĒāĻŋāĻ āĻāϰ āĻāĻā§ āĻā§āϏā§āĻ āĻāĻāĻžāϰā§āĻ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻžāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
import assert from "assert";
describe("MomentJS", () => {
it("handles date boundaries", () => {
let date;
date = new MomentJS("1/1/2015");
date.addDays(30);
assert.equal("1/31/2015", date);
date = new MomentJS("2/1/2016");
date.addDays(28);
assert.equal("02/29/2016", date);
date = new MomentJS("2/1/2015");
date.addDays(28);
assert.equal("03/01/2015", date);
});
});
āĻāĻžāϞ⧠āĻā§āĻĄ:
import assert from "assert";
describe("MomentJS", () => {
it("handles 30-day months", () => {
const date = new MomentJS("1/1/2015");
date.addDays(30);
assert.equal("1/31/2015", date);
});
it("handles leap year", () => {
const date = new MomentJS("2/1/2016");
date.addDays(28);
assert.equal("02/29/2016", date);
});
it("handles non-leap year", () => {
const date = new MomentJS("2/1/2015");
date.addDays(28);
assert.equal("03/01/2015", date);
});
});
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāϞāĻŦā§āϝāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻāϰā§, āĻĒā§āϰāĻŽāĻŋāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ
āĻāϞāĻŦā§āϝāĻžāĻ āĻŽā§āĻĨāĻĄ āĻ āύā§āĻ āĻŦā§āĻļāĻŋ āύā§āϏā§āĻāĻŋāĻ āϤā§āϰāĻŋ āĻāϰā§āĨ¤ ES2015/ES6 āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻŋāϏ āĻā§āϞā§āĻŦāĻžāϞ āĻāĻžāĻāĻĒ āĻšāĻŋāϏā§āĻŦā§ āĻĻā§ā§āĻž āĻāĻā§, āϏā§āĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
import { get } from "request";
import { writeFile } from "fs";
get(
"https://en.wikipedia.org/wiki/Robert_Cecil_Martin",
(requestErr, response, body) => {
if (requestErr) {
console.error(requestErr);
} else {
writeFile("article.html", body, writeErr => {
if (writeErr) {
console.error(writeErr);
} else {
console.log("File written");
}
});
}
}
);
āĻāĻžāϞ⧠āĻā§āĻĄ:
import { get } from "request-promise";
import { writeFile } from "fs-extra";
get("https://en.wikipedia.org/wiki/Robert_Cecil_Martin")
.then(body => {
return writeFile("article.html", body);
})
.then(() => {
console.log("File written");
})
.catch(err => {
console.error(err);
});
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāϞāĻŦā§āϝāĻžāĻā§āϰ āϤā§āϞāύāĻžā§ āĻĒā§āϰāĻŽāĻŋāϏ āĻ āύā§āĻ āĻāĻžāϞāĨ¤ āĻāĻŋāύā§āϤ⧠ES2017/ES8 āĻāϰ āϏāĻžāĻĨā§ asnyc āĻāĻŦāĻ await āĻāĻā§, āϝā§āĻāĻž āĻāϰāĻ āĻāĻžāϞ⧠āϏāĻŽāĻžāϧāĻžāύ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϤā§āĻŽāĻžāϰ āĻļā§āϧ⧠āĻĢāĻžāĻāĻļāύā§āϰ āĻāĻā§ async āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āϝāĻĻāĻŋ ES2017/ES8 āĻāϰ āϏā§āĻŦāĻŋāϧāĻž āύāĻŋāϤ⧠āĻĒāĻžāϰ āϤāĻžāĻšāϞ⧠āĻāĻ āĻĨā§āĻā§āĻ async āĻāĻŦāĻ await āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
import { get } from "request-promise";
import { writeFile } from "fs-extra";
get("https://en.wikipedia.org/wiki/Robert_Cecil_Martin")
.then(body => {
return writeFile("article.html", body);
})
.then(() => {
console.log("File written");
})
.catch(err => {
console.error(err);
});
āĻāĻžāϞ⧠āĻā§āĻĄ:
import { get } from "request-promise";
import { writeFile } from "fs-extra";
async function getCleanCodeArticle() {
try {
const body = await get(
"https://en.wikipedia.org/wiki/Robert_Cecil_Martin"
);
await writeFile("article.html", body);
console.log("File written");
} catch (err) {
console.error(err);
}
}
getCleanCodeArticle()
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāϰāϰ āĻĨā§āϰ⧠āĻāϰāĻž āĻāĻāĻāĻŋ āĻāĻžāϞ āĻāĻŋāύāĻŋāĻļāĨ¤ āϤāĻžāϰ āĻŽāĻžāύ⧠āĻšāϞ āϤā§āĻŽāĻžāϰ āϰāĻžāύāĻāĻžāĻāĻŽ āĻŦā§āĻāϤ⧠āĻĒā§āϰā§āĻā§ āϝ⧠āĻāĻŋāĻā§ āĻāĻāĻāĻž āϏāĻŽāϏā§āϝāĻž āĻāĻā§āĨ¤
āĻāϰāϰ āĻĒā§āϞ⧠āϏā§āĻāĻž āύāĻŋā§ā§ āĻāĻŋāĻā§ āύāĻž āĻāϰāϞ⧠āϤā§āĻŽāĻŋ āĻāϰāϰ āĻāϰ āĻāĻžāϰāĻŖ āĻŦā§āϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§ āύāĻž āĻāĻŦāĻ āϤāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰāĻŦā§ āύāĻžāĨ¤ āĻāύāϏā§āϞ⧠āĻāϰāϰ āϞāĻ āĻāϰāĻž āϤā§āĻŽāύ āĻāĻžāϞ āĻā§āύ āϏāĻŽāĻžāϧāĻžāύ āύāĻžāĨ¤ āĻāĻāĻž āĻāύāϏā§āϞ⧠āĻĒā§āϰāĻŋāύā§āĻ āĻšāĻā§āĻž āĻšāĻžāĻāĻžāϰāĻ āĻāĻŋāύāĻŋāϏā§āϰ āĻāĻŋā§ā§ āĻšāĻžāϰāĻŋā§ā§ āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝāĻĻāĻŋ āϤā§āĻŽāĻŋ āϤā§āĻŽāĻžāϰ āĻā§āĻĄ āĻā§ try/catch āĻŦā§āϞāĻ āĻ āĻāĻŦāĻĻā§āϧ āĻāϰ āϤāĻžāϰ āĻŽāĻžāύ⧠āĻšāϞ āϤā§āĻŽāĻŋ āĻ āύā§āĻŽāĻžāύ āĻāϰāϤ⧠āĻĒāĻžāϰāĻ āĻāĻāĻžāύ⧠āĻāĻāĻāĻž āĻāϰāϰ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϏā§āϤāϰāĻžāĻ āϏā§āĻā§āώā§āϤā§āϰ⧠āϤā§āĻŽāĻžāϰ āĻāĻāĻāĻž āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻž āĻĨāĻžāĻāĻž āĻāĻāĻŋāϤāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
try {
functionThatMightThrow();
} catch (error) {
console.log(error);
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
try {
functionThatMightThrow();
} catch (error) {
// One option (more noisy than console.log):
console.error(error);
// Another option:
notifyUserOfError(error);
// Another option:
reportErrorToService(error);
// OR do all three!
}
āϝā§āĻāĻžāϰāύ⧠try/catch āĻ āϧāϰāĻž āĻāϰāϰ āĻā§ āĻ āĻŦāĻā§āĻāĻž āĻāϰāĻŦā§ āύāĻžāĨ¤ āĻāĻāĻ āĻāĻžāϰāĻŖā§ āϰāĻŋāĻā§āĻā§āĻā§āĻĄ āĻĒā§āϰāĻŽāĻŋāϏāĻā§āĻ āĻ āĻŦāĻā§āĻāĻž āĻāϰāĻŦā§ āύāĻžāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
getdata()
.then(data => {
functionThatMightThrow(data);
})
.catch(error => {
console.log(error);
});
āĻāĻžāϞ⧠āĻā§āĻĄ:
getdata()
.then(data => {
functionThatMightThrow(data);
})
.catch(error => {
// One option (more noisy than console.log):
console.error(error);
// Another option:
notifyUserOfError(error);
// Another option:
reportErrorToService(error);
// OR do all three!
});
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻĢāϰāĻŽā§āϝāĻžāĻāĻŋāĻ āĻāĻāĻāĻž āϏāĻžāĻŦā§āĻā§āĻāĻŋāĻ āĻŦā§āϝāĻĒāĻžāϰāĨ¤ āĻāĻāĻžāύ⧠āĻ āύā§āϝ⧠āϰā§āϞā§āϰ āĻŽāϤāĻ āĻĢāϰāĻŽā§āϝāĻžāĻāĻŋāĻ āĻāϰ āĻ āĻā§āύ āϧāϰāĻžāĻŦāĻžāĻāϧāĻž āύāĻŋā§āĻŽ āύā§āĻāĨ¤ āĻāϏāϞ āĻāĻĨāĻž āĻšāϞ, āĻāĻāύ⧠āĻĢāϰāĻŽā§āϝāĻžāĻāĻŋāĻ āύāĻŋā§ā§ āϤāϰā§āĻ āĻāϰāĻŦā§ āύāĻžāĨ¤ āĻ āύā§āĻ āĻā§āϞāϏāĻāĻā§ āĻāĻ āĻāĻžāĻ āĻāĻž āĻ āĻā§āĻŽā§āϝāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝāĨ¤ āϝā§āĻā§āύ⧠āĻāĻāĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĨ¤ āĻĢāϰāĻŽā§āϝāĻžāĻāĻŋāĻ āύāĻŋā§ā§ āϤāϰā§āĻ āĻāϰāĻž āϏāĻŽā§ā§āϰ āĻ āĻĒāĻā§ āĻāϰāĻž āĻāĻžā§āĻž āĻāϰ āĻāĻŋāĻā§ āύāĻžāĨ¤
āϝā§āĻā§āϞ⧠āĻ āĻā§ āĻĢāϰāĻŽā§āϝāĻžāĻāĻŋāĻ āĻāϰ āĻāĻāϤāĻžā§ āĻĒāϰ⧠āύāĻž āϏā§āĻā§āϞā§āϰ āĻāύā§āϝ āύāĻŋāĻā§ āĻāĻŋāĻā§ āύāĻŋā§āĻŽ āĻĻā§ā§āĻž āĻāĻā§āĨ¤
āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ āĻā§āϝāĻžāĻĒāĻŋāĻāĻžāϞāĻžāĻāϝā§āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĨ¤
āϝā§āĻšā§āϤ⧠āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāύā§āĻāĻžāĻāĻĒāĻĄ āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻ, āϤāĻžāĻ āϝāĻĨāĻžāϝāĻĨ āĻā§āϝāĻžāĻĒāĻŋāĻāĻžāϞāĻžāĻāĻā§āĻļāύ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āϏāĻŽā§āĻĒāϰā§āĻā§ āϤāĻĨā§āϝ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻ āύāĻŋā§āĻŽāĻā§āϞā§āĻ āϏāĻžāĻŦā§āĻā§āĻā§āĻāĻŋāĻ, āϤāĻžāĻ āϤā§āĻŽāĻžāĻĻā§āϰ āĻāĻŋāĻŽ āĻāϰ āϏā§āĻŦāĻŋāϧāĻž āĻŽāϤ āĻāĻāĻāĻž āĻŦā§āĻā§ āύāĻŋāϞā§āĻ āĻšāĻŦā§āĨ¤ āϤāĻŦā§ āϝā§āĻāĻžāĻ āĻŦā§āĻā§ āύāĻžāĻ āύāĻž āĻā§āύ āϏā§āĻāĻžāϤā§āĻ āϏā§āĻĨāĻŋāϰ āĻĨā§āĻā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
const DAYS_IN_WEEK = 7;
const daysInMonth = 30;
const songs = ["Back In Black", "Stairway to Heaven", "Hey Jude"];
const Artists = ["ACDC", "Led Zeppelin", "The Beatles"];
function eraseDatabase() {}
function restore_database() {}
class animal {}
class Alpaca {}
āĻāĻžāϞ⧠āĻā§āĻĄ:
const DAYS_IN_WEEK = 7;
const DAYS_IN_MONTH = 30;
const SONGS = ["Back In Black", "Stairway to Heaven", "Hey Jude"];
const ARTISTS = ["ACDC", "Led Zeppelin", "The Beatles"];
function eraseDatabase() {}
function restoreDatabase() {}
class Animal {}
class Alpaca {}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āϝāĻĻāĻŋ āĻāĻāĻāĻž āĻĢāĻžāĻāĻļāύ āĻ āύā§āϝ āĻāĻāĻāĻžāĻā§ āĻāϞ āĻāϰā§, āϤāĻŦā§ āĻā§āώā§āĻāĻž āĻāϰāĻŦā§ āĻāĻĻā§āϰāĻā§ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āϰāĻžāĻāϤā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
class PerformanceReview {
constructor(employee) {
this.employee = employee;
}
lookupPeers() {
return db.lookup(this.employee, "peers");
}
lookupManager() {
return db.lookup(this.employee, "manager");
}
getPeerReviews() {
const peers = this.lookupPeers();
// ...
}
perfReview() {
this.getPeerReviews();
this.getManagerReview();
this.getSelfReview();
}
getManagerReview() {
const manager = this.lookupManager();
}
getSelfReview() {
// ...
}
}
const review = new PerformanceReview(employee);
review.perfReview();
āĻāĻžāϞ⧠āĻā§āĻĄ:
class PerformanceReview {
constructor(employee) {
this.employee = employee;
}
perfReview() {
this.getPeerReviews();
this.getManagerReview();
this.getSelfReview();
}
getPeerReviews() {
const peers = this.lookupPeers();
// ...
}
lookupPeers() {
return db.lookup(this.employee, "peers");
}
getManagerReview() {
const manager = this.lookupManager();
}
lookupManager() {
return db.lookup(this.employee, "manager");
}
getSelfReview() {
// ...
}
}
const review = new PerformanceReview(employee);
review.perfReview();
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏ āĻŦāĻŋāĻāύā§āϏ āϞāĻāĻŋāĻ āϏāĻŽā§āĻĻā§āϧ āĻā§āĻĄā§āϰ āĻā§āώā§āϤā§āϰ⧠āĻāĻŽā§āύā§āĻ āĻāϰāĻŦā§āĨ¤
āĻāĻŽā§āύā§āĻ āĻšāĻā§āĻā§ āĻāĻāϧāϰāύā§āϰ āĻā§āώāĻŽāĻž āĻĒā§āϰāĻžāϰā§āĻĨāύāĻžāĨ¤ āĻāĻžāϰāĻŖ āĻāĻžāϞ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻā§āώā§āϤā§āϰā§āĻ āύāĻŋāĻā§āĻ āύāĻŋāĻā§āϰ āĻĄāĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏāĻŦā§ āĻāĻžāĻ āĻāϰā§, āĻāĻŽā§āύā§āĻ āĻāϰāĻžāϰ āĻĻāϰāĻāĻžāϰ āĻĒāϰ⧠āύāĻžāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
function hashIt(data) {
// The hash
let hash = 0;
// Length of string
const length = data.length;
// Loop through every character in data
for (let i = 0; i < length; i++) {
// Get character code.
const char = data.charCodeAt(i);
// Make the hash
hash = (hash << 5) - hash + char;
// Convert to 32-bit integer
hash &= hash;
}
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function hashIt(data) {
let hash = 0;
const length = data.length;
for (let i = 0; i < length; i++) {
const char = data.charCodeAt(i);
hash = (hash << 5) - hash + char;
// Convert to 32-bit integer
hash &= hash;
}
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻžāϰā§āĻļāύ āĻāύā§āĻā§āϰā§āϞ āϤā§āϰāĻŋ āĻšāĻā§āĻžāϰ āĻāĻāĻāĻž āĻāĻžāϰāĻŖ āĻāĻā§āĨ¤ āĻĒā§āϰāĻžāϤāύ āĻā§āĻĄ āϤā§āĻŽāĻžāϰ āĻšāĻŋāϏā§āĻā§āϰāĻŋāϤā§āĻ āĻĨāĻžāĻāĻŦā§, āĻāĻŽā§āύā§āĻ āĻāϰ⧠āϰāĻžāĻāĻžāϰ āĻĻāϰāĻāĻžāϰ āύā§āĻāĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
doStuff();
// doOtherStuff();
// doSomeMoreStuff();
// doSoMuchStuff();
āĻāĻžāϞ⧠āĻā§āĻĄ:
doStuff();
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻŽāύ⧠āϰāĻžāĻāĻŦā§, āĻāĻžāϰā§āĻļāύ āĻāύā§āĻā§āϰā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ git log
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ āĻšāĻŋāϏā§āĻā§āϰāĻŋ āĻĻā§āĻāϤā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
/**
* 2016-12-20: Removed monads, didn't understand them (RM)
* 2016-10-01: Improved using special monads (JP)
* 2016-02-03: Removed type-checking (LI)
* 2015-03-14: Added combine with type-checking (JR)
*/
function combine(a, b) {
return a + b;
}
āĻāĻžāϞ⧠āĻā§āĻĄ:
function combine(a, b) {
return a + b;
}
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
āĻāĻā§āϞ⧠āĻāϏāϞ⧠āĻļā§āϧ⧠āϏāĻŽāϏā§āϝāĻž āϤā§āϰāĻŋ āĻāϰā§āĨ¤
āĻāĻžāϰāĻžāĻĒ āĻā§āĻĄ:
////////////////////////////////////////////////////////////////////////////////
// Scope Model Instantiation
////////////////////////////////////////////////////////////////////////////////
$scope.model = {
menu: "foo",
nav: "bar"
};
////////////////////////////////////////////////////////////////////////////////
// Action setup
////////////////////////////////////////////////////////////////////////////////
const actions = function() {
// ...
};
āĻāĻžāϞ⧠āĻā§āĻĄ:
$scope.model = {
menu: "foo",
nav: "bar"
};
const actions = function() {
// ...
};
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§
This is also available in other languages:
French: GavBaros/clean-code-javascript-fr
Brazilian Portuguese: fesnt/clean-code-javascript
Spanish: andersontr15/clean-code-javascript
Spanish: tureey/clean-code-javascript
Simplified Chinese:
Traditional Chinese: AllJointTW/clean-code-javascript
German: marcbruederlin/clean-code-javascript
Korean: qkraudghgh/clean-code-javascript-ko
Polish: greg-dev/clean-code-javascript-pl
Russian:
Vietnamese: hienvd/clean-code-javascript/
Japanese: mitsuruog/clean-code-javascript/
Indonesia: andirkh/clean-code-javascript/
Italian: frappacchio/clean-code-javascript/
Bangla(āĻŦāĻžāĻāϞāĻž): InsomniacSabbir/clean-code-javascript/
âŦ āĻāĻĒāϰ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϤ⧠āĻšāĻŦā§