Software Design/Extract generic components

Related

 * Require the least powerful abstract class you need to implement a function
 * Create pure functions