SlideShare a Scribd company logo
JavaScript
Abstraction in Implementation 	

!
by Milan Adamovsky	

http://milan.adamovsky.com ◆ http://www.hardcorejs.com
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
Quick Exercise
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>
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
Overview
• Ultimate goal is to write less code	

• Increase reusability	

• Change way of thinking	

• Change way of coding	

• Anticipate future code evolution
Quick Example
Before
function 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!";	
}
After
function 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();	
	
}	
}
Paradigms
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
Example
function 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	
});	
}
Usage
var 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
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
Coupled Binding
Click
function () {

alert(‘hello world!’);

}
Decoupled Binding
Click

Load

Greet

function () {

alert(‘hello world!’);

}
Decoupled Binding
Greet

function
function

function () {

alert(‘hello world!’);

}
OOP
• Object oriented programming	

• Base classes are usually most abstract	

• Polymorphism	

• Duck typing	

• Composition
Procedural
joe();

function joe() {

sayHello();

}

jane();

function jane() {

sayHello();

}

function sayHello() {

alert(‘hello world!’);

}
Object Oriented
joe = new Person();

function Person() {

this.hi = sayHello;

}

jane = new Person();

joe.hi();

jane.hi();	


function sayHello() {

alert(‘hello world!’);

}
Example
function 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"]));
Example
var 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() );
Example
var 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() );
MVC
• Abstraction engrained in architecture 	

• Separation of concerns (SoC)	

• Decouple model, view, controller	

• Each component replaceable	

• Any of these can be further abstracted
Traditional
JS
CSS
HTML
MVC
CSS
Data

HTML
JS
Example
function 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));
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
Coding
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
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
Nomenclature
• Generalize identifiers	

• Don’t over-generalize, stay within context	

• Reverse name groupings	

• Group related variables in objects
Before
function buildPage()	
{	
	 var facebookIcon = "http://www.facebook.com/icon.png";	
	 	
	 while (someConditionIsTrue()){	
	 	
doSomeWork();	
	 }	
	 	
	
var i = resolveTwitterIcon();	
}	

!

var PinterestSmallLogo = pinterest();	

!

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

!

var iconPinterest = pinterest();	

!

buildPage();
After
function buildPage(icons)	
{	
	 icons.facebook = "http://www.facebook.com/icon.png";	
	 	
	 while (someConditionIsTrue()){	
	 	
doSomeWork();	
	 }	
	 	
	
icons.twitter = resolveTwitterIcon();	
}	

!

var
	
	
	
};	

!

icons = {	
facebook : "",	
pinterest : pinterest(),	
twitter : ""	

buildPage(icons);
Habit Forming
• Adhere to strict coding style	

• Remove comments	

• Progressively generalize identifiers	

• Identify similar patterns to normalize	

• Code in anticipation for change
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
Example
function 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++;	
	 	
	
}	
	 	
}	
	 }	
}
Considerations
• Balance performance	

• Balance maintainability	

• Strive for quality	

• Balance code base size	

• Balance complexity
Exercise
0
1

2

3

4

5

6

7

8

9

+

0

*

Update on button click

Gray background

White border on click
Connect
• Thank you for your time	

• Connect with me on LinkedIn	

• Join the Hardcore JavaScript community	

• Read my blog	

• Contact me via e-mail

More Related Content

PPTX
JavaScript APIs you’ve never heard of (and some you have)
PDF
Basic Tutorial of React for Programmers
PDF
Django Heresies
ZIP
Barcamp Auckland Rails3 presentation
PDF
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
PDF
JavaScript Patterns
PDF
Akka and the Zen of Reactive System Design
PDF
Class-based views with Django
JavaScript APIs you’ve never heard of (and some you have)
Basic Tutorial of React for Programmers
Django Heresies
Barcamp Auckland Rails3 presentation
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
JavaScript Patterns
Akka and the Zen of Reactive System Design
Class-based views with Django

What's hot (20)

PDF
Advanced Django
PDF
ORMs in Golang
PDF
jQuery Loves Developers - Oredev 2009
PDF
Javascript Module Patterns
PDF
Proxies are Awesome!
PDF
jQuery Essentials
PPTX
Art of Javascript
PDF
Modernizes your objective C - Oliviero
PDF
Hey, I just met AngularJS, and this is crazy, so here’s my JavaScript, let’s ...
PPT
Building a Testable Data Access Layer
PDF
Developing iOS REST Applications
PPTX
Unobtrusive javascript with jQuery
PDF
Scalable JavaScript Design Patterns
PDF
jQuery Features to Avoid
PDF
Stack Overflow Austin - jQuery for Developers
PPT
Effecient javascript
PDF
JS Level Up: Prototypes
PPTX
SharePoint and jQuery Essentials
PDF
Unit and functional testing with Siesta
PDF
jQuery in 15 minutes
Advanced Django
ORMs in Golang
jQuery Loves Developers - Oredev 2009
Javascript Module Patterns
Proxies are Awesome!
jQuery Essentials
Art of Javascript
Modernizes your objective C - Oliviero
Hey, I just met AngularJS, and this is crazy, so here’s my JavaScript, let’s ...
Building a Testable Data Access Layer
Developing iOS REST Applications
Unobtrusive javascript with jQuery
Scalable JavaScript Design Patterns
jQuery Features to Avoid
Stack Overflow Austin - jQuery for Developers
Effecient javascript
JS Level Up: Prototypes
SharePoint and jQuery Essentials
Unit and functional testing with Siesta
jQuery in 15 minutes
Ad

Similar to JavaScript Abstraction (20)

PPTX
Maintainable JavaScript 2012
PPTX
JS Essence
PDF
Performance patterns
PDF
Javascript Design Patterns
PDF
Maintainable JavaScript 2011
PDF
Twins: OOP and FP
PDF
JavaScript for real men
PDF
Twins: Object Oriented Programming and Functional Programming
PPTX
Awesomeness of JavaScript…almost
PDF
Java script object model
PDF
TWINS: OOP and FP - Warburton
PPTX
Adding a modern twist to legacy web applications
PDF
Javascript Frameworks for Joomla
PDF
Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...
PPTX
Lecture 6: Client Side Programming 2
PDF
The Beauty Of Java Script V5a
PDF
Secrets of JavaScript Libraries
PDF
JavaScript
Maintainable JavaScript 2012
JS Essence
Performance patterns
Javascript Design Patterns
Maintainable JavaScript 2011
Twins: OOP and FP
JavaScript for real men
Twins: Object Oriented Programming and Functional Programming
Awesomeness of JavaScript…almost
Java script object model
TWINS: OOP and FP - Warburton
Adding a modern twist to legacy web applications
Javascript Frameworks for Joomla
Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...
Lecture 6: Client Side Programming 2
The Beauty Of Java Script V5a
Secrets of JavaScript Libraries
JavaScript
Ad

Recently uploaded (20)

PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Approach and Philosophy of On baking technology
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
Machine Learning_overview_presentation.pptx
PPTX
Cloud computing and distributed systems.
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
A Presentation on Artificial Intelligence
PDF
cuic standard and advanced reporting.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Empathic Computing: Creating Shared Understanding
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
“AI and Expert System Decision Support & Business Intelligence Systems”
Approach and Philosophy of On baking technology
Assigned Numbers - 2025 - Bluetooth® Document
Dropbox Q2 2025 Financial Results & Investor Presentation
Machine Learning_overview_presentation.pptx
Cloud computing and distributed systems.
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Spectral efficient network and resource selection model in 5G networks
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
MYSQL Presentation for SQL database connectivity
A Presentation on Artificial Intelligence
cuic standard and advanced reporting.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Empathic Computing: Creating Shared Understanding
Unlocking AI with Model Context Protocol (MCP)
Per capita expenditure prediction using model stacking based on satellite ima...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...

JavaScript Abstraction

  • 1. JavaScript Abstraction in Implementation ! by Milan Adamovsky http://milan.adamovsky.com ◆ http://www.hardcorejs.com
  • 2. 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
  • 4. 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>
  • 5. 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
  • 6. Overview • Ultimate goal is to write less code • Increase reusability • Change way of thinking • Change way of coding • Anticipate future code evolution
  • 8. Before function 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!"; }
  • 9. After function 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(); } }
  • 11. 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
  • 12. Example function 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 }); }
  • 13. Usage var 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
  • 14. 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
  • 15. Coupled Binding Click function () {
 alert(‘hello world!’);
 }
  • 16. Decoupled Binding Click Load Greet function () {
 alert(‘hello world!’);
 }
  • 17. Decoupled Binding Greet function function function () {
 alert(‘hello world!’);
 }
  • 18. OOP • Object oriented programming • Base classes are usually most abstract • Polymorphism • Duck typing • Composition
  • 19. Procedural joe(); function joe() {
 sayHello();
 } jane(); function jane() {
 sayHello();
 } function sayHello() {
 alert(‘hello world!’);
 }
  • 20. Object Oriented joe = new Person(); function Person() {
 this.hi = sayHello;
 } jane = new Person(); joe.hi();
 jane.hi(); function sayHello() {
 alert(‘hello world!’);
 }
  • 21. Example function 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"]));
  • 22. Example var 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() );
  • 23. Example var 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() );
  • 24. MVC • Abstraction engrained in architecture • Separation of concerns (SoC) • Decouple model, view, controller • Each component replaceable • Any of these can be further abstracted
  • 27. Example function 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));
  • 28. 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
  • 30. 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
  • 31. 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
  • 32. Nomenclature • Generalize identifiers • Don’t over-generalize, stay within context • Reverse name groupings • Group related variables in objects
  • 33. Before function buildPage() { var facebookIcon = "http://www.facebook.com/icon.png"; while (someConditionIsTrue()){ doSomeWork(); } var i = resolveTwitterIcon(); } ! var PinterestSmallLogo = pinterest(); ! buildPage();
  • 34. Improving function buildPage() { var iconFacebook = "http://www.facebook.com/icon.png"; while (someConditionIsTrue()){ doSomeWork(); } var iconTwitter = resolveTwitterIcon(); } ! var iconPinterest = pinterest(); ! buildPage();
  • 35. After function buildPage(icons) { icons.facebook = "http://www.facebook.com/icon.png"; while (someConditionIsTrue()){ doSomeWork(); } icons.twitter = resolveTwitterIcon(); } ! var }; ! icons = { facebook : "", pinterest : pinterest(), twitter : "" buildPage(icons);
  • 36. Habit Forming • Adhere to strict coding style • Remove comments • Progressively generalize identifiers • Identify similar patterns to normalize • Code in anticipation for change
  • 37. 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
  • 38. Example function 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++; } } } }
  • 39. Considerations • Balance performance • Balance maintainability • Strive for quality • Balance code base size • Balance complexity
  • 40. Exercise 0 1 2 3 4 5 6 7 8 9 + 0 * Update on button click Gray background White border on click
  • 41. Connect • Thank you for your time • Connect with me on LinkedIn • Join the Hardcore JavaScript community • Read my blog • Contact me via e-mail