Apa itu Code Refactoring dalam Pemrograman?

Assalamu‘alaikum wr. wb.

Halo gais! Bagi seorang Programmer, pastinya memiliki kesalahan, apalagi kalau jumlah barisnya sangat banyak. Untuk itulah, yang diperlukan yang namanya Code Refactoring.

Ilustrasi Proses Code Refactoring 


Sumber Artikel Materi : Techtarget.comBmc.com

A. Pengertian Code Refactoring

Refactoring adalah proses yang melibatkan modifikasi pada struktur kode untuk meningkatkan desain internalnya tanpa mempengaruhi perilaku eksternalnya. Tujuan utama refactoring adalah untuk meningkatkan keterbacaan kode, mengurangi kerumitan, dan menemukan bug tersembunyi atau kerentanan dalam perangkat lunak.

Pengembang perangkat lunak dan pemrogram komputer memanfaatkan refactoring untuk meningkatkan desain, implementasi, dan struktur perangkat lunak. Proses ini melibatkan serangkaian perubahan kecil pada kode sumber program. Salah satu pendekatan untuk refactoring adalah memperbaiki struktur kode pada titik tertentu dan kemudian menerapkan perubahan yang sama ke semua referensi yang berlaku secara sistematis di seluruh program. Gagasan di balik pendekatan ini adalah bahwa beberapa perubahan kecil yang mempertahankan perilaku perangkat lunak dapat memiliki efek kumulatif dan meningkatkan kinerja perangkat lunak secara keseluruhan. Refactoring bertujuan untuk mempertahankan perilaku asli perangkat lunak sambil melakukan perbaikan pada strukturnya.

B. Tujuan Code Refactoring

Refactoring meningkatkan kode dengan membuatnya:

  • Lebih efisien dengan mengatasi ketergantungan dan kompleksitas.
  • Lebih dapat dipelihara atau digunakan kembali dengan meningkatkan efisiensi dan keterbacaan.
  • Lebih bersih sehingga lebih mudah dibaca dan dipahami.
  • Lebih mudah bagi pengembang perangkat lunak untuk menemukan dan memperbaiki bug atau kerentanan dalam kode.

Modifikasi kode dilakukan tanpa mengubah fungsi apa pun dari program itu sendiri. Banyak lingkungan pengeditan dasar mendukung pemfaktoran ulang sederhana seperti mengganti nama fungsi atau variabel di seluruh basis kode.

C. Penggunaan Code Refactoring dalam Pemrograman

Pemfaktoran ulang dapat dilakukan setelah produk diterapkan, sebelum menambahkan pembaruan dan fitur baru ke kode yang ada, atau sebagai bagian dari pemrograman sehari-hari.

Ketika proses dilakukan setelah penyebaran, biasanya dilakukan sebelum pengembang melanjutkan ke proyek berikutnya. Suatu organisasi mungkin dapat memperbaiki lebih banyak kode pada titik ini dalam siklus hidup pengiriman perangkat lunak, di mana pengembang telah meningkatkan ketersediaan dan lebih banyak waktu untuk mengerjakan perubahan kode sumber yang diperlukan.

Namun, waktu yang lebih baik untuk melakukan pemfaktoran ulang adalah sebelum menambahkan pembaruan atau fitur baru ke kode yang sudah ada. Saat dilakukan pada titik ini, pemfaktoran ulang memudahkan pengembang untuk membuat kode yang sudah ada karena mereka akan kembali dan menyederhanakan kode, membuatnya lebih mudah dibaca dan dipahami.

Ketika sebuah organisasi memiliki pemahaman yang kuat tentang proses refactoring, itu dapat menjadikannya sebagai proses reguler. Setiap kali pengembang perlu menambahkan sesuatu ke basis kode, mereka dapat melihat kode yang ada untuk melihat apakah itu terstruktur dengan cara yang akan membuat proses penambahan kode baru menjadi mudah. Jika tidak, maka pengembang dapat memfaktorkan ulang kode yang ada. Setelah kode baru ditambahkan, pengembang dapat memfaktorkan ulang kode yang sama lagi agar lebih jelas.

Teknik mana yang digunakan seringkali bergantung pada masalah dalam kode Anda. Berikut adalah beberapa teknik umum :

  • Memperbaiki metode penulisan Anda untuk merampingkan, menghapus duplikasi, dan membuat perubahan di masa mendatang jauh lebih mudah dalam kode Anda.
  • Menyederhanakan ekspresi bersyarat, yang menjadi kompleks yang tidak perlu dari waktu ke waktu, dan pemanggilan metode sehingga lebih mudah dipahami, meningkatkan antarmuka untuk interaksi kelas.
  • Memindahkan fitur antar objek untuk mendistribusikan fungsionalitas antar kelas dengan lebih baik. Ini dapat mencakup fungsionalitas pemindahan yang aman, membuat kelas baru, dan menyembunyikan detail implementasi.
  • Mengatur data untuk meningkatkan penanganan dan asosiasi kelas sehingga kelas dapat didaur ulang dan portabel.
  • Meningkatkan generalisasi.

D. Manfaat Code Refactoring

Manfaat utama refactoring adalah membersihkan kode kotor untuk mengurangi utang teknis. Kode yang lebih bersih lebih mudah dibaca, untuk pengembang asli serta pengembang lain yang mungkin mengerjakannya di masa mendatang sehingga lebih mudah untuk mempertahankan dan menambahkan fitur di masa mendatang. Kode yang kurang rumit juga dapat meningkatkan pemeliharaan kode sumber, sehingga arsitektur internal lebih ekspresif.

Kode bersih juga berarti bahwa elemen desain dan modul kode dapat digunakan kembali – jika kode bekerja dengan baik dan bersih, kode tersebut dapat menjadi dasar untuk kode di tempat lain.

Refactoring juga dapat membantu pengembang lebih memahami kode dan keputusan desain. Pemrogram tingkat pemula dan yang lebih mahir bisa mendapatkan keuntungan dari melihat bagaimana orang lain bekerja di dalam dan membangun kode saat fungsionalitas perangkat lunak meningkat dan bergeser. Ini dapat mendorong rasa kepemilikan kolektif – bahwa satu pengembang tidak memiliki kodenya, tetapi seluruh tim bertanggung jawab untuk itu.

Refactoring dapat memberikan manfaat berikut :

  • Membuat kode lebih mudah dipahami dan dibaca karena tujuannya adalah untuk menyederhanakan kode dan mengurangi kompleksitas.
  • Meningkatkan kemampuan pemeliharaan dan mempermudah menemukan bug atau membuat perubahan lebih lanjut.
  • Mendorong pemahaman kode yang lebih mendalam. Pengembang harus berpikir lebih jauh tentang bagaimana kode mereka akan bercampur dengan kode yang sudah ada di basis kode.
  • Fokus tetap hanya pada fungsionalitas. Tidak mengubah fungsionalitas asli kode memastikan proyek asli tidak kehilangan ruang lingkup.

E. Praktik Terbaik Code Refactoring

Praktik terbaik yang harus diikuti untuk refactoring meliputi :

  • Rencanakan untuk pemfaktoran ulang. Jika tidak, mungkin sulit meluangkan waktu untuk latihan yang memakan waktu.
  • Refaktor terlebih dahulu. Pengembang harus melakukan ini sebelum menambahkan pembaruan atau fitur baru ke kode yang ada untuk mengurangi hutang teknis.
  • Refactor dalam langkah-langkah kecil. Hal ini memberikan umpan balik kepada pengembang di awal proses sehingga mereka dapat menemukan kemungkinan bug, serta menyertakan permintaan bisnis.
  • Tetapkan tujuan yang jelas. Pengembang harus menentukan ruang lingkup dan tujuan proyek di awal proses pemfaktoran ulang kode. Ini membantu menghindari penundaan dan kerja ekstra, karena pemfaktoran ulang dimaksudkan sebagai bentuk pemeliharaan, bukan peluang untuk mengubah fungsi atau fitur.
  • Sering-seringlah menguji. Ini membantu memastikan perubahan yang difaktorkan ulang tidak menimbulkan bug baru.
  • Otomatisasi sedapat mungkin. Alat otomasi membuat refactoring lebih mudah dan lebih cepat, sehingga meningkatkan efisiensi.
  • Perbaiki cacat perangkat lunak secara terpisah. Refactoring tidak dimaksudkan untuk mengatasi kelemahan perangkat lunak. Pemecahan masalah dan debugging harus dilakukan secara terpisah.
  • Pahami kodenya. Tinjau kode untuk memahami proses, metode, objek, variabel, dan elemen lainnya.
  • Refactor, tambal dan perbarui secara teratur. Refactoring menghasilkan laba atas investasi paling banyak ketika dapat mengatasi masalah signifikan tanpa menghabiskan terlalu banyak waktu dan tenaga.
  • Fokus pada deduplikasi kode. Duplikasi menambah kerumitan pada kode, memperluas jejak perangkat lunak dan membuang sumber daya sistem.

F. Contoh dari Code Refactoring

Sumber Kode Program : ChatGPT

Berikut, inilah contoh dari Code Refactoring dalam Bahasa C# dan Java.

1. C#

a. Metode Ekstraksi (Extracting Methods)

Kode Asli :

public void CalculateTotalPrice()
{
    // Perform complex calculations
    // ...
    decimal totalPrice = 0;

    // Calculate total price
    // ...
   
    // Print the result
    Console.WriteLine("Total Price: " + totalPrice);
}

Kode yang telah dilakukan Refactoring :

public void CalculateTotalPrice()
{
    decimal totalPrice = CalculatePrice();
    PrintTotalPrice(totalPrice);
}

private decimal CalculatePrice()
{
    // Perform complex calculations
    // ...
    decimal totalPrice = 0;

    // Calculate total price
    // ...

    return totalPrice;
}

private void PrintTotalPrice(decimal totalPrice)
{
    Console.WriteLine("Total Price: " + totalPrice);
}

b. Menggunakan Operator Bersyarat Null (?.)

Kode Asli :

if (person != null)
{
    string name = person.Name;
    Console.WriteLine(name);
}

Kode yang telah dilakukan Refactoring :

string name = person?.Name;
Console.WriteLine(name);

c. Memanfaatkan Query LINQ

Kode Asli :

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

List<int> evenNumbers = new List<int>();

foreach (int num in numbers)
{
    if (num % 2 == 0)
    {
        evenNumbers.Add(num);
    }
}

Kode yang telah dilakukan Refactoring :

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

List<int> evenNumbers = numbers.Where(num => num % 2 == 0).ToList();

d. Memanfaatkan Beralih Ekspresi (Utilizing Switch Expressions)

Kode Asli :

string GetDayOfWeek(DayOfWeek dayOfWeek)
{
    string dayName;
    switch (dayOfWeek)
    {
        case DayOfWeek.Monday:
            dayName = "Monday";
            break;
        case DayOfWeek.Tuesday:
            dayName = "Tuesday";
            break;
        // ... cases for other days of the week ...
        default:
            dayName = "Unknown";
            break;
    }
    return dayName;
}

Kode yang telah dilakukan Refactoring :

string GetDayOfWeek(DayOfWeek dayOfWeek)
{
    return dayOfWeek switch
    {
        DayOfWeek.Monday => "Monday",
        DayOfWeek.Tuesday => "Tuesday",
        // ... cases for other days of the week ...
        _ => "Unknown",
    };
}

e. Menggunakan Interpolasi String

Kode Asli :

string name = "John";
int age = 30;
Console.WriteLine("My name is " + name + " and I am " + age + " years old.");

Kode yang telah dilakukan Refactoring :

string name = "John";
int age = 30;
Console.WriteLine($"My name is {name} and I am {age} years old.");

2. Java

a. Metode Ekstraksi (Extracting Methods)

Kode Asli :

public void calculateTotalPrice() {
    // Perform complex calculations
    // ...
    BigDecimal totalPrice = BigDecimal.ZERO;

    // Calculate total price
    // ...
   
    // Print the result
    System.out.println("Total Price: " + totalPrice);
}

Kode yang telah dilakukan Refactoring :

public void calculateTotalPrice() {
    BigDecimal totalPrice = calculatePrice();
    printTotalPrice(totalPrice);
}

private BigDecimal calculatePrice() {
    // Perform complex calculations
    // ...
    BigDecimal totalPrice = BigDecimal.ZERO;

    // Calculate total price
    // ...

    return totalPrice;
}

private void printTotalPrice(BigDecimal totalPrice) {
    System.out.println("Total Price: " + totalPrice);
}

b. Menggunakan Kelas Opsional

Kode Asli :

String name = null;
if (person != null) {
    name = person.getName();
}

Kode yang telah dilakukan Refactoring :

Optional<String> nameOptional = Optional.ofNullable(person)
                                        .map(Person::getName);
String name = nameOptional.orElse(null);

c. Memanfaatkan Stream API

Kode Asli :

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> evenNumbers = new ArrayList<>();

for (Integer num : numbers) {
    if (num % 2 == 0) {
        evenNumbers.add(num);
    }
}

Kode yang telah dilakukan Refactoring :

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> evenNumbers = numbers.stream()
                                   .filter(num -> num % 2 == 0)
                                   .collect(Collectors.toList());

d. Memanfaatkan Beralih Ekspresi (Java 14+)

Kode Asli :

String getDayOfWeek(DayOfWeek dayOfWeek) {
    String dayName;
    switch (dayOfWeek) {
        case MONDAY:
            dayName = "Monday";
            break;
        case TUESDAY:
            dayName = "Tuesday";
            break;
        // ... cases for other days of the week ...
        default:
            dayName = "Unknown";
            break;
    }
    return dayName;
}

Kode yang telah dilakukan Refactoring :

String getDayOfWeek(DayOfWeek dayOfWeek) {
    return switch (dayOfWeek) {
        case MONDAY -> "Monday";
        case TUESDAY -> "Tuesday";
        // ... cases for other days of the week ...
        default -> "Unknown";
    };
}

e. Menggunakan Pemformatan String (Using String Formatting)

Kode Asli :

String name = "John";
int age = 30;
System.out.println("My name is " + name + " and I am " + age + " years old.");

Kode yang telah dilakukan Refactoring :

String name = "John";
int age = 30;
System.out.printf("My name is %s and I am %d years old.%n", name, age);


Demikianlah penjelasan tentang Refactoring dalam Pemrograman. Semoga bermanfaat bagi Software Developer/Engineer dan juga untuk Mahasiswa IT (Informatika).

Terima Kasih 😄😘👌👍 :)

Wassalamu‘alaikum wr. wb.

Post a Comment

Previous Post Next Post