CSC/ECE 517 Fall 2009/wiki 1a SJ: Difference between revisions
No edit summary |
|||
Line 185: | Line 185: | ||
|} | |} | ||
== Ruby | == Comparison of Ruby and Java refactoring tools == | ||
Comprehensiveness: | |||
{|Refactoring Options for Ruby in Eclipse | |||
|- | |||
|Convert Local Variable to Field | |||
|- | |||
|Encapsulate Field | |||
|- | |||
|Extract Constant | |||
|- | |||
|Inline | |||
|- | |||
|Merge Class Parts in File | |||
|- | |||
|Merge With External Class Parts | |||
|- | |||
|Move | |||
|- | |||
|Pull Up | |||
|- | |||
|Pull Down | |||
|- | |||
|Rename | |||
|- | |||
|Split Local Variable | |||
|} | |||
{|Refactoring Options in Eclipse for Java | |||
|Rename | |||
|- | |||
|Move | |||
|- | |||
|Change Method Signature | |||
|- | |||
|Extract Local Variable | |||
|- | |||
|Extract Constant | |||
|- | |||
|Inline | |||
|- | |||
|Convert Anonymous Class to Nested | |||
|- | |||
|Convert Member to Top Level | |||
|- | |||
|Convert Local Variable to Field | |||
|- | |||
|Extract Super Class | |||
|- | |||
|Extract Interface | |||
|- | |||
|Extract Class | |||
|- | |||
|Use Supertype where possible | |||
|- | |||
|Pull Up | |||
|- | |||
|Pull Down | |||
|- | |||
|Introduce Parameter Object | |||
|- | |||
|Introduce Indirection | |||
|- | |||
|Introduce Factory | |||
|- | |||
|Introduce Parameter | |||
|- | |||
|Encapsulate Field | |||
|- | |||
|Generalize Declared Type | |||
|- | |||
|Infer Generic Type Arguments | |||
|} | |||
The refactoring options for Ruby and Java cover all the basic refactorings. The differences in the number of options mainly come from the difference in the two languages. Ruby is dynamically typed language, has unbounded polymorphism, and all classes are open to extension. On the other hand, Java is statically typed, polymorphism is mainly implemented via interfaces and inheritance, and classes cannot be extended at runtime. The given examples illustrate the ease of use of the refactoring tools for both Ruby and Java and how well these tools are integrated into the Eclipse IDE. | |||
== References == | == References == |
Revision as of 03:31, 6 September 2009
What is code refactoring
According to the famous book "Refactoring: Improving the Design of Existing Code " by Martin Fowler: Refactoring is the process of applying behavior-preserving transformations to a program with the objective of improving the program’s design. Intuitively people refer to code refactoring as "cleaning it up".
Motivation of refactoring
Refactoring is very useful for software engineer to maintain the quality of their code in different environment. In fact, no software can be guaranteed to be perfect when it is first developed. Usually when the source code is applied to different customer needs, we want to improve the inner-structure without modify the external behavior. The ability to refactor your code takes the pressure off the design phase of software development. Refactoring gives you the ability to change the design of the code at a later stage. This means that you don’t have to get the design absolutely right before you write any code. You can get a rough design worked out, code it up and then if (when) you spot a better design you can refactor your code towards the better design.
List of main refactoring
In the following we list some popular refactoring to specify how refactoring transform the code. For more detail information, the reader please refer to the section 2.1.2 of the thesis of Thomas Corbat[1]. [1] provide Ruby example for each refactoring this list.
1. Merge Class Parts |
2. Convert Local Variable to Field |
3. Encapsulate Field |
4. Extract Method |
5. Inline Class |
6. Inline Method |
7. Move Field |
8. Move Method |
9. Rename Class |
10. Rename Field |
11. Rename Local Variable |
12. Rename Method |
13. Replace Temporary Variable with Query |
14. Split Temporary Variable |
Some Ruby Example of refactoring
before rename:
def badRenameMethod puts("Hello World"); end
after rename:
def hello put("Hello World"); end
before encapsulation:
class SomeClass def initialize @field = 0; end end
after encapsulation:
class SomeClass def initialize @field = 0; end def field @field end private :field def field= field @field = field end private :field= end
Some Java Example of refactoring
before rename:
public class rename_method { static void badRenameMethod() { System.out.println("Hello, world!"); } }
after rename:
public class rename_method { static void hello() { System.out.println("Hello, world!"); } }
before encapsulation:
public class encap_field { public String field; }
after encapsulation:
public class encap_field { private int field;
public void setField(int field) { this.field = field; }
public int getField() { return field; } }
Refactoring support for Current Ruby IDE
This the following table we summary the current ruby IDE and their refactoring support situation.
Current Ruby IDE | Refactoring Support (Y/N) |
ActiveState Komodo | N |
NetBeans | N |
Arachno Ruby | N |
FreeRIDE | N |
Mondrian Ruby IDE | N |
Ruby in Steel | N |
RubyMine | Y |
Eclipse (Aptana) | Y |
Example of using Ruby refactoring tools in Eclipse
example of rename:
example of encapsulation:
Example of using Java refactoring tools in Eclipse
example of rename:
example of encapsulation:
Comparison of Ruby and Java refactoring tools
Comprehensiveness:
Convert Local Variable to Field |
Encapsulate Field |
Extract Constant |
Inline |
Merge Class Parts in File |
Merge With External Class Parts |
Move |
Pull Up |
Pull Down |
Rename |
Split Local Variable |
Rename |
Move |
Change Method Signature |
Extract Local Variable |
Extract Constant |
Inline |
Convert Anonymous Class to Nested |
Convert Member to Top Level |
Convert Local Variable to Field |
Extract Super Class |
Extract Interface |
Extract Class |
Use Supertype where possible |
Pull Up |
Pull Down |
Introduce Parameter Object |
Introduce Indirection |
Introduce Factory |
Introduce Parameter |
Encapsulate Field |
Generalize Declared Type |
Infer Generic Type Arguments |
The refactoring options for Ruby and Java cover all the basic refactorings. The differences in the number of options mainly come from the difference in the two languages. Ruby is dynamically typed language, has unbounded polymorphism, and all classes are open to extension. On the other hand, Java is statically typed, polymorphism is mainly implemented via interfaces and inheritance, and classes cannot be extended at runtime. The given examples illustrate the ease of use of the refactoring tools for both Ruby and Java and how well these tools are integrated into the Eclipse IDE.
References
[1] Thomas Corbat, Lukas Felber, Mirko Stocker Refactoring Support for the Eclipse Ruby Development Tools, Diploma Thesis, HSR University of Applied Sciences Rapperswil Institute for Software
[2] code refactoring wiki, http://en.wikipedia.org/wiki/Code_refactoring
[3] the first workshop on refactoring, https://netfiles.uiuc.edu/dig/RefactoringWorkshop
[4] refactoring tutorial on ruby on rail, http://www.good-tutorials.com/tutorials/ruby-on-rails/refactoring