Top Banner
JavaScript Abstraction in Implementation by Milan Adamovsky http://milan.adamovsky.com http://www.hardcorejs.com
41

JavaScript Abstraction

Dec 05, 2014

Download

Technology

These are the slides for this presentation http://www.meetup.com/HardCoreJS/events/133346272/

The goal is to influence the thought process of developers and make them into rockstar engineers by showing how to form the habit of abstraction into one's coding.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: JavaScript Abstraction

JavaScriptAbstraction in Implementation

!by Milan Adamovsky

http://milan.adamovsky.com ◆ http://www.hardcorejs.com

Page 2: JavaScript Abstraction

Preface

• Based on personal observations

• Spanning over 15 companies

• Small companies to mostly enterprise

• Not based on comprehensive research

• Full life cycle of web development

Page 3: JavaScript Abstraction

Quick Exercise

Page 4: JavaScript Abstraction

Analyze<html> <head> <title> This is the title of the page </title> </head> <body> <p id="main_content"> This is my content </p> <ul> <li class="first"> One <li> Two <ol> <li class="first"> A </ol> <li> </ul> </body></html>

Page 5: JavaScript Abstraction

Analysis

• A document

• A tree of hierarchal nodes off of root node

• Two children nodes off of root node

• Second child node has two children nodes

• Two children nodes are siblings

Page 6: JavaScript Abstraction

Overview

• Ultimate goal is to write less code

• Increase reusability

• Change way of thinking

• Change way of coding

• Anticipate future code evolution

Page 7: JavaScript Abstraction

Quick Example

Page 8: JavaScript Abstraction

Beforefunction resolveFirstName(person) { if (person.firstName) return person.firstName; else return "First name could not be found!";}!function findAge(person) { return person.age;}!function printOutName(person) { if (cookie === "senior") { findAge() + 20; resolveAddress(); } return person.lastName || "No last name was found on record!";}

Page 9: JavaScript Abstraction

Afterfunction errorMessage(descriptor) { return ({ age : "Age could not be determined", firstName : "First name could not be found!", lastName : "No last name was found on record!" })[descriptor];}!function resolveDescriptor(descriptor) { return typeof this[descriptor] !== "undefined" ? this[descriptor] : errorMessage(descriptor);}!function resolveSeniority() { if (cookie === "senior") { findAge() + 20; resolveAddress(); }}

Page 10: JavaScript Abstraction

Paradigms

Page 11: JavaScript Abstraction

Overloading

• One function serves multiple purposes

• Argument signature determines function

• Must differ by arity or data types

• Same function name

• JavaScript can only simulate overloading

Page 12: JavaScript Abstraction

Examplefunction addMethod(object, name, fn){ // addMethod - By John Resig (MIT Licensed) var old = object[ name ]; object[ name ] = function(){ if ( fn.length == arguments.length ) return fn.apply( this, arguments ); else if ( typeof old == 'function' ) return old.apply( this, arguments ); };}function Users(){ addMethod(this, "find", function(){ // Find all users... }); addMethod(this, "find", function(name){ // Find a user by name }); addMethod(this, "find", function(first, last){ // Find a user by first and last name });}

Page 13: JavaScript Abstraction

Usagevar users = new Users();!users.find(); // Finds all!users.find("John"); // Finds users by name!users.find("John", "Resig"); // Finds users by first and last name!users.find("John", "E", "Resig"); // Does nothing

Page 14: JavaScript Abstraction

Events

• Usually we couple an event to a function

• Sometimes many functions to one event

• We know what happens on an event

• We should not care what happens

• Decouple handlers from events

Page 15: JavaScript Abstraction

Click

function () { alert(‘hello world!’); }

Coupled Binding

Page 16: JavaScript Abstraction

Decoupled Binding

Click

function () { alert(‘hello world!’); }

Greet

Load

Page 17: JavaScript Abstraction

Decoupled Binding

function () { alert(‘hello world!’); }

Greet

function

function

Page 18: JavaScript Abstraction

OOP

• Object oriented programming

• Base classes are usually most abstract

• Polymorphism

• Duck typing

• Composition

Page 19: JavaScript Abstraction

function sayHello() { alert(‘hello world!’); }

Procedural

function joe() { sayHello(); }

joe(); jane();function jane() { sayHello(); }

Page 20: JavaScript Abstraction

function sayHello() { alert(‘hello world!’); }

Object Oriented

joe.hi(); jane.hi();

joe = new Person();

jane = new Person();

function Person() { this.hi = sayHello; }

Page 21: JavaScript Abstraction

Examplefunction Person(name) { this.hi = sayHello; this.name = name; function sayHello() { console.log('hello world from ' + this.name); }}!function init(names) { var people = []; for (var i = 0, count = names.length; i < count; i++) { people.push(new Person(names[i])); } return people;}function greet(people) { for (var i = 0, count = people.length; i < count; i++) { people[i].hi(); }}greet(init(["Joe", "Jane"]));

Page 22: JavaScript Abstraction

Examplevar Rifle = function () { this.reload = function () {}; this.fire = function () { /* ... */ };},!Cannon = function () { this.reload = function () {}; this.fire = function () {};};!var Soldier = function (gun) { this.currentGun = gun; this.inventory = { guns : [ gun ] }; this.attack = function () { this.currentGun.fire(); };};!var Tank = function (gun) { this.currentGun = gun; this.inventory = { guns : [ gun ] }; this.attack = function () { this.currentGun.fire(); };};!var soldier = new Soldier( new Rifle() ), tank = new Tank( new Cannon() );

Page 23: JavaScript Abstraction

Examplevar Rifle = function () { this.reload = function () {}; this.fire = function () { /* ... */ };},!Cannon = function () { this.reload = function () {}; this.fire = function () {};};!var Combatant = function (gun) { this.currentGun = gun; this.inventory = { guns : [ gun ] }; this.attack = function () { this.currentGun.fire(); };};!var soldier = new Combatant( new Rifle() ), tank = new Combatant( new Cannon() );

Page 24: JavaScript Abstraction

MVC

• Abstraction engrained in architecture

• Separation of concerns (SoC)

• Decouple model, view, controller

• Each component replaceable

• Any of these can be further abstracted

Page 25: JavaScript Abstraction

Traditional

HTML

CSS

JS

Page 26: JavaScript Abstraction

MVC

HTML

JS

CSS

Data

Page 27: JavaScript Abstraction

Examplefunction controller(model, view) { var items = “";! for (var i = 0, count = model.items.length; i < count; i++) { items += view.item.replace("{{item}}", model.items[i]); }! return view.list.replace("{{items}}", items);}!var view = { item : "<li>{{item}}</li>", list : "<ul>{{items}}</ul>"};!var model = { items : [1, 2, 3]};!console.log(controller(model, view));

Page 28: JavaScript Abstraction

RWD / AWD

• Responsive responds to screen widths

• Adaptive adapts to devices

• Use mobile-first approach in all code

• Segment code to accommodate growth

• Use lazy loaders and module patterns

Page 29: JavaScript Abstraction

Coding

Page 30: JavaScript Abstraction

Thought Process

• Do not care for specifics

• Do not care who calls what

• Assume anyone can call anything

• Assume anything can contain anything

• Think interfaces not internals

Page 31: JavaScript Abstraction

APIs

• Make them intuitive

• Do not rely on documentation

• Provide switches for easy customization

• Prioritize flexibility and agility of code

• Design functions to handle one thing

Page 32: JavaScript Abstraction

Nomenclature

• Generalize identifiers

• Don’t over-generalize, stay within context

• Reverse name groupings

• Group related variables in objects

Page 33: JavaScript Abstraction

Beforefunction buildPage() { var facebookIcon = "http://www.facebook.com/icon.png"; while (someConditionIsTrue()){ doSomeWork(); } var i = resolveTwitterIcon(); }!var PinterestSmallLogo = pinterest();!buildPage();

Page 34: JavaScript Abstraction

Improvingfunction buildPage() { var iconFacebook = "http://www.facebook.com/icon.png"; while (someConditionIsTrue()){ doSomeWork(); } var iconTwitter = resolveTwitterIcon(); }!var iconPinterest = pinterest();!buildPage();

Page 35: JavaScript Abstraction

Afterfunction buildPage(icons) { icons.facebook = "http://www.facebook.com/icon.png"; while (someConditionIsTrue()){ doSomeWork(); } icons.twitter = resolveTwitterIcon(); }!var icons = { facebook : "", pinterest : pinterest(), twitter : ""};!buildPage(icons);

Page 36: JavaScript Abstraction

Habit Forming

• Adhere to strict coding style

• Remove comments

• Progressively generalize identifiers

• Identify similar patterns to normalize

• Code in anticipation for change

Page 37: JavaScript Abstraction

Generalize

• This will do something

• When something happens

• It will take some parameters

• Parameters will map to some object

• The outcome will be specific to context

Page 38: JavaScript Abstraction

Examplefunction initModules() { for (module in app.modules) { if (app.modules[module].init && app.modules[module].checked()) { if (app.modules[module].init.call(this, arguments)) { initialized++; } } } }function initModules() { var module; for (moduleName in app.modules) { module = app.modules[moduleName]; if (module.init && module.checked()) { if (module.init.call(this, arguments)) { initialized++; } } } }

Page 39: JavaScript Abstraction

Considerations

• Balance performance

• Balance maintainability

• Strive for quality

• Balance code base size

• Balance complexity

Page 40: JavaScript Abstraction

Exercise

0

1 2 3

4 5 6

7 8 9

+ 0 *

Update on button click

White border on click

Gray background

Page 41: JavaScript Abstraction

Connect

• Thank you for your time

• Connect with me on LinkedIn

• Join the Hardcore JavaScript community

• Read my blog

• Contact me via e-mail