120 likes | 348 Views
Refactoring. Small changes to code to improve it. Refactoring Defined. A change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior — Refactoring , Martin Fowler. et. al. , page 53 Martin wrote the book:
E N D
Refactoring Small changes to code to improve it
Refactoring Defined • A change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior— Refactoring, Martin Fowler. et. al. , page 53 • Martin wrote the book: Refactoring Improving the Design of Existing Code • Refactoring owes a lot to a Refactoring: William Opdyke's PhD thesis
Write Drafts and Revise • All good writing is based upon revision.— Jacques Barzun, Simple & Direct, 4th Edition • Revision means "to look at again" • Example: Before 4-July, 1776, Thomas Jefferson's draft of the Declaration of Independence had this "We hold these truths to be sacred and undeniable, ..." • He let his friend Benjamin Franklin look over this draft to make changes including this: "We hold these truths to be self-evident, ..." • Total of 47 revisions, then Congress made 39 more http://www.weeklyreader.com/googledocs/pdfs/revisionfiles.pdf
Refactoring Happens • In larger systems (frameworks), code will be read and modified more frequently than it will be written • Refactoring typically involves • Removing duplicated or dead code • Simplifying complex code • Clarifying unclear code • It turns out that removing code can actually be a good thing: your system has fewer lines of code • Easier to develop, maintain, and change • Refactoring can be risky, unless you do it in small steps and have automated tests that can be run anytime
A few examples • A few refactorings we've seen (they have names) • Encapsulate Field (do this virtually always) • add getters and/or setters to access a field • Rename Method (often) • Extract SuperClass (recall Shape and Fruit) • You have two classes with similar features • Create a superclass and move common features to the superclass • Compose Method • A variety of refactorings can happen at the method level
Composed Method • Some refactoring attempts to "compose" methods • A composed method is relatively short by using calls to a small number of coherent elements • Easier to understand what the method does • Some refactorings for composing methods • Extract Method: replace complex code with a nice name • Inline Method: use code that's as easy to read as method • Code demo: Compose insertElement in ArrayPriorityList
Before public void insertElementAt(int index, E el) { // If need to grow array, grow it if (size() == data.length) { Object[] temp = new Object[data.length + 20]; for (int i = 0; i < size; i++) temp[i] = data[i]; data = temp; } // Shift array elements right to make room for (int j = size; j > index; j--) { data[j] = data[j - 1]; } // Add new element at the provided index data[index] = el; size++; }
After public void insertElementAt(int index, E el) { if (shouldGrowArray()) gowArray(); makeRoomAt(index); addAt(index, el); } • Is the new insertElementAt more readable? • Vote: Yes: ____ Nay: _____ • Are the extra private methods in the way? • Vote: Yes: ____ Nay: _____
private void addAt(int index, E el) { data[index] = el; size++; } private void makeRoomAt(int index) { for (int j = size; j > index; j--) { data[j] = data[j - 1]; } } private void gowArray() { Object[] temp = new Object[data.length + 20]; for (int i = 0; i < size; i++) temp[i] = data[i]; data = temp; }
Replace Nested Conditional with Guard Clauses see link private intboggleScoreOf(String word) { int sum = 0; if (next.length() == 3 || next.length() == 4) sum = 1; else if (next.length() == 5) sum = 2; else if (next.length() == 6) sum = 3; else if (next.length() == 7) sum = 5; else if (next.length() >= 8) sum = 11; else sum = 0; return sum; }
Refactoring Catalog • Check out Martin's Refactoring Catalog from the refactoring page http://www.refactoring.com/catalog/