140 likes | 334 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 (Shape and AbstractStudent) • 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
Compose 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 • Inline 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 intscoreOf(String next) { 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 • Buy the book or check out Martin's Refactoring Catalog from the refactoring page http://www.refactoring.com/ • Find catalog link and then find and read Inline Method • Next Tuesday, 1-Dec, I will ask you to read all 27 Refactorings on the next slide to prepare for test 2 on Thursday 3-Dec • I will give a sample test question follows the list 27
Read the following refactorings from http://www.refactoring.com/catalog/index.html (listed here in alphabetic order) Modifier
A dozen questions like this g) Which design is better, Ior II? Why? Ivoid printOwing() { printBanner(); // print details System.out.println("name: " + _name); System.out.println("amount " + getOutstanding()); } II void printOwing() { printBanner(); printDetails(getOutstanding()); } void printDetails (double outstanding) { System.out.println ("name: " + _name); System.out.println ("amount " + outstanding); }
Answer g) II Why? If you have a code fragment that can be grouped together, use Extract Method to turn the fragment into a method whose name explains the purpose of the method