This week we talk about encapsulated records, collections and replacing primitive objects.
A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.
var organization = { name: "JP Sio", country: "USA" };
becomes ⬇️
class Organization {
constructor(data) {
this._name = data.name;
this._country = data.country;
}
get name() {
return this._name;
}
set name(arg) {
this._name = arg;
}
get country() {
return this._country;
}
set country(arg) {
this._country = arg;
}
}
class Organization
doesn't need to know / care which is stored and which is calculatedclass Person {
get courses() {
return this._courses;
}
set courses(aList) {
this._courses = aList;
}
}
becomes ⬇️
class Person {
get courses() {
return this._courses.slice();
}
addCourse(aCourse) {
/*...*/
}
}
slice()
is key here, does not modify the original array - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sliceorders.filter(0 => "high" === o.priority || "rush" === o.priority)
becomes ⬇️
orders.filter(o => o.priority.higherThan(new Priority("normal")));
- programmers are often hesitant to create their own types and rely only on primitives. i.e. representing a phone number as a string instead of as it's own type
A telephone number may be represented as a string for a while, but later it will need special behavior for formatting, extracting the area code, and the like
Sometimes it's better to not try to split things apart, sometimes it just complicates things.
// before refactor:
function getItemPrice(item) {
if (itemOnSale(item) == true) {
return item.price - 5
} else {
return item.price
}
};
function itemOnSale(product) {
if (product.onSale == true) {
return true;
} else {
return false;
}
};
let original = getItemPrice(sweatshirt);
// after refactor:
function newGetItemPrice(item) {
if (item.onSale == true) {
return item.price - 5
} else {
return item.price
}
};