CSC/ECE 517 Fall 2009/wiki 1a 7a HJ

From Expertiza_Wiki
Jump to navigation Jump to search

Definition of code refactoring

According to Wikipedia: "Code refactoring is the process of changing a program's internal structure without modifying its external functional behavior or existing functionality with the goals of readability, maintainability, performance, extensibility and simplicity."

Goals of refactoring

Refactoring is motivated by the difficulty of adding new functionality to a program or fixing a bug in it. As we said before, after code refactoring, the program does the the exact same thing it did before.

Refactoring is very useful to improve a program because a software can not be perfect when it is first developed.

Refactoring is one of the most useful tool for software engineer because they can write a rough design which work at first and then refactor the code when they conceive a better design.


The differences are that the new code:

  1. is easier to read and so to understand
  2. contains less duplication
  3. is less complex
  4. is more flexible towards future changes
  5. could lead to a faster compilation time


Common Refactorings Tools

Here is a list of some examples of refactoring techniques used. For further information, the reader please refer to Lecture 3 of CSC 517 of Dr. Gehringer [1] inspired of the site [2] and to the section 2.1.2 of the thesis of Thomas Corbat [3].

  1. Rename
    • Methods
    • Fields
    • Packages
    • Projects
    • Parameters
    • Local Variables
  2. Encapsulate Field
  3. Move
    • Method
    • Field
  4. Pull up
    • Field
    • Method
  5. Push down
    • Field
    • Method
  6. Extract
    • Method
    • Class
    • Constant
    • Local Variables
  7. Convert Local Variables to Field
  8. Change Method Signature


Examples of Refactoring

I inspire myself for the exemples of Dr. Gehringer's course.


Examples of Refactoring for JAVA

JAVA has a lot of tools for refactoring. Here are some examples of Refactoring for JAVA :

Rename

We refactor the code by renaming.

Before renaming:

public class rename_Method
{
    static void WrongRenameMethod() {
        System.out.println("Hello, world");
    }
}

After using rafactor tool rename:

public class rename_Method
{
    static void hello(){
        System.out.println("Hello, world");
    }
}

Encapsulation


The initial code is:

public class encap_abc {
       public String abc;
}

After using the encapsulation, the refactored code is:

public class encap_abc {
       private int abc;
       public void setAbc(int abc)
       {
              this.abc;
       }
public int getAbc(){
       return abc;
       }
}


Examples of Refactoring for Ruby

Ruby is still a newbie in refactoring . Here are some refactoring tools :


Rename

Before rename:

def FirstMethod
     puts("NC State University");
end

After refactoring with rename:

def NCSU
     puts("NC State University");
end

Encapsulation


The initial code is:

class OneClass
      def initialize
      @field = 0;
      end

The refactored code after using encapsulate is: <ref> class OneClass

     def initialize
     @field = 0;
     end
     def field
         @field
     end
     private: field

end </ref>

Current IDE and Refactoring

Current Java IDE and Refactoring

Most of Java IDE support refactoring like Eclipse or IntelliJ IDEA.
Eclipse or IntelliJ IDEA which are some of the most used JAVA IDE, have a lot of refactoring tools already : one clik and you refactor your code.

Current Ruby IDE and Refactoring

The following Current Ruby IDE do not support refactoring :

  • Ruby in Steel
  • Arachno Ruby
  • FreeRIDE
  • Mondrian Ruby IDE

The only current Ruby IDE with refactoring support are:

  • RubyMine
  • Eclipse with Aptana

Current Ruby on Rails IDE and Refactoring

RubyMine [8] is the only Ruby on Rails IDE with refactoring support but it is still the beginning of refactoring in Ruby on Rails.

Ruby Ruby on Rails and JAVA Refactoring Tools : a small comparaison

Comparaison of Refactoring Tools

JAVA Refactoring tools Ruby Refactoring tools Ruby on Rails Refactoring tools
Rename Rename Rename
Move Move
Extract Class Convert Local Variable or Field Extract Methode
Extract Super Class Extract Constant
Extract Local Variable Pull Up
Extract Constant Pull Down
Extract Interface Encapsulate Field
Use Supertype
Encapsulate Field
Pull Up
Pull Down
Introduce Parameter Introduce Variable
Introduce Parameter Object


Conclusion

The differences between the two languages JAVA and Ruby is the number of methods available for refactoring and the number of IDE which support refactoring in the two languages.

JAVA has two times more options for refactoring and all of JAVA IDE support refactoring.

Ruby is like a children which is learning and improving his knowledge by trying to be inspired by what the other already have.

Ruby on Rails knowledge in refactoring is less than Ruby and Ruby and Ruby on Rails is making his first move in the refactoring world.

However, refactoring tools for both JAVA and Ruby are integrated into some IDE like Eclipse and RubyMine for both Ruby and Ruby on Rails.


References

[1] http://courses.ncsu.edu/csc517/common/lectures/notes/lec3-f09.pdf

 
    Refactoring and version control, CSC517, NCSU, Dr. Ed Gehringer
    

[2] http://www.refactoring.com

[3] http://subs.emis.de/LNI/Proceedings/Proceedings106/gi-proc-106-039.pdf

    Complete Thesis: 

http://r2.ifs.hsr.ch/rubyrefactoring.pdf

   Refactoring Support for the Eclipse Ruby Development Tools
   HSR, University of Applied Science Rapperswil  
   Diploma Thesis of Thomas Corbat, Lukas Felber and Mirko Stocker
   

[4] http://refactormycode.com/codes/recent/ruby

 
    Forum for help on refactoring in Ruby 
    

[5] http://refactormycode.com/codes/recent/java

    Forum for help on refactoring in Java 
    

[6] http://www.slideshare.net/jweiss/refactoring-ruby-on-rails-applications

[7] http://railsforum.com/viewtopic.php?id=699

    An exemple of refactoring Ruby on Rails
    

[8] http://www.jetbrains.com/ruby/features/ruby_ide.html#refactorings

   The only IDE which support Refactoring for Ruby on Rails