Alternative Classes with Different Interfaces
Penjelasan Smell
Ada beberapa class yang memiliki fungsi yang sama, namun tidak datang dari interface atau abstract class.
Kesamaan fungsi yang dimaksud adalah fungsi memiliki tujuan yang sama. Namun bisa saja memiliki nama yang berbeda, atau bisa juga memiliki parameter yang serupa namun beda urutan, atau ada parameter yang satuan, ada yang berupa objek (Preserve whole object).
Hal ini bisa terjadi bisa karena class-class tersebut dikerjakan oleh programmer yang berbeda. Sehingga antar programmer tidak sadar ada yang bisa dibuatkan interface diantara code mereka berdua.
Atau bisa karena tidak mengikuti prinsip DIP (Dependency Inversion Principle).
Contohnya, class Ghost.java memiliki fungsi paint
yang bertujuan menggambar Ghost dari spritesheet yang tersedia.
public class Ghost {
public void paint(Graphics2D g){
//draw Ghost pixel from spritesheet
}
}
public class Ghost {
public void paint(Graphics2D g){
//draw Ghost pixel from spritesheet
}
}
Di sisi lain, class PacMan.java memiliki fungsi draw
yang bertujuan sama. Menggambar PacMan dari spritesheet yang tersedia.
public class PacMan {
public void draw(Graphics2D g){
//draw PacMan pixel from spritesheet
}
}
public class PacMan {
public void draw(Graphics2D g){
//draw PacMan pixel from spritesheet
}
}
Penyelesaian
Untuk contoh kasus ini, kita melakukan Extract Superclass. Kita membuat interface Drawable.java yang akan di-implement oleh kedua class.
public interface Drawable {
public void draw(Graphics2D g);
}
public interface Drawable {
public void draw(Graphics2D g);
}
Pada class PacMan sebelumnya, nama fungsi adalah draw
, sedangkan pada Ghost nama fungsi adalah paint
. Dipilih salah satu dari kedua sinonim tersebut yang akan dipakai. Misal diputuskan draw
yang dipakai sebagai nama method di interface Drawable
, maka dilakukan Rename Method pada fungsi paint
di Ghost.java.