Some times in a code base , especially inside a class , a field is referenced from many places.
Say you decide to move this field to another class .
A clean way of doing this is to first extract a getter method for that field within the same class .
Now with all occurances replaced by the getter method , move this getter method to the new class .
Similarly replace the code where the field is being set by the appropriate setter code and then move the setter code to another class .
Saturday, April 12, 2008
Refactroing : Handling Duplicate Code
In legacy code bases we see lot of duplicate code . so how do we handle it ?
I am assuming you are using a tool that supports refactoring . In that case ,
Case 1:
If in a class you have lot of repeated code , use extract method refactoring to move the repeated code into a common method inside the class . Now replace if not automatically all occurance s of the repeated code with the call to the newly created method.
Case 2:
You have 2 sibling classes that have same piece of code .
Use extract method to create method with the same name in the 2 classes . Then use pull up refactoring to pull up the common method now in a super class . If the super class does not exist create it now .
Case 3:
You have 2 sibling classes that have almost the same piece of code , but some different bits here and there .
Use extract method to create method with the same signature in both the classes . Then identify the parts that are different , extract these different parts into methods of their own . Make sure that the names of these different parts is same in both sibling classes.
Now use template method design pattern , to create a common method in a super class of these 2 siblings . Using polymorph ism and inheritance to implement the different methods in the sibling classes.
I am assuming you are using a tool that supports refactoring . In that case ,
Case 1:
If in a class you have lot of repeated code , use extract method refactoring to move the repeated code into a common method inside the class . Now replace if not automatically all occurance s of the repeated code with the call to the newly created method.
Case 2:
You have 2 sibling classes that have same piece of code .
Use extract method to create method with the same name in the 2 classes . Then use pull up refactoring to pull up the common method now in a super class . If the super class does not exist create it now .
Case 3:
You have 2 sibling classes that have almost the same piece of code , but some different bits here and there .
Use extract method to create method with the same signature in both the classes . Then identify the parts that are different , extract these different parts into methods of their own . Make sure that the names of these different parts is same in both sibling classes.
Now use template method design pattern , to create a common method in a super class of these 2 siblings . Using polymorph ism and inheritance to implement the different methods in the sibling classes.
Tuesday, April 08, 2008
C++: Object slicing and pass by value
In C++ , when a object is passed by value to a function that accepts a parameter then object slicing might happen. Consider the following class
class Base {
public:
virtual const char * toString() throw();
};
class Derived : public Base {
public:
virtual const char* toString() throw();
};
Derived derived;
Base base;
void doSomething(Base base){
....
}
doSomething(base);
doSomething(derived);
now we have 2 classes Base and Derived with a common virtual function that have been overridden in the derived class . We create 2 objects "derived" and "base".
Both of them are passed to the function doSomething . What happens in this case .
In the first case , it works the way its supposed to . In the second case , object slicing takes place and the members that are just of derived class are chopped off and the virtual function of the base class is called.
class Base {
public:
virtual const char * toString() throw();
};
class Derived : public Base {
public:
virtual const char* toString() throw();
};
Derived derived;
Base base;
void doSomething(Base base){
....
}
doSomething(base);
doSomething(derived);
now we have 2 classes Base and Derived with a common virtual function that have been overridden in the derived class . We create 2 objects "derived" and "base".
Both of them are passed to the function doSomething . What happens in this case .
In the first case , it works the way its supposed to . In the second case , object slicing takes place and the members that are just of derived class are chopped off and the virtual function of the base class is called.
Monday, April 07, 2008
C++ : pointer to member function
class Foo{
public:
int iVal;
int Bar(int);
};
int Foo::* pm;
is a pointer to a member variable that is an integer.
pm = &Foo::iVal;
is used to initailize a pointer to a member variable
Foo foo;
int i = foo.*pm
is used to retrieve values of the pointer to member variable
int (Foo::*pmf) (int) = &Foo::Bar;
is a pointer to member function that is initialized by the address of member function Bar
public:
int iVal;
int Bar(int);
};
int Foo::* pm;
is a pointer to a member variable that is an integer.
pm = &Foo::iVal;
is used to initailize a pointer to a member variable
Foo foo;
int i = foo.*pm
is used to retrieve values of the pointer to member variable
int (Foo::*pmf) (int) = &Foo::Bar;
is a pointer to member function that is initialized by the address of member function Bar
C++ : Preventing implicit type conversion
class Foo{
public:
Foo(int n ){
...
}
};
Foo foo(42);
Foo boo = 42;
In the above mentioned snippet , the first constructor is matched and called. In the second case , for the assignment operator since the right hand side is 42 and since we have a constructor that takes integer as an argument . The corresponding constructor is called . This is syntactic sugar that can lead to lots of problems . To prevent something like this .
the explicit keyword should be used in front of constructors .
public:
Foo(int n ){
...
}
};
Foo foo(42);
Foo boo = 42;
In the above mentioned snippet , the first constructor is matched and called. In the second case , for the assignment operator since the right hand side is 42 and since we have a constructor that takes integer as an argument . The corresponding constructor is called . This is syntactic sugar that can lead to lots of problems . To prevent something like this .
the explicit keyword should be used in front of constructors .
Subscribe to:
Posts (Atom)
Labels
. linux
(1)
algorithm
(15)
analytics
(1)
bash
(2)
bigoh
(1)
bruteforce
(1)
c#
(1)
c++
(40)
collections
(1)
commands
(2)
const
(1)
cosine similarity
(1)
creating projects
(1)
daemon
(1)
device_drivers
(1)
eclipse
(6)
eclipse-plugin-development
(9)
equals
(1)
formatting
(1)
freebsd
(1)
game programming
(1)
hashcode
(1)
heap
(1)
heaps
(1)
immutable-objects
(1)
java
(19)
JDT
(1)
kernel
(1)
linux
(4)
little sugar
(23)
logging
(1)
machine learning
(1)
marker-resolution
(1)
markers
(1)
mergesort
(1)
mixins
(1)
numbers
(1)
opengl
(2)
patterns
(2)
priority-queue
(1)
programming
(51)
ps
(1)
ranking
(1)
refactoring
(3)
references
(1)
security
(1)
set
(1)
shell
(1)
similarity
(1)
statistics
(1)
stl
(1)
tetris
(1)
threads
(1)
trees
(2)
unicode
(1)
unix
(2)
views
(2)
windows programming
(2)
XNA
(1)