iteration
iteration
John Jacob & JP Sio - Web Developers
Encapsulation
39 minutes Posted Jun 24, 2019 at 9:00 am.
0:00
39:54
Download MP3
Show notes

Episode 6 - More Code Examples

  • Drawing from Chapter 7 - Encapsulation

A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.

Encapsulate Record (162)

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;
}
}
  • you can hide what is stored and provide methods
  • consumer of class Organization doesn't need to know / care which is stored and which is calculated
  • nice getter and setter methods
  • makes it easier to refactor -> can hide implementation of internals and update the internals while keeping the same external interface

Encapsulate Collection (170)

class 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/slice
  • common approach is to provide a getting method for the collection to return a copy
  • basically, never mutate the original

Replace Primative with Object (174)

orders.filter(0 => "high" === o.priority || "rush" === o.priority)

becomes ⬇️

orders.filter(o => o.priority.higherThan(new Priority("normal")));
  • this goes back to "Primitive Obsession"
  • 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

  • create a new class for that bit of data
  • at first, the class does very little. in fact it probably only wraps a primitive
  • but now you have a place to put behavior specific to its needs

Inline Function (115) 🥴

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

Extract Class (182) 🥴

  • Talk through HUGE applicant model (in Ruby)
  • Broke this into child objects
    • Applicant Health History
    • Applicant Habits
    • Applicant Lifestyle
    • Applicant Method
    • Applicant Legal Release

Picks

  • JP: None :(
  • John: Quad Lock phone mount - bikes