Belajar Refactoring dengan .NET

Soeleman 2 Februari 2017

Belajar Refactoring dengan .NET

Kode adalah cara kita menterjemahkan buah pikiran ke dalam instruksi yang dimengerti oleh komputer. Kadang kode tersebut diterjemahkan secara step-by-step dan kode itu hanya dapat diterapkan pada satu method saja.

Di tulisan ini kita coba melihat bagaimana cara untuk memperbaiki dan mengoptimalkan potongan kode menjadi lebih rapi. Terlebih lagi bagaimana caranya kita memanfaatkan potensi yang ada di .NET.

Form

Aplikasi ini sederhana saja. Kita masukkan tanggal untuk dicarikan Zodiac(Western Astrology)-nya. Range-Date per Zodiac menjadi acuan dalam aplikasi ini.

Design Form hanya terdiri dari Label dan DateTimePicker. Dan kita susun seperti pada gambar di bawah. Untuk Label kita rubah menjadi lebih besar dan Bold.

alt text

Akan terlihat seperti di bawah ketika ada perubahan di DateTimePicker-nya. Di sini kita memanfaatkan event ValueChanged sebagai input. Dari sana kita proses dan hasilnya ditampilkan di-Label.

alt text

Agar memudahkan dan lagi pula Zodiac-nya juga sudah fix. Maka kita buat enum ZodiacSign seperti di bawah.

< VB.Net >
alt text

< C# >
alt text

Original

Kode yang di posting ini mencoba menyelesaikan aplikasi ini. Logika-nya sudah benar, sayangnya caranya cukup rumit.

Dari logikanya, kita mencari berdasarkan tanggal dan bulan dalam If-ElseIf. Sayangnya ini agak sulit dan rumit, karena ini bukan sekedar angka tanggal dan bulan. Ini adalah kombinasi tanggal dan bulan dalam waktu. Jadi cara seperti ini kehilangan kontek Range-Date-nya.

< VB.Net >
alt text

< C# >
alt text

InRange

Sekarang kita coba refactor code di atas dengan membuatnya bekerja dalam DateTime. Karena kombinasi interger tanggal dan bulan akan terlalu rumit.

ZodiacInfo Class

Method ini bisa saja jadi method umum. Oleh karena itu kita tempatkan saja di sebuah class. Kita sebut saja ZodiacInfo.

Di sini kita hanya memiliki satu fungsi InRange. Fungsi ini akan merubah tanggal dan bulan menjadi DateTime. DateTime juga memiliki tahun yang dikondisikan sebagai minimum tahun. Pada dasarnya kita tidak memerlukan tahun, yang kita perlukan kontek dari tanggal dan bulan dalam waktu. Dan dari sini baru kita buat pengecekan secara Range-Date.

< VB.Net >
alt text

< C# >
alt text

FormZodiac Class

Dengan adanya fungsi InRange, maka sekarang kita lakukan perubahan pada fungsi ShowZodiac. Maka dengan cara seperti ini kita bisa mem-filter dalam Range-Date.

< VB.Net >
alt text

< C# >
alt text

LINQ

Kalau kita perhatikan dengan kode di atas kurang efektif dan hanya bisa digunakan ditempat itu saja. Apabila ingin menggunakan logika itu di-Form lainnya, tentu kita mengulang lagi. Mari kita coba refactor lagi untuk memenuhi kemalasan mengulang kode itu.

Zodiac Class

Kita buat class ini sebagai struktur data. Data-data yang disimpan disesuaikan dengan kebutuhan. Yang perlu diperhatikan di sini adalah informasi StartDate dan EndDate sebagai bagian dari Range-Date. Tentu Zodiac-nya sendiri juga.

< VB.Net >
alt text

< C# >
alt text

ZodiacInfo Class Refactor

Dengan adanya class Zodiac maka kita bisa buat koleksi dari itu. Hanya ada 12 Zodiac saja, tentu tidak akan banyak memakan memori. Di sini kita buat koleksi itu dengan nama Zodiacs dan hanya bisa di gunakan oleh member dari class ZodiacInfo saja. Jadi cukup aman dan Thread-Safe -- apabila ingin digunakan dalam situasi yang berbeda.

Kita tidak menggunakan fungsi InRange karena kita akan membuatnya lebih sederhana. Pada dasarnya ini adalah pencarian dalam Range-Date. Maka kita bisa lakukan itu terhadap koleksi class Zodiac dengan LINQ. Dan cara-nya mudah sekali, seperti pada fungsi GetZodiac.

< VB.Net >
alt text

< C# >
alt text

FormZodiac Class Refactor

Dengan perubahan seperti ini, kita lihat fungsi ShowZodiac menjadi pendek dan mudah dibaca. Dan tambahannya, kita bisa memberikan informasi tambahan -- dalam hal ini symbol. Apabila ada perubahan format pada LabelInfo, dengan mudah dan cepat dilakukan.

< VB.Net >
alt text

< C# >
alt text

Penutup

Mungkin dalam situasi yang berbeda refactor kode bisa saja berbeda. Dalam programming kita di harapkan terus memperbaiki kode yang ada menjadi lebih baik secara kode dan penggunaannya.

Cara dan methologinya bisa disesuaikan dengan teknologi dan fitur yang ada. Maksudnya refactor tidak terbatas pada satu bahasa atau lingkungan saja. Yang utama adalah kekreatifitasan didalamnya.

Referensi

Perhatian! Code yang ditampilkan dalam tulisan ini merupakan ilustrasi dari yang ingin dipaparkan dan bukan production ready code.
Sudah banyak kejadian karena asal meng-copy-and-paste tanpa mengerti code yang diambil itu ke dalam production.
Selain itu perlu ada tambahan code dan test sebelum siap untuk digunakan secara utuh.