Menangani Kompleksitas Siklomatik dalam Kode Java

Menangani Kompleksitas Siklomatik dalam Kode Java Debadatta Mishra PendahuluanAnda mungkin pernah mendengar istilah manajemen kode di java. Ini mengacu pada bagaimana mengelola kode sumber Anda sehingga mungkin lebih mudah sampai batas tertentu untuk menanganinya pada saat pemeliharaan. Memang benar bahwa persyaratan berubah dari waktu ke waktu dan kode sumber mengalami perubahan sampai batas tertentu. Anda mungkin pernah melihat beberapa modul tertentu yang tampaknya sangat berisiko untuk disentuh. Beberapa orang mengatakan bahwa modul ini berfungsi dengan baik tetapi kode tidak dapat diatur. Ini terjadi di sebagian besar industri TI, mungkin ada beberapa alasan. Bagaimanapun saya dapat mengatakan menulis kode adalah seni. Beberapa pengembang menanggapi masalah ini dengan sangat serius. Anda mungkin menemukan kesempatan peninjauan kode dan audit kode di organisasi. Cara menulis kode yang lebih baik berada di luar cakupan artikel ini.Pada artikel ini saya ingin fokus pada kompleksitas siklomatik yang jauh lebih lazim dalam kode sumber. Juga benar bahwa Anda dapat menjauhkan diri dari konsep ini. Catatan kuncinya adalah bagaimana menangani kompleksitas kode.

Teknis

Cyclomatic Complexity adalah konsep metrik yang dicetuskan oleh Thomas McCabe. Ini memberikan gagasan tentang kompleksitas struktural dari suatu metode atau kode sumber. Pada dasarnya ini berkaitan dengan berbagai kasus putusan dan kondisional. Jika Anda menulis sepotong kode yang mencakup beberapa keputusan dan ketentuan logis, Anda harus menjaga bagian kode itu jika tidak, Anda mungkin menemukan diri Anda dalam kondisi yang semakin berkurang. Alasan utama saya dapat mengatakan bahwa itu terjadi karena perbaikan bug dan beberapa perubahan persyaratan kecil. Jika pengembang lupa beberapa kasus fungsional, dia dapat memperbaiki bug dengan menambahkan satu atau lebih kondisi logis dengan menulis kondisi if atau bersarang if. Umumnya kompleksitas siklomatik dapat dihitung dengan cara berikut.

Kompleksitas siklokmatik = Jumlah titik keputusan + 1 Titik keputusan mungkin pernyataan kondisional Anda seperti if, if… else, switch, for loop, while loop dll.

Silakan lihat contoh berikut String str = "someString"; if (str.equals (case1)) melakukan sesuatu; if (str.equals (case2)) melakukan sesuatu; lain lakukan hal default;

Di sini kompleksitas siklomatik akan menjadi sebagai berikut Kompleksitas Siklomatik = jika untuk case1 + jika untuk case2 + else + 1 = 4 Kompleksitas siklomatik memiliki arti yang lebih penting pada bidang pengujian dan pemeliharaan. Jika Anda menulis kasus uji, Anda harus memperhatikan kompleksitas siklomatik. Jika kompleksitas siklomatik adalah 3, Anda harus menulis setidaknya kasus uji yang valid. Bagan berikut menjelaskan jenis aplikasi. Cyclomatic Complexity terletak 1 - 10  Untuk dipertimbangkan Penerapan normal Cyclomatic Complexity terletak 11 - 20  Penerapan sedang Cyclomatic Complexity terletak 21 - 50  Penerapan berisiko Cyclomatic Complexity terletak lebih dari 50  Penerapan tidak stabil Selain operator logika seperti “&&”, “|| ” juga selain kompleksitas siklomatik. Jika Anda menulis program seperti berikut ini If (name.equals (name1) || name.sama dengan (nama2) || name.equals (name3) && age! = 23) {do something} Di sini Cyclomatic Complexity dapat dihitung sebagai berikut Jumlah titik desakan + jumlah operator logika + 1 yang sama dengan If + || + || + && + 1 = 5 Benar juga bahwa itu akan berdampak pada kinerja aplikasi. Bagaimanapun Anda mungkin melihat dalam desain tertentu, mungkin ada beberapa kasus dan setiap kasus harus ditangani dengan cara yang sama sekali berbeda, beberapa pengembang menulis menggunakan desain pabrik. Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" harus ditangani dengan cara tertentu, jika kasus "B", harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.sama dengan (nama3) && usia! = 23) {lakukan sesuatu} Di sini Kompleksitas Siklomatik dapat dihitung sebagai berikut Jumlah titik decion + jumlah operator logika + 1 yang sama dengan If + || + || + && + 1 = 5 It juga benar bahwa itu akan berdampak pada kinerja aplikasi. Bagaimanapun Anda mungkin melihat dalam desain tertentu, mungkin ada beberapa kasus dan setiap kasus harus ditangani dengan cara yang sama sekali berbeda, beberapa pengembang menulis menggunakan desain pabrik. Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" harus ditangani dengan cara tertentu, jika kasus "B", harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.sama dengan (nama3) && usia! = 23) {lakukan sesuatu} Di sini Kompleksitas Siklomatik dapat dihitung sebagai berikut Jumlah titik decion + jumlah operator logika + 1 yang sama dengan If + || + || + && + 1 = 5 It juga benar bahwa itu akan berdampak pada kinerja aplikasi. Bagaimanapun Anda mungkin melihat dalam desain tertentu, mungkin ada beberapa kasus dan setiap kasus harus ditangani dengan cara yang sama sekali berbeda, beberapa pengembang menulis menggunakan desain pabrik. Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" harus ditangani dengan cara tertentu, jika kasus "B", harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.= 23) {lakukan sesuatu} Di sini Cyclomatic Complexity dapat dihitung sebagai berikut Jumlah titik desakan + jumlah operator logika + 1 yang sama dengan If + || + || + && + 1 = 5. Benar juga bahwa ia akan memiliki berdampak pada kinerja aplikasi. Bagaimanapun Anda mungkin melihat dalam desain tertentu, mungkin ada beberapa kasus dan setiap kasus harus ditangani dengan cara yang sama sekali berbeda, beberapa pengembang menulis menggunakan desain pabrik. Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" harus ditangani dengan cara tertentu, jika kasus "B", harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.= 23) {lakukan sesuatu} Di sini Cyclomatic Complexity dapat dihitung sebagai berikut Jumlah titik desakan + jumlah operator logika + 1 yang sama dengan If + || + || + && + 1 = 5. Benar juga bahwa ia akan memiliki berdampak pada kinerja aplikasi. Bagaimanapun Anda mungkin melihat dalam desain tertentu, mungkin ada beberapa kasus dan setiap kasus harus ditangani dengan cara yang sama sekali berbeda, beberapa pengembang menulis menggunakan desain pabrik. Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" itu harus ditangani dengan cara tertentu, jika kasus "B", itu harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.+1 = 5 Memang benar bahwa ini akan berdampak pada kinerja aplikasi. Bagaimanapun Anda mungkin melihat dalam desain tertentu, mungkin ada beberapa kasus dan setiap kasus harus ditangani dengan cara yang sama sekali berbeda, beberapa pengembang menulis menggunakan desain pabrik. Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" itu harus ditangani dengan cara tertentu, jika itu kasus "B", itu harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.+1 = 5 Memang benar bahwa ini akan berdampak pada kinerja aplikasi. Bagaimanapun Anda mungkin melihat dalam desain tertentu, mungkin ada beberapa kasus dan setiap kasus harus ditangani dengan cara yang sama sekali berbeda, beberapa pengembang menulis menggunakan desain pabrik. Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" itu harus ditangani dengan cara tertentu, jika itu kasus "B", itu harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" itu harus ditangani dengan cara tertentu, jika itu kasus "B", itu harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.Dalam desain pabrik itu mungkin ada kotak sakelar atau beberapa jika kondisi lain. Izinkan saya memberi contoh. Mari kita pertimbangkan Handler yang menangani sangat berbeda berdasarkan input. Jika kasusnya "A" itu harus ditangani dengan cara tertentu, jika itu kasus "B", itu harus ditangani dengan cara lain. Mari kita lihat potongan kode berikut.

 Interface Handler package com.core.cc.handler; /** * @author Debadatta Mishra(PIKU) * */ public interface Handler { public void handle(); } 
Kelas AHandler
 package com.core.cc.handler; /**This class implements Handler * @author Debadatta Mishra(PIKU) * */ public class AHandler implements Handler { public void handle() { System.out.println("A handler"); } } 
Kelas BHandler
 package com.core.cc.handler; /**This class implements Handler Interface * @author Debadatta Mishra(PIKU) * */ public class BHandler implements Handler { public void handle() { System.out.println("B handler"); } } 
kelas AbstractHandler
 package com.core.cc.handler; /**This class is used as a Factory class. * @author Debadatta Mishra(PIKU) * */ public class AbstractHandler { /**This is a very traditional method, you * can obtain the dynamic object by using * several if conditions. * @param handlerName * @return an object of type {@link Handler} */ public static Handler getHandler( String handlerName ) { Handler handler = null; try { if( handlerName.equals("A")) handler = new AHandler(); if( handlerName.equals("B") ) handler = new BHandler(); } catch( Exception e ) { System.out.println("There is no specific handler"); } return handler; } } 
kelas TestDynamicHandler
 import com.core.cc.handler.AbstractHandler; import com.core.cc.handler.Handler; /**This is a testharness class. * @author Debadatta Mishra(PIKU) * */ public class TestDynamicHandler { public static void main(String[] args) { Handler handler = AbstractHandler.getHandler("B"); handler.handle(); } } 

Dalam contoh di atas, tidak ada yang salah dalam menulis kode ini, tetapi compiler mungkin membutuhkan waktu ketika kasus Anda meningkat. Untuk setiap kasus baru, Anda harus menulis kelas baru dan Anda harus menambahkan satu atau lebih klausa if di kelas "AbstractHandler". Anda dapat memodifikasi kelas "AbstractHandler" dengan cara berikut sehingga terlihat sangat canggih dan dengan demikian tidak perlu memperbarui kelas "AbstractHandler".

 package com.core.cc.handler; /**This class is used as a Factory class. * @author Debadatta Mishra(PIKU) * */ public class AbstractHandler { /**This method is used to obtain the dynamic * object of the type Handler * @param handlerName * @return an object of type {@link Handler} */ public static Handler getHandler( String handlerName ) { Handler handler = null; try { handler = (Handler) Class.forName( "com.core.cc.handler." + handlerName + "Handler") .newInstance(); } catch( Exception e ) { System.out.println("There is no specific handler"); } return handler; } } 

Kode di atas menyederhanakan pemrograman Anda dan memberikan fleksibilitas untuk menambahkan casing Anda tanpa membawa perubahan besar. Bagaimanapun, inilah keindahan Desain Pabrik Java. Dalam hal ini Anda dapat membuat argumen bahwa refleksi lebih lambat dari sudut kinerja, saya dapat mengatakan bahwa itu akan lebih cepat dibandingkan dengan klausa if… else. Namun ada beberapa cara Anda dapat menulis kode yang indah untuk menghindari kompleksitas siklomatik yang utama.

Kesimpulan

Saya harap Anda menikmati artikel saya. Jika Anda menemukan masalah atau kesalahan, jangan ragu untuk mengirimi saya email di alamat tersebut

[email protected]

. Artikel ini hanya ditujukan bagi mereka yang baru mengenal pengembangan java. Artikel ini tidak mengandung signifikansi komersial apa pun. Tolong beri saya umpan balik tentang artikel ini.

Artikel ini, "Dealing Cyclomatic Complexity in Java Code" aslinya diterbitkan oleh JavaWorld.