Avoiding the Nightmare Rewrite
or
HOW I LEARNED TO LOVE IMPORTS AND STOP WORRYING ABOUT FRAMEWORKS
Who am i?
Daniel Sellers
software engineer.
team lead.
Maker of things.
not Peter Sellers.
A brief history of making the internet
First there was a browser
1990—Sir Tim BErners-Lee
Then there was javascript
1994—Brendan Eich
jquery arrived
2006—John Resig
Angular
2009—Miško Hevery
Backbone
2010—Jeremy Ashkenas
Emberjs
2011—Yehuda Katz
React
2013—Jordan Walke
Vuejs
2014—Evan You
Ember 2
2015—Ember core team
Angular 2
2016—Angular Team
So...
Why?!
So what do we do?
A brief stop over in test land
const getFib = (i) => {
if (isNaN(new Number(i)) || typeof i === 'boolean' || new Number(i) < 0) {
throw new Error('TypeError');
}
if (i === -0) {
return 0;
}
return i <= 1 ? i : getFib(i - 1) + getFib(i - 2);
}
module.exports = getFib;
describe('fib tests', () => {
it('should return 0 for 0', () => {
assert.strictEqual(getFib(0), 0);
assert.strictEqual(getFib(-0), 0);
});
it('should return 1 for 1', () => {
assert.strictEqual(getFib(1), 1);
});
it('should return 89 for 11', () => {
assert.strictEqual(getFib(11), 89);
});
it('should return 357 for 14', () => {
assert.strictEqual(getFib(14), 377);
});
it('should throw type error for negative numbers', () => {
assert.throws(() => getFib(-1), 'TypeError');
assert.throws(() => getFib(-42), 'TypeError');
assert.throws(() => getFib(-Infinity), 'TypeError');
});
it('should throw type error for boolean', () => {
assert.throws(() => getFib(true), 'TypeError');
});
it('should work for string that is a number', () => {
assert.strictEqual(getFib('14'), 377);
assert.strictEqual(getFib('0x05'), 5);
assert.strictEqual(getFib('0x06'), 8);
});
it('should throw type error for string', () => {
assert.throws(() => getFib('hello world'), 'TypeError');
});
it('should throw a type error if a function', () => {
assert.throws(() => getFib(() => {return `can't take the sky from me`}), 'TypeError');
});
});
const getFib = (i) => {
if (isNaN(new Number(i)) || typeof i === 'boolean' || new Number(i) < 0) {
throw new Error('TypeError');
}
if (i === -0) {
return 0;
}
return i <= 1 ? i : getFib(i - 1) + getFib(i - 2);
}
module.exports = getFib;
wat?!
It's easy to prove that a function will do something
It is easy to prove it will not do a specific thing
It is harder to prove that it will only do a specific set of things*
*With some caveats
we're not here to talk about that directly though...
what does this have to do with anything?
don't house your business logic in your framework's code
This might get a little extreme
Let's take a look...
Get that logic out of your framework
use more pojs*
*plain old javascript
Plan for your next rewrite. It is coming.
go out and write code!
architecting for tests and rewrites
By Daniel Sellers
architecting for tests and rewrites
- 1,386