Iteration Podcast
Encapsulation
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 Organizationdoesn'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
 
Iteration Podcast