refactoring
DESCRIPTION
Presentation about refactoring code and testingTRANSCRIPT
![Page 1: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/1.jpg)
Refactoring
![Page 2: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/2.jpg)
What is Refactoring?
![Page 3: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/3.jpg)
Refactoring is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior.
Martin FowlerRefactoring, improving design of existing code
![Page 4: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/4.jpg)
![Page 5: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/5.jpg)
![Page 6: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/6.jpg)
What happened?
![Page 7: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/7.jpg)
Sharepoint?
![Page 8: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/8.jpg)
Lack of time?
![Page 9: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/9.jpg)
Lack of skill?
![Page 10: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/10.jpg)
Poor management?
![Page 11: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/11.jpg)
Text
![Page 12: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/12.jpg)
Why Refactor?
![Page 13: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/13.jpg)
Any fool can write code that a computer can understand. Good programmers write code that humans can understand
Martin Fowler
![Page 14: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/14.jpg)
Remove duplicationRemove duplicationRemove duplication
![Page 15: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/15.jpg)
Make code maintainable
![Page 16: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/16.jpg)
Make code readable (by humans)
![Page 17: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/17.jpg)
Spaghetti Code
![Page 18: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/18.jpg)
Technical Debt
![Page 19: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/19.jpg)
Improve Design
![Page 20: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/20.jpg)
Reduce BLOC(beers x LOC)
![Page 21: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/21.jpg)
When to Refactor?
![Page 22: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/22.jpg)
Fixing bugs
![Page 23: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/23.jpg)
Adding features
![Page 24: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/24.jpg)
Code Review
![Page 25: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/25.jpg)
Manager on Vacation?
![Page 26: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/26.jpg)
100% sure the new code is better
![Page 27: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/27.jpg)
Cost Not to Refactorgreater thanCost to Refactor
![Page 28: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/28.jpg)
Cost = Doing the change+ Testing it+ Documentation
![Page 29: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/29.jpg)
Risk ofIntroducing bugs
![Page 30: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/30.jpg)
![Page 31: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/31.jpg)
![Page 32: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/32.jpg)
Only refactor if youare confident
(it works as before, no side effects)
![Page 33: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/33.jpg)
Unit Tests
![Page 34: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/34.jpg)
One classOne method
![Page 35: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/35.jpg)
No dependencies(mocks)
![Page 36: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/36.jpg)
Hard to dowith Legacy Code
![Page 37: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/37.jpg)
Core of TDD
![Page 38: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/38.jpg)
Integration Tests
![Page 39: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/39.jpg)
More thanone class
![Page 40: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/40.jpg)
Communicationbetween
components
![Page 41: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/41.jpg)
Acceptance tests
![Page 42: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/42.jpg)
Black box testing
![Page 43: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/43.jpg)
End to end
![Page 44: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/44.jpg)
Given inputWhen doing YYYExpect output
![Page 45: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/45.jpg)
Works withLegacy Code
![Page 46: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/46.jpg)
Works withNew Code
![Page 47: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/47.jpg)
Works with-40!!!
![Page 48: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/48.jpg)
Core of BDD
![Page 49: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/49.jpg)
How to Refactor?
![Page 50: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/50.jpg)
![Page 51: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/51.jpg)
![Page 52: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/52.jpg)
Code should be clear
![Page 53: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/53.jpg)
Like telling a story
![Page 54: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/54.jpg)
Refactoringalgorithm
![Page 55: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/55.jpg)
Text
Method?
![Page 56: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/56.jpg)
SecondWrite a test for it
![Page 57: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/57.jpg)
Third Make it better
![Page 58: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/58.jpg)
FourthRun the tests
![Page 59: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/59.jpg)
Repeat untilout of coffee
![Page 60: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/60.jpg)
Nesting Conditionals
![Page 61: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/61.jpg)
public double SomeMethod(){ var result = 0d;
if (_firstGuard) { result = FirstCalculation(); if (_secondGuard) { result = SecondCalculation(); } } return result;}
C#
![Page 62: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/62.jpg)
public double BetterMethod(){ if (!_firstGuard) { return 0; }
if (!_secondGuard) { return FirstCalculation(); }
return SecondCalculation();}
REFACTORED
C#
![Page 63: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/63.jpg)
class NestedCalculation def awesome_method first_calculation || second_calculation || default_calculation end
def first_calculation @first_guard && some_calc_here end def second_calculation # etc... endend
RubyREFACTORED
![Page 64: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/64.jpg)
public double SomeMethod(){ var result = 0d;
if (_guard1) { if (_guard2) { if (_guard3) { result = Calc1() + Calc2(); } } } return result;}
C#
![Page 65: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/65.jpg)
public double BetterMethod(){ if (_guard1 && _guard2 && _guard3) { return Calc1() + Calc2(); }
return 0;}
REFACTORED
C#
![Page 66: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/66.jpg)
public bool SomeMethod(){ var result = false;
if (_firstGuard) { if (_secondGuard) result = true; } else result = true;
return result;}
C#
![Page 67: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/67.jpg)
public bool BetterMethod(){ return !_firstGuard || _secondGuard;}
REFACTORED
C#
![Page 68: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/68.jpg)
Functional Inspiration
![Page 69: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/69.jpg)
DRY
![Page 70: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/70.jpg)
Stop writing custom loops
![Page 71: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/71.jpg)
Meaning rulez
![Page 72: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/72.jpg)
public Iterable<String> deploy( Iterable<String> collection) {
Collection<String> result = new ArrayList<>...;
Iterator<String> cursor = collection.iterator(); while(cursor.hasNext()) { result.add("Deployed to " + cursor.next()); } return result;}
Java
![Page 73: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/73.jpg)
Java
public Iterable<String> betterDeploy( Iterable<String> environments) { return with(environments) .convert(new DeployConverter());}
class DeployConverter implements Converter<String, String> {
public String convert(String env) { return "Deployed to " + env; }}
REFACTORED
![Page 74: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/74.jpg)
Scala
def betterDeploy(environments: Iterable[String]) : Iterable[String] {
environment.map env => s"Deploy to $env"}
REFACTORED
![Page 75: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/75.jpg)
Java
public class Movie {
private String title; private int review; public Movie(String title, int review) { this.title = title; this.review = review; } public String getTitle() {...}
public int getReview() {...} }
![Page 76: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/76.jpg)
Java
@Testpublic void whereAreMyPostIt() { // arrange Iterable<Movie> movies = asList( new Movie("Blazing Saddles", 5), new Movie("Terminator"), new Movie("Canadian Bacon", 8) ); // act Iterable<Movie> reviewed = filter(having(on(Movie.class).getReview(), greaterThan(-1)) , movies); // assert assertThat(joinFrom(reviewed).getTitle(), equalTo("Blazing Saddles, Canadian Bacon"));}
REFACTORED
![Page 77: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/77.jpg)
Java
@Testpublic void wheresMyGanttChart() {
// arrange Iterable<Movie> movies = asList(new Movie("Blazing Saddles"), new Movie("Terminator"), new Movie("Curator")); // act Matcher<Movie> endsWithAtor = new Predicate<Movie>() { public boolean apply(Movie item) { return item.getTitle().endsWith("ator"); } };
Iterable<Movie> actual = filter(endsWithAtor, movies); // assert assertThat(joinFrom(actual).getTitle(), equalTo("Terminator, Curator"));}
REFACTORED
![Page 78: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/78.jpg)
public int Mysterious(IEnumerable<int> collection){ return collection.Aggregate((a, b) => a + b);}
C#
![Page 79: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/79.jpg)
Coffee
[1..1000].reduce (t, s) -> t + s
![Page 80: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/80.jpg)
What aboutMONADS?
![Page 81: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/81.jpg)
Just kidding :)
![Page 82: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/82.jpg)
Don’t forget OOP
![Page 83: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/83.jpg)
Abstraction isKEY
![Page 84: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/84.jpg)
![Page 85: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/85.jpg)
class BudgetViewModel constructor: (json) -> @budgets = [2013, 2012, 2011] @budgetIndex = 0
salary: -> return 5000 if @budgetIndex == 0 return 2000 if @budgetIndex == 1 1000
Coffee
![Page 86: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/86.jpg)
CoffeeREFACTORED
class BudgetViewModel constructor: -> @budgets = [ new BudgetModel(2013, 5000), new BudgetModel(2012, 2000), new BudgetModel(2011, 1000) ] @budget = @budgets[0] salary: => @budget.salary
![Page 87: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/87.jpg)
Coffee
class BudgetViewModel
constructor: -> @budgets = ko.observableArray [ new BudgetModel(2013, 5000), new BudgetModel(2012, 2000), new BudgetModel(2011, 1000) ]
@budget = ko.observable()
@salary = ko.computed => @budget().salary
KO REFACTORED
![Page 88: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/88.jpg)
Language is your friend(or it should be)
![Page 89: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/89.jpg)
The right toolfor the job
![Page 90: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/90.jpg)
Coffee
class window.NewsViewModel
constructor: (@limit = -1) -> @news = ko.observableArray() @title = ko.observable() $.getJSON '../api/news', @loadNews
loadNews: (data) => max = (if @limit == -1 then -1 else @limit - 1) @news(@createNewsItem(e) for e in data[0..max]) @title @news()[0]?.Title
createNewsItem: (e) => newsItem = Title: e.Title Date: @parseDate(e.Date) Body: e.Body
![Page 91: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/91.jpg)
JS
(function() { var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
window.NewsViewModel = (function() {
function NewsViewModel(limit) { this.limit = limit != null ? limit : -1; this.createNewsItem = __bind(this.createNewsItem, this);
this.loadNews = __bind(this.loadNews, this);
this.news = ko.observableArray(); this.title = ko.observable(); $.getJSON('../api/news', this.loadNews); }
NewsViewModel.prototype.loadNews = function(data) { var e, max, _ref; max = (this.limit === -1 ? -1 : this.limit - 1); this.news((function() { var _i, _len, _ref, _results; _ref = data.slice(0, max + 1 || 9e9); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { e = _ref[_i]; _results.push(this.createNewsItem(e)); } return _results; }).call(this)); return this.title((_ref = this.news()[0]) != null ? _ref.Title : void 0); };
NewsViewModel.prototype.createNewsItem = function(e) { var newsItem; return newsItem = { Title: e.Title, Date: this.parseDate(e.Date), Body: e.Body }; };
return NewsViewModel;
})();
}).call(this);
![Page 92: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/92.jpg)
JVM supportsmultiple languages
![Page 93: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/93.jpg)
same for.net framework
![Page 94: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/94.jpg)
Tests are a greatplace to start
![Page 95: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/95.jpg)
Thank you!
![Page 97: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/97.jpg)
Books
![Page 98: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/98.jpg)
Books
![Page 99: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/99.jpg)
Photo Credit
• Under http://creativecommons.org/licenses/by/2.5/
• Joe Cheng, DSC_7820-01, http://flic.kr/p/2Zt2u
• Bill Ward, Derek Schin's Trucks 1, http://flic.kr/p/m5L5S
• Jeremy Keith, Roast beef, http://flic.kr/p/TKUz
• Rob Campbell, Field of daisies, http://flic.kr/p/6QJjU4
• Karin Dalziel, The Thinker, http://flic.kr/p/4UYArc
• Under http://creativecommons.org/licenses/by-sa/3.0/us/
• Derick Bailey, SOLID Motivational Posters, http://bit.ly/17aVaHg
![Page 100: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/100.jpg)
Photo Credit 2• How to write good code, http://xkcd.com/844/
• Understanding flow charts, http://lifehacker.com/5909501/how-to-choose-the-best-chart-for-your-data
![Page 101: Refactoring](https://reader033.vdocuments.net/reader033/viewer/2022051608/545143b7af7959b32f8b606a/html5/thumbnails/101.jpg)
Resources• http://www.infoq.com/news/2010/06/decision-to-refactor
• http://stackoverflow.com/questions/38635/what-static-analysis-tools-are-available-for-c
• Refactoring Catalog: http://www.refactoring.com/catalog/
• LambdaJ: https://code.google.com/p/lambda
• Coffeescript: http://coffeescript.org/