Skip to content

dev-sabbir/clean-code-javascript

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

āĻ†āĻ¸āĻ˛ āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋ: ryanmcdermott/clean-code-javascript

clean-code-javascript

āĻ¸ā§‚āĻšāĻŋāĻĒāĻ¤ā§āĻ°

  1. āĻ­ā§‚āĻŽāĻŋāĻ•āĻž
  2. āĻ­ā§āĻ¯āĻžāĻ°āĻŋā§Ÿā§‡āĻŦāĻ˛āĻ¸
  3. āĻĢāĻžāĻ‚āĻļāĻ¨āĻ¸
  4. āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻāĻŦāĻ‚ āĻĄāĻžāĻŸāĻž āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ°
  5. āĻ•ā§āĻ˛āĻžāĻ¸
  6. āĻ¸āĻ˛āĻŋāĻĄ(SOLID)
  7. āĻŸā§‡āĻ¸ā§āĻŸāĻŋāĻ‚
  8. āĻ•āĻ¨āĻ•āĻžāĻ°ā§‡āĻ¨ā§āĻ¸āĻŋ
  9. āĻāĻ°āĻ° āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻŋāĻ‚
  10. āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻŸāĻŋāĻ‚
  11. āĻ•āĻŽā§‡āĻ¨ā§āĻŸāĻ¸
  12. āĻ…āĻ¨ā§āĻŦāĻžāĻĻ

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

Humorous image of software quality estimation as a count of how many expletives you shout when reading code

āĻāĻ–āĻžāĻ¨ā§‡ āĻ°āĻŦāĻžāĻ°ā§āĻŸ āĻ¸āĻŋ. āĻŽāĻžāĻ°ā§āĻŸāĻŋāĻ¨ āĻāĻ° 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 āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĨ¤ āĻāĻŸāĻžāĻ° āĻ•āĻŋāĻ›ā§ āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻ†āĻ›ā§‡,

  1. āĻ¯āĻ–āĻ¨ āĻ•ā§‡āĻ‰ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¸āĻŋāĻ—āĻ¨ā§‡āĻšāĻžāĻ° āĻĻā§‡āĻ–āĻŦā§‡ āĻ¤āĻ–āĻ¨āĻŋ āĻŦā§āĻā§‡ āĻĢā§‡āĻ˛āĻŦā§‡ āĻ•āĻŋ āĻ•āĻŋ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻĻā§‡ā§ŸāĻž āĻšāĻšā§āĻ›ā§‡ āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡āĨ¤
  2. Destructring āĻ•āĻ°āĻ˛ā§‡, āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ āĻ¯ā§‡ āĻĒā§āĻ°āĻŋāĻŽāĻŋāĻŸāĻŋāĻ­ āĻ­ā§āĻ¯āĻžāĻ˛ā§ āĻĻā§‡ā§ŸāĻž āĻšā§Ÿā§‡āĻ›ā§‡ āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻšā§Ÿā§‡ āĻ¯āĻžā§ŸāĨ¤ āĻ¯āĻž āĻ•āĻŋāĻ¨āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§‡ āĻ¸āĻžāĻ‡āĻĄ āĻ‡āĻĢā§‡āĻ•ā§āĻŸ āĻĒā§āĻ°āĻ¤āĻŋāĻ°ā§‹āĻ§ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻšāĻžā§ŸāĻ¤āĻž āĻ•āĻ°ā§‡āĨ¤ āĻ¤āĻŦā§‡ āĻŽāĻžāĻĨāĻžā§Ÿ āĻ°āĻžāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡, āĻ¯āĻĻāĻŋ āĻāĻ°ā§‡ āĻŦāĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ destructure āĻ•āĻ°āĻž āĻšā§Ÿ, āĻ¸ā§‡āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻāĻ°āĻž āĻ•ā§āĻ˛ā§‹āĻ¨ āĻšā§Ÿ āĻ¨āĻžāĨ¤
  3. āĻ…āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ˛ā§€āĻ¨āĻŸāĻžāĻ° āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻšā§‡āĻ˛ā§āĻĒ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ 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'];

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

āĻ¸āĻžāĻ‡āĻĄ āĻ‡āĻĢā§‡āĻ•ā§āĻŸ āĻā§œāĻŋā§Ÿā§‡ āĻšāĻ˛āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻĒāĻžāĻ°ā§āĻŸ-2)

āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‡ primitive āĻĄāĻžāĻŸāĻž pass-by-value āĻāĻŦāĻ‚ āĻāĻ°ā§‡/āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ pass-by-reference āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡ āĻ¯āĻžā§ŸāĨ¤ āĻāĻ°ā§‡ āĻāĻŦāĻ‚ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ¯āĻĻāĻŋ āĻ¤ā§‹āĻŽāĻžāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ āĻļāĻĒāĻŋāĻ‚ āĻ•āĻžāĻ°ā§āĻŸ āĻāĻ°ā§‡āĻ¤ā§‡ āĻĄāĻžāĻŸāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§‡ āĻ¤āĻŦā§‡ āĻ…āĻ¨ā§āĻ¯ āĻ¯āĻ¤ āĻĢāĻžāĻ‚āĻļāĻ¨ cart āĻāĻ°ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¸āĻŦāĻžāĻ° cart āĻāĻ°ā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšā§Ÿā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤ āĻāĻŸāĻž āĻšā§ŸāĻ¤ āĻ­āĻžāĻ˛ āĻŽāĻ¨ā§‡ āĻšāĻšā§āĻ›ā§‡, āĻāĻ•āĻŸāĻž āĻ–āĻžāĻ°āĻžāĻĒ āĻ•ā§‡āĻ¸ āĻšāĻŋāĻ¨ā§āĻ¤āĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻ•,

āĻ§āĻ°, āĻāĻ•āĻœāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ¤ā§‹āĻŽāĻžāĻ° āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° "Purchase" āĻŦāĻžāĻŸāĻ¨ āĻ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ˛, āĻ¯ā§‡āĻŸāĻž āĻ•āĻŋāĻ¨āĻž "purchase" āĻŽā§‡āĻĨāĻĄ āĻ•ā§‡ āĻ•āĻ˛ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ cart āĻāĻ°ā§‡ āĻ•ā§‡ āĻ¨ā§‡āĻŸāĻ“ā§ŸāĻžāĻ°ā§āĻ• āĻ•āĻ˛ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤ āĻ–āĻžāĻ°āĻžāĻĒ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸ āĻ•āĻžāĻ¨ā§‡āĻ•āĻļāĻ¨ āĻāĻ° āĻ•āĻžāĻ°āĻŖā§‡, "purchase" āĻĢāĻžāĻ‚āĻļāĻ¨āĻ•ā§‡ āĻŦāĻžāĻ°āĻŦāĻžāĻ° āĻ¨ā§‡āĻŸāĻ“ā§ŸāĻžāĻ°ā§āĻ•ā§‡ āĻ•āĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻāĻ–āĻ¨ āĻ¯āĻĻāĻŋ āĻĻā§āĻ°ā§āĻ˜āĻŸāĻ¨āĻžāĻŦāĻļāĻ¤ āĻ¤ā§āĻŽāĻŋ "Add to cart" āĻŦāĻžāĻŸāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ° āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ¨āĻ¤ā§āĻ¨ āĻ†āĻ‡āĻŸā§‡āĻŽ addItemToCart āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ cart āĻāĻ°ā§‡āĻ¤ā§‡ āĻ¯ā§‹āĻ— āĻšā§Ÿā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤ āĻāĻŦāĻ‚ āĻ¨āĻ¤ā§āĻ¨ āĻ†āĻ‡āĻŸā§‡āĻŽ āĻ¸āĻš āĻ¤ā§‹āĻŽāĻžāĻ° āĻ°āĻŋāĻ•ā§ā§Ÿā§‡āĻ¸ā§āĻŸ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ āĻšāĻ˛ā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤

āĻāĻŸāĻžāĻ° āĻ–ā§āĻŦ āĻ­āĻžāĻ˛ā§‹ āĻāĻ•āĻŸāĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻšāĻ˛, addToItemCart āĻ¸āĻŦ āĻ¸āĻŽā§Ÿ cart āĻ•ā§‡ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ•āĻ°ā§‡ āĻ¨āĻ¤ā§āĻ¨ āĻāĻ°ā§‡ āĻŦāĻžāĻ¨āĻžāĻŦā§‡, āĻ¤āĻžāĻ°āĻĒāĻ° āĻ¸ā§‡āĻ‡ āĻāĻ°ā§‡āĻ¤ā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§‡ āĻ¨āĻ¤ā§āĻ¨ āĻāĻ°ā§‡ āĻŸāĻž āĻ°āĻŋāĻŸāĻžāĻ°ā§āĻ¨ āĻ•āĻ°āĻŦā§‡āĨ¤ āĻāĻ¤ā§‡āĻ•āĻ°ā§‡ āĻ†āĻ¸āĻ˛ cart āĻāĻ°ā§‡ āĻ…āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻĨāĻžāĻ•āĻŦā§‡āĨ¤

āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ ā§¨ āĻŸāĻž āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻ›ā§‡,

  1. āĻāĻŽāĻ¨ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¯ā§‡ āĻ¤ā§‹āĻŽāĻžāĻ° āĻ‡āĻ¨āĻĒā§āĻŸ āĻ…āĻŦā§āĻœā§‡āĻ•ā§āĻŸāĻŸāĻžāĻ‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻĻāĻ°āĻ•āĻžāĻ°, āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ•āĻ°ā§‡ āĻ•āĻžāĻœ āĻšāĻšā§āĻ›ā§‡āĻ¨āĻžāĨ¤ āĻ¤āĻŦā§‡ āĻāĻŸāĻž āĻ–ā§āĻŦāĻ‡ āĻ•āĻŽ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĨ¤ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻœāĻŋāĻ¨āĻŋāĻļāĻ‡ āĻ¸āĻžāĻ‡āĻĄ āĻ‡āĻĢā§‡āĻ•ā§āĻŸ āĻ›āĻžā§œāĻžāĻ‡ āĻ°āĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸāĻ° āĻ•āĻ°āĻž āĻ¯āĻžā§ŸāĨ¤
  2. āĻ…āĻ¨ā§‡āĻ• āĻŦā§œ āĻāĻ•āĻŸāĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ•āĻ°āĻž āĻĒāĻžāĻ°ā§āĻĢāĻ°āĻŽā§‡āĻ¨ā§āĻ¸ āĻāĻ° āĻĒā§āĻ°ā§‡āĻ•ā§āĻˇāĻŋāĻ¤ā§‡ āĻ–ā§āĻŦāĻ‡ āĻŦā§āĻ¯ā§ŸāĻŦāĻšā§āĻ˛āĨ¤ āĻ¸ā§ŒāĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦā§‡ āĻāĻŽāĻ¨ āĻ¨āĻž, āĻ•āĻžāĻ°āĻŖ āĻ•āĻŋāĻ›ā§ āĻ…āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻ†āĻ›ā§‡ āĻ¯āĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ•ā§āĻ˛ā§‹āĻ¨āĻŋāĻ‚ āĻ…āĻ¨ā§‡āĻ• āĻĻā§āĻ°ā§āĻ¤ āĻāĻŦāĻ‚ āĻ•āĻŽ āĻŽā§‡āĻŽāĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻ°āĻž āĻ¯āĻžā§ŸāĨ¤

āĻ–āĻžāĻ°āĻžāĻĒ āĻ•ā§‹āĻĄ:

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"));
}

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

āĻŸāĻžāĻ‡āĻĒ āĻšā§‡āĻ•āĻŋāĻ‚ āĻā§œāĻŋā§Ÿā§‡ āĻšāĻ˛āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻĒāĻžāĻ°ā§āĻŸ-2)

āĻ¤ā§āĻŽāĻŋ āĻŦā§‡āĻ¸āĻŋāĻ• āĻĒā§āĻ°āĻŋāĻŽāĻŋāĻŸāĻŋāĻ­ āĻ¯ā§‡āĻŽāĻ¨ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚, āĻ‡āĻ¨ā§āĻŸāĻŋāĻœāĻžāĻ°ā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ 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 āĻāĻ° āĻ˛ā§‡āĻ–āĻž āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ā§āĻ¸ āĻŦāĻ‡ā§Ÿā§‡ āĻ–ā§āĻŦ āĻœāĻ¨āĻĒā§āĻ°āĻŋā§Ÿ āĻāĻ•āĻŸāĻŋ āĻ•āĻĨāĻž āĻšāĻ˛, "āĻ¯āĻ–āĻ¨āĻ‡ āĻĒāĻžāĻ°āĻŦā§‡ āĻ¤āĻ–āĻ¨āĻ‡ āĻ‡āĻ¨āĻšā§‡āĻ°āĻŋāĻŸā§‡āĻ¨ā§āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻ•āĻŽā§āĻĒā§‹āĻœāĻŋāĻļāĻ¨ āĻ•ā§‡ āĻŦā§‡āĻļāĻŋ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦ āĻĻāĻŋāĻŦā§‡"āĨ¤ āĻ‡āĻ¨āĻšā§‡āĻ°āĻŋāĻŸā§‡āĻ¨ā§āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻāĻŦāĻ‚ āĻ•āĻŽā§āĻĒā§‹āĻœāĻŋāĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻ…āĻ¨ā§‡āĻ• āĻ­āĻžāĻ˛ā§‹ āĻ•āĻžāĻ°āĻŖ āĻ°ā§Ÿā§‡āĻ›ā§‡āĨ¤ āĻŽā§‹āĻĻā§āĻĻāĻž āĻ•āĻĨāĻž āĻšāĻ˛, āĻ¤ā§āĻŽāĻŋ āĻ¯āĻĻāĻŋ āĻ¸ā§āĻŦāĻ¤āĻƒāĻ¸ā§āĻĢā§‚āĻ°ā§āĻ¤ āĻ­āĻžāĻŦā§‡āĻ‡ āĻšāĻŋāĻ¨ā§āĻ¤āĻž āĻ•āĻ° āĻ¯ā§‡ āĻ‡āĻ¨āĻšā§‡āĻ°āĻŋāĻŸā§‡āĻ¨ā§āĻ¸ āĻ¤ā§‹āĻŽāĻžāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽāĻžāĻ§āĻž āĻ•āĻ°āĻŦā§‡ āĻ¤āĻŦā§‡ āĻ†āĻ°ā§‡āĻ•āĻŦāĻžāĻ° āĻ­āĻžāĻŦ āĻ¯ā§‡ āĻ•āĻŽā§āĻĒā§‹āĻœāĻŋāĻļāĻ¨ āĻĻāĻŋā§Ÿā§‡ āĻ•āĻžāĻœ āĻŸāĻž āĻ•āĻ°āĻž āĻ¯āĻžā§Ÿ āĻ•āĻŋāĻ¨āĻžāĨ¤ āĻ…āĻ¨ā§‡āĻ• āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ‡ āĻ¤ā§āĻŽāĻŋ āĻĒāĻžāĻ°āĻŦā§‡,

āĻ¤ā§āĻŽāĻŋ āĻšā§ŸāĻ¤ āĻ­āĻžāĻŦāĻ¤ā§‡ āĻĒāĻžāĻ°, "āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ‡āĻ¨āĻšā§‡āĻ°āĻŋāĻŸā§‡āĻ¨ā§āĻ¸ āĻ•āĻ–āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ"? āĻāĻŸāĻž āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻŽāĻžāĻ° āĻĒā§āĻ°āĻŦā§āĻ˛ā§‡āĻŽ āĻāĻ° āĻ‰āĻĒāĻ°āĨ¤ āĻ¯ā§‡āĻ¸āĻŦ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ‡āĻ¨āĻšā§‡āĻ°āĻŋāĻŸā§‡āĻ¨ā§āĻ¸ āĻ•āĻŽā§āĻĒāĻœāĻŋāĻļāĻ¨ā§ āĻĨā§‡āĻ•ā§‡ āĻ­āĻžāĻ˛ā§‹ āĻ¨āĻŋāĻšā§‡ āĻ¤āĻžāĻ° āĻāĻ•āĻŸāĻž āĻ˛āĻŋāĻ¸ā§āĻŸ āĻĻāĻŋāĻ˛āĻžāĻŽ,

  1. āĻ¤ā§‹āĻŽāĻžāĻ° āĻ‡āĻ¨āĻšā§‡āĻ°āĻŋāĻŸā§‡āĻ¨ā§āĻ¸ āĻ "has-a" āĻāĻ° āĻŦāĻĻāĻ˛ā§‡ "is-a" āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ• āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨āĨ¤ (āĻŽāĻžāĻ¨ā§āĻˇ>āĻĒā§āĻ°āĻžāĻ¨āĻŋ vs. āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€>āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°āĻŋāĻ° āĻ¤āĻĨā§āĻ¯ )
  2. āĻ¤ā§āĻŽāĻŋ āĻŦā§‡āĻœ āĻ•ā§āĻ˛āĻžāĻ¸ āĻĨā§‡āĻ•ā§‡ āĻ•ā§‹āĻĄ āĻĒā§āĻ¨āĻ°āĻžā§Ÿ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻ˛ā§‡(human can move like all animals)āĨ¤
  3. āĻ¤ā§āĻŽāĻŋ āĻšāĻžāĻ‡āĻ˛ā§āĻĄ āĻ•ā§āĻ˛āĻžāĻ¸ā§‡ āĻ—ā§āĻ˛ā§‹āĻŦāĻžāĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ†āĻ¨āĻ¤ā§‡ āĻšāĻžāĻ“ āĻŦā§‡āĻœ āĻ•ā§āĻ˛āĻžāĻ¸ā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡āĨ¤ (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);
  }
  // ...
}

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

SOLID

Single Responsibility Principle (SRP)

āĻ•ā§āĻ˛āĻŋāĻ¨ āĻ•ā§‹āĻĄ āĻŦāĻ‡ā§Ÿā§‡ āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻž āĻŦāĻ˛āĻž āĻšā§Ÿā§‡āĻ›ā§‡, "āĻāĻ•āĻŸāĻž āĻ•ā§āĻ˛āĻžāĻ¸ āĻ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻžāĻ° āĻŦā§‡āĻļāĻŋ āĻ•āĻžāĻ°āĻ¨ āĻĨāĻžāĻ•āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻž"āĨ¤ āĻĢā§āĻ˛āĻžāĻ‡āĻŸā§‡ āĻāĻ•āĻŸāĻž āĻŽāĻžāĻ¤ā§āĻ° āĻ¸ā§āĻŸāĻ•ā§‡āĻ¸ āĻ¨ā§‡ā§ŸāĻžāĻ° āĻŽāĻ¤, āĻāĻ•āĻŸāĻž āĻ•ā§āĻ˛āĻžāĻ¸ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĸā§āĻ•āĻŋā§Ÿā§‡ āĻĻā§‡ā§ŸāĻžāĻŸāĻž āĻ–ā§āĻŦ āĻ˛ā§‹āĻ­āĻ¨ā§€ā§ŸāĨ¤ āĻāĻ•āĻŸāĻž āĻ•ā§āĻ˛āĻžāĻ¸ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻšāĻžāĻ° āĻ•āĻŽāĻžāĻ¤ā§‡ āĻĒāĻžāĻ°āĻžāĻŸāĻž āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻ¨ āĨ¤ āĻ¤ā§āĻŽāĻŋ āĻ¯āĻĻāĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ°āĻžāĻ–, āĻ¤āĻŦā§‡ āĻāĻ•āĻŸāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•ā§‹āĻĨāĻžā§Ÿ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻ­āĻžāĻŦ āĻĢā§‡āĻ˛āĻ›ā§‡ āĻŦā§āĻāĻ¤ā§‡ āĻĒāĻžāĻ°āĻž āĻ•āĻ āĻŋāĻ¨ āĻšā§Ÿā§‡ āĻ¯āĻžā§ŸāĨ¤

āĻ–āĻžāĻ°āĻžāĻĒ āĻ•ā§‹āĻĄ:

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()) {
      // ...
    }
  }
}

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

Open/Closed Principle (OCP)

āĻŦāĻžāĻ°āĻŸā§āĻ°āĻžāĻ¨ā§āĻĄ āĻŽā§‡ā§ŸāĻžāĻ° āĻāĻ° āĻŽāĻ¤ā§‡, "āĻ¸āĻĢāĻŸāĻ“ā§ŸāĻžāĻ°ā§‡āĻ° āĻ‡āĻ‰āĻ¨āĻŋāĻŸ(āĻ•ā§āĻ˛āĻžāĻ¸, āĻŽāĻĄāĻŋāĻ‰āĻ˛āĻ¸, āĻĢāĻžāĻ‚āĻļāĻ¨ā§āĻ¸ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ) āĻ—ā§āĻ˛ā§‹ āĻāĻ•ā§āĻ¸āĻŸā§‡āĻ¨ā§āĻĄ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ–ā§‹āĻ˛āĻž āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡ , āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻŽāĻĄāĻŋāĻĢāĻŋāĻ•ā§‡āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻ¨ā§āĻ§ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡" āĨ¤ āĻāĻŸāĻž āĻ†āĻ¸āĻ˛ā§‡ āĻ•āĻŋ āĻŦā§āĻāĻžā§Ÿ? āĻāĻŸāĻž āĻĻāĻŋā§Ÿā§‡ āĻ†āĻ¸āĻ˛ā§‡ āĻŦā§āĻāĻžā§Ÿ, āĻ¤ā§‹āĻŽāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ•ā§‡ āĻ¨āĻ¤ā§āĻ¨ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĻāĻŋāĻ¤ā§‡ āĻšāĻŦā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯ā§‡ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ†āĻ—ā§‡ āĻĨā§‡āĻ•ā§‡ āĻ†āĻ›ā§‡ āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻ†āĻŸāĻ•āĻžāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻ–āĻžāĻ°āĻžāĻĒ āĻ•ā§‹āĻĄ:

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
    });
  }
}

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

Liskov Substitution Principle (LSP)

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);

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

Interface Segregation Principle (ISP)

āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‡ āĻ¯āĻĻāĻŋāĻ“ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻ¨āĻž āĻĨāĻžāĻ•āĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻāĻ‡ āĻ¨ā§€āĻ¤āĻŋ āĻ–āĻžāĻŸā§‡ āĻ¨āĻžāĨ¤ āĻ¤āĻŦā§‡, āĻāĻŸāĻž āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻ†āĻ¨ā§āĻ¸āĻžāĻ‚āĻ—āĻŋāĻ•āĨ¤ 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() {}
  }
});

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

Dependency Inversion Principle (DIP)

āĻāĻ‡ āĻŽā§‚āĻ˛āĻ¨ā§€āĻ¤āĻŋ ā§¨āĻŸāĻž āĻ—ā§āĻ°āĻ¤ā§āĻ¤āĻĒā§āĻ°ā§āĻ¨ āĻœāĻŋāĻ¨āĻŋāĻ¸ āĻŦāĻ˛ā§‡ āĻĨāĻžāĻ•ā§‡,

  1. āĻšāĻžāĻ‡ āĻ˛ā§‡āĻ­ā§‡āĻ˛ āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻ•āĻ–āĻ¨ā§‹āĻ‡ āĻ˛ā§‹ āĻ˛ā§‡āĻ­ā§‡āĻ˛ āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻāĻ° āĻ‰āĻĒāĻ°ā§‡ āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°āĻŦā§‡ āĻ¨āĻžāĨ¤
  2. āĻ…ā§āĻ¯āĻžāĻŦāĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻļāĻ¨ āĻĄāĻŋāĻŸā§‡āĻ‡āĻ˛ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤ āĻĄāĻŋāĻŸā§‡āĻ‡āĻ˛ āĻ…ā§āĻ¯āĻžāĻŦāĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻļāĻ¨ā§‡āĻ° āĻ‰āĻĒāĻ°ā§‡ āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°āĻŦā§‡āĨ¤

āĻšā§ŸāĻ¤ āĻ¸āĻšāĻœā§‡ āĻŦā§āĻāĻŦā§‡ āĻ¨āĻž, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¤ā§āĻŽāĻŋ āĻ¯āĻĻāĻŋ 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);
  });

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

Async/Await āĻĒā§āĻ°āĻŽāĻŋāĻ¸ āĻĨā§‡āĻ•ā§‡āĻ“ āĻ­āĻžāĻ˛

āĻ•āĻ˛āĻŦā§āĻ¯āĻžāĻ•ā§‡āĻ° āĻ¤ā§āĻ˛āĻ¨āĻžā§Ÿ āĻĒā§āĻ°āĻŽāĻŋāĻ¸ āĻ…āĻ¨ā§‡āĻ• āĻ­āĻžāĻ˛āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ 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 {}

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

Function callers and callees should be close

āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻž āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ…āĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻžāĻ•ā§‡ āĻ•āĻ˛ āĻ•āĻ°ā§‡, āĻ¤āĻŦā§‡ āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŦā§‡ āĻāĻĻā§‡āĻ°āĻ•ā§‡ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻ°āĻžāĻ–āĻ¤ā§‡āĨ¤

āĻ–āĻžāĻ°āĻžāĻĒ āĻ•ā§‹āĻĄ:

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:

âŦ† āĻ‰āĻĒāĻ°ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

About

🛁 Clean Code concepts adapted for JavaScript

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%