Refactoring-pengembangan aplikasi



Salah satu faktor yang menghabiskan sumber daya terbesar dalam sebuah proses pengembangan aplikasi adalah saat menjaga kelangsungan hidupnya. Seiring dengan diimplementasikannya dalam lingkungan operasi secara riil, sebuah aplikasi atau lebih luas lagi, sebuah sistem dituntut agar senantiasa mampu memenuhi kebutuhan yag terus berkembang, jauh dari saat aplikasi tersebut dibangun, dusamping tuntutan untuk beroperasi secara baik dan benar.Untuk memebuhi tuntutan kebutuhan tersebut, perbaikan, penyesuaian atas rule yang digunakan, ataupun fitur-fitur baru ditambahkan ke dalam aplikasi tersebut. Permasalahannya, hal-hal tersebut menyebabkan tingkat kompleksitas kode atas aplikasi tersebut menjadi semakin tinggi, dan tingginya kompleksitas tersebut membuat semakin sulit bagi developer untuk terus menjaga kelangsungan hidup aplikasi tersebut.Kompleksitas ini menjadi semakin bertambah lagi dengan dirilisnya kompiler yang lebih baru ataupun software development kit (SDK) / third-party library yang kerap kali membawa perbaikan, penyesuaian, perubahan, ataupun penambahan fitur-fitur baru yang bahkan bisa saja hingga merubah perilaku kerjanya. Hal ini disebabkan tuntutan untuk memenuhi kebutuhan yang juga berkembang atas tool-tool tersebut.Bagi para developer Delphi tentunya masih bisa mengingat bagaimana perubahan yang terjadi ketika Borland merilis Delphi 6 atau bila aktif mengunakan library Developer Express ataupun FastReport masih bisa membayangkan bagaimana repotnya ketika hendak bermigrasi ke QGrid 4 dari versi sebelumnya ataupun migrasi dari FR 2.X ke versi 3 yang lebih baru.Ditambah lagi dengan kebiasaan kita sebagai developer yang umumnya cenderung mengguakan metode extreme programming yang secara lokal lebih dikenal sebagai HB (hajar bleh) programming, yang cenderung mempertinggi tingkat kompleksitas kode yang ada dan mengakibatkan aplikasi yang dibangun menjadi semakin sulit untuk dijaga kelangsungannya.Untuk mengurangi kompleksitas kode yang semakin tinggi ini, tentunya harus ada suatu teknik yang bisa digunakan developer agar dapat senantiasa menjaga aplikasi yang dibangun bisa tetap beradaptasi dengan kebutuhan yang terus berkembang dalam tingkat kompleksitas yang sedapat mungkin dijaga tetap rasional. Ada beberapa teknik yang dikenal saat ini, metode yang terbaru adalah dengan memanfaatkan modelling atau lebih dikenal dengan UML (unified modelling language), sementara konsep yang telah ada sebelumnya dikenal sebagai refactoring. Namun jika dilihat dari situasi dimana aplikasi sudah ada dan terdapat keharusan agar dapat senantiasa responsif/tanggap menjawab tuntutan pemenuhan kebutuhan yang berkembang dalam waktu yang relatif singkat, metode refactoring sepertinya bisa menjadi jawaban yang lebih rasional atas permasalahan-permasalahan di atas.Refactoring sederhananya merupakan teknik untuk memecahkan tingkat kompleksitas kode ke dalam layer-layer class abstraction yang lebih sederhana dan rasional. Proses penyederhanaan ini pun bisa berbagai macam tingkatannya, dimulai dari yang terkecil, memecah sebuah fungsi yang kompleks ke dalam fungsi-fungsi yang lebih sederhana, merestrukturisasi class abstraction dalam sebuah object class yang kompleks, ataupun memecah sebuah modul ke dalam sub-sub modul yang lebih sederhana.Namun demikian, sedapat mungkin diusahakan agar proses penyederhanaan ini tidak mempengaruhi atau bahkan merubah perilaku kerja aplikasi secara keseluruhan. Hal ini sangat penting karena tidak jarang keinginan untuk memecah kompleksitas kode dengan cara refactoring ini justru malah membuat kode menjadi semakin kompleks dan menyulitkan developer untuk melakukan tracking saat akan melakukan perubahaan terhadap kode tersebut di kemudian hari. Refactoring harus diusahakan sedapat mungkin tidak merubah perilaku ataupun code-visibility dari sisi developer, hal ini bisa dihindari jika dalam proses refactoring tersebut developer bisa secara cermat meletakkan fungsi/method dalam tingkatan visibility dan abstraction yang sesuai sehingga tetap mudah jika suatu saat harus melakukan penyesuaian atas kode tersebut.Dalam implementasinya di Delphi, untuk manajemen code-visibility atas sebuah/beberapa fungsi pada tipikal procedural programming bisa dilakukan dengan cara menghindari deklarasi atas sub-fungsi yang hanya terkait dalam unit tersebut pada blok Interface. Kompiler delphi sebenarnya mendukung fungsi di dalam fungsi, namun jika tidak benar-benar pada kasus yang spesifik, sebaiknya hindari cara seperti ini karena cenderung membuat sulit developer dalam melakukan tracing atas kode tersebut.Pada impelementasi dengan kompiler modern saat ini, sedapat mungkin gunakan model OOP dalam menyelesaikan permasalahan anda, tidak hanya karena karena fitur-fitur yang dimiliki oleh model OOP tersebut, melainkan pula OOP sangat membantu mempermudah developer memanajemen code-visibility atas object yang dibuatnya. Sedapat mungkin hanya meletakkan field-field yang benar-benar bersifat spesifik pada blok private declaration dan secara gunakan property untuk mengakses field tersebut. Bilamana dibutuhkan action atas read ataupun write value terhadap field tersebut, hendaknya diatur agar fungsi yang terkait bersifat expandable untuk meningkatkan fleksibilitas kode yang dibuat tersebut. sebagai contoh:TAppType = (atUnknown, atGLedger, atAcctRcv, atAcctPyb, atPayroll);TMyCustomClass = class(TMyBaseClass)privatefunction GetAppType: TAppType;protectedfunction InternalGetAppType: TAppType; virtual;publicproperty ApplicationID: TAppType read GetAppType;end;function TMyCustomClass.InternalGetAppType: TAppType; virtual;beginResult := atUnknown;end;function TMyCustomClass.GetAppType: TAppType;beginResult := InternalGetAppType;end;Dari contoh di atas kode terlihat semakin panjang dan inefisien untuk mendapatkan nilai atas property ApplicationID, namun keuntungan model seperti ini adalah jika suatu saat anda harus menambahkan level abstraksi baru atas class tersebut dan membutuhkan tambahan task atas fungsi pada property tersebut, hal ini masih bisa anda lakukan dengan cara menginherit fungsi InternalGetAppType, anda tidak bisa menginherit fungsi GetAppType secara langsung karena kompiler mensyaratkan fungsi yang digunakan pada sebuah property bersifat static function.Sebenarnya ada banyak hal lagi yang bisa teknik-teknik yang bisa dilakukan untuk memecahkan tingkat kompleksitas ini, dan saya yakin untuk hal ini anda bisa mencoba mengeksplorasinya secara lebih baik.

Tinggalkan komentar

Belum ada komentar.

Comments RSS TrackBack Identifier URI

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s