āĻāĻ¸āĻ˛ āĻ°āĻŋāĻĒā§āĻāĻŋāĻāĻ°āĻŋ: 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/
âŦ āĻāĻĒāĻ°ā§ āĻĢāĻŋāĻ°ā§ āĻ¯ā§āĻ¤ā§ āĻāĻāĻžāĻ¨ā§ āĻā§āĻ˛āĻŋāĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§