Skip to content

Duplicate Code

sourcemaking

Penjelasan Smell

Terdapat bagian code yang sama atau mirip.

Kadang kesamaan terlihat jelas sehingga mudah di-refactor. Namun terkadang, harus putar otak untuk membuat beberapa bagian code yang mirip menjadi lebih generic.

Satu hal yang bisa menjadi rule of thumb adalah Rule of Three. Bila bagian code sudah di copy-paste tiga kali, ini sudah menjadi lampu merah untuk segera dilakukan refactor.

Pada contoh kasus di Foo.java terdapat banyak bagian code yang duplikat di method bar, baz, dan qux.

Penyelesaian

Terjadi extract method di banyak tempat. Selain itu, for yang serupa tetapi tidak sama juga diakali dengan cara di-extract namun ditambahi variabel sehingga bisa digunakan di ketiga fungsi tersebut.

java
package fowler.dispensables.duplicate_code.after;

public class Foo {
	public void bar(){
		clearScreen();
		printWithBorder("Bar");
	}

	public void baz(){
		clearScreen();
		printWithBorder("Baz");
	}

	public void qux(){
		clearScreen();
		printWithBorder("Qux");
	}

	private void printWithBorder(String text) {
		printNTimes("=", 3);
		System.out.println("");
		System.out.println(text);
		printNTimes("=", 3);
		System.out.println("");
	}

	private void clearScreen() {
		for(int i = 0; i < 26; i++){
			System.out.println("");
		}
	}

	private void printNTimes(String s, int n) {
		for(int i = 0; i < n; i++){
			System.out.print(s);
		}
	}
}
package fowler.dispensables.duplicate_code.after;

public class Foo {
	public void bar(){
		clearScreen();
		printWithBorder("Bar");
	}

	public void baz(){
		clearScreen();
		printWithBorder("Baz");
	}

	public void qux(){
		clearScreen();
		printWithBorder("Qux");
	}

	private void printWithBorder(String text) {
		printNTimes("=", 3);
		System.out.println("");
		System.out.println(text);
		printNTimes("=", 3);
		System.out.println("");
	}

	private void clearScreen() {
		for(int i = 0; i < 26; i++){
			System.out.println("");
		}
	}

	private void printNTimes(String s, int n) {
		for(int i = 0; i < n; i++){
			System.out.print(s);
		}
	}
}

Created by Saugi