Cara Memahami Legacy Code

Sebelum kita bahas lebih lanjut mungkin ada yang belum familiar dengan kata legacy code. Jadi apa itu legacy code, jikalau diartikan legacy sendiri artinya adalah warisan, jadi legacy code adalah code warisan atau code yang didapat dari orang lain. Dalam industry legacy code kadang disebut sebagai istilah untuk “code yang tidak dapat dipahami dan sulit untuk dirubah” dan menurut pendapat dari Michael Feather

–“legacy code secara sederhana adalah code tanpa test”

Jadi apa hubunganya test dengan disebutkanya sebuah code itu baik atau buruk. Code tanpa test adalah code yang buruk. Tidak peduli seberapa baik penulisannya , seberapa cantik atau berorientasi object atau ber enkapasulasi dengan baik karena dengan test, kita dapat merubah perilaku code kita dengan cepat dan dapat di verivikasi. Tanpa test kita tidak tahu apakah code kita menjadi semakin baik atau semakin buruk.

Balik lagi ke legacy code , dari tadi kita bahas tentang testing tapi sebenernya kita tidak akan fokus pada testing melainkan tentang bagaimana cara merubah code pada legacy code. Sebelum kita mengetahui cara meruba code pada legacy code , kita harus tahu kenapa kita merubah legacy code , menurut michael feather ada 4 alasan umum untuk merubah code.

  • Adding Feature
  • Fixing Bug
  • Improving Design (Refactoring)
  • Optimizing Resource Usage

Ketika kita akan melakukan perubahan pada legacy code ada beberapa langkah yang harus dilakukan.

1. Identify Change Point

Jika kita tidak memahami design dengan baik akan sangat sulit membuat perubahan yang benar terutama pada code yang tidak kita kenal seperti legacy code. Sebenarnya terdapat beberapa cara untuk membentu memahami sebuah code, seperti

  • Notes/Sketching

Digambar atau mungkin lebih tepatnya coretan/sketsa , kita tidak perlu sampai sedemikian complexnya membuat UML diagram atau graph function secara detail , cukup tuliskan nama nama yang dirasa penting seperti cara kerja code tersebut atau relasi dengan fungsi lainya lalu buat buat bentuk dan beri garis untuk relasinya dan seterusnya . Maka dari situ code yang sedang dipahami paling tidak tertuang dalam gambar dan tidak hilang.

  • Listing Markup

Dalam bahasa singkatnya memberi tanda/comment , kita bisa memberi tanda seperti memberikan penjelasan pada akhir block perulangan atau validasi . Atau memberikan comment apabila pada bagian code butuh validasi atau perbaikan dan sebagainya.

  • Scratch Refactoring

Dalam refactoring diperlukan unit test untuk memastikan bahwa code yang kita refactor tidak terjadi error , tapi dalam kasus legacy code tidak ada unit test yang mendukung itu dan untuk membuat unit test kita perlu pemahaman tentang kode tersebut. Jadi mau tidak mau kita harus merefactoring code tersebut tanpa unit test untuk dengan tujuan untuk memahami code tersebut itulah yang disebut Scratch Refactoring.

  • Delete Unused Code

Jika dirasa ada baris code yang tidak terpakai , biasanya ragu dan berpikir apakah baris code tersebut akan dipakai di tempat lain atau mungkin terpakai di lain kali. Dalam kasus seperti ini kadang kita akan berpikir untuk membiarkan kode tersebut / mendisable kode tersebut (di komen) yang akan berakibat memperpanjang kode (padahal tidak terpakai). Maka kode ini sebaiknya di delete saja dan untuk masalah akan terpakai atau tidak, ada tool yang akan menghandle itu seperti version-control/git.

2. Find Test Point

Atau menemukan bagian mana yang harus di test, terkadang kita akan menemui masalah saat membuat test seperti dependencies yang harus kita pecah dsb. Untuk menemukan bagian yang harus di test ada beberapa konsep yang bisa digunakan.

  • Interception Points

Pada dasarnya Interception point hanyalah letak dimana kita dapat mendeteksi efek dari perubahan tertentu. Cara terbaik untuk memulai adalah mengidentifikasi tempat-tempat di mana perlu melakukan perubahan dan mulai melacak efek ke luar dari titik perubahan tersebut dan setiap tempat yang berpotensi menimbulkan efek itulah disebut interception points.

  • Detecting pinch point

Apa itu pinch point : tempat di mana tes terhadap beberapa metode dapat mendeteksi perubahan dalam banyak metode. Dengan melakukan testing pada pinch point kita bisa memahami code dengan cakupan yang lebih luas.

3. Break Dependencies

Setelah kita mengidentifikasi letak dari test point biasanya langkah selanjutnya adalah membuat code test , sayangya tidak semudah itu salah satu penyebabnya adalah dependencies , sebelum kita menulist code test ada baikntya kita memecah dependecies terlebih dahulu. Untuk contoh pemecahan dependencies bisa dilihat di sini untuk kasus parameter.

4. Write tests

  • Characterization Test

Yang dimaksud Chatacterization test adalah Tes yang mencirikan perilaku sebenarnya dari sepotong kode , caranya

* Gunakan Potongan code yang akan dites
* Tuliskan assertion yang membuatnya gagal
* Hasil gagal tersebut akan memberitahu behaviour dari code tersebut
* Perbaiki test tersebut sesuai dengan behaviournya

  • Characterizing Class

Kita memiliki class dan kita ingin mencari tahu apa yang di uji , langkah awalnya mencoba untuk memahami apa yang Class itu lakukan pada level yang lebih tinggi

* Cari code yang terlihat membingungkan lalu uraikan ke beberapa variable untuk membuatnya mudah dipahami
* Setelah tahu cara kerja dari class tersebut coba untuk membuat unit test yang memicu code tersebut

5. Make change and Refactor

Dan setelah beberapa code telah tercover oleh unit testing maka langkah selanjutnya adalah melakukan Refactoring atau melakukan perubahan. Untuk penjelasan Refactoring sendiri bisa dilihat pada tulisan sebelumnya.

Begitulah tips dan trik membaca legacy code , untuk contoh lebih jelas dan lengkap bisa dibaca bukunya Michael C. Feathers tentang “Working Effectively with Legacy Code”. Semoga bermanfaat dan jangan lupa untuk tidak membuat legacy code yang lainnya.

Sumber Referensi

https://www.goodreads.com/book/show/44919.Working_Effectively_with_Legacy_Code

Leave a comment