1 / 14

Refactoring

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:

hayley
Télécharger la présentation

Refactoring

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Refactoring Small changes to code to improve it

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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++; }

  8. 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: _____

  9. 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; }

  10. 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; }

  11. 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

  12. Read the following refactorings from http://www.refactoring.com/catalog/index.html  (listed here in alphabetic order) Modifier

  13. 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); }

  14. 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

More Related