-
-
Notifications
You must be signed in to change notification settings - Fork 926
Description
π hey, this is a great repo/cheatsheet, thanks for this!
A couple points on your get/set examples, in short, they are confusing when compared with each other and conflicts with OO principles.
"Accesses data immediately (i.e. shorthand getter of internal data)."
// Get
function getFruitCount() {
return this.fruits.length
}this suggests that getFruitCount is part of either a class or object, which has the property fruits with type array (or other iterable).
const bowl = {
fruits: ['apple', 'orange', 'pear'],
getFruitCount() { this.fruits.length },
get fruitCount() { this.fruits.length }
}with the example above to get the number of fruits in the bowl, you can do either bowl.getFruitCount() or bowl.fruitCount. If you find you are using getFruitCount often in your code, or you are passing it into another function, it can get unreadable/extraneous quite quickly.
throw new Error(`Not enough ${bowl.getFruitCount()}`);
// vs
throw new Error(`Not enough ${bowl.fruitCount}`);// Set
let fruits = 0
function setFruits(nextFruits) {
fruits = nextFruits
}
setFruits(5)I think this example should either match your get example, or be completely different so it's not confusing, since get/set on an object is thought of to be a matching pair. Currently, I don't see a "benefit" of using this set function over a simple fruits = randomNumber() or fruits = 5 especially with the current scoping. If you were to match the getter method (get keyword), the example would look like this.
const bowl = {
fruits: 0,
get fruitCount() { this.fruits },
set fruitCount(val) {
if (typeof val === 'number') {
fruits = val
} else {
throw new Error('You need to provide a number');
}
}
console.log(bowl.fruitCount) // 0;
bowl.fruitCount = 5;
console.log(bowl.fruitCount) // 5;
bowl.fruitCount = "invalid"; // throws Error the key words, in js and other languages usually allow for those sorts of protections against setting (and getting a private field without exposing the field's value directly).
To avoid this confusion, I think you should either explain getters/setters vs a function with get/set in the name and provide an example of both, or more simply, use a pure function as an example.
function getRandomFruit() { /* returns a fruit */ }
function setTheme(palette) { /* changes UI theme to light | dark mode */ }