Apakah ada kasus di mana kode verbose lebih banyak (seperti dalam pernyataan yang lebih logis) lebih bersih daripada kode lebih ringkas?
Apakah ada kasus di mana kode verbose lebih banyak (seperti dalam pernyataan yang lebih logis) lebih bersih daripada kode lebih ringkas?
Jawaban:
Untuk menjawab itu, mari kita ambil contoh dunia nyata yang terjadi pada saya. Di C # perpustakaan yang saya pelihara, saya memiliki kode berikut:
TResult IConsFuncMatcher<T, TResult>.Result() =>
TryCons(_enumerator) is var simpleMatchData && !simpleMatchData.head.HasValue
? _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
: _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
Membahas hal ini dengan teman sebaya, putusan bulat adalah bahwa ekspresi terner bersarang, ditambah dengan penggunaan "pintar" is var
menghasilkan kode singkat, tetapi sulit dibaca.
Jadi saya refactored ke:
TResult IConsFuncMatcher<T, TResult>.Result()
{
var simpleMatchData = TryCons(_enumerator);
if (!simpleMatchData.head.HasValue)
{
return _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
}
return _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
}
Versi asli berisi hanya satu ekspresi majemuk dengan implisit return
. Versi baru sekarang berisi deklarasi variabel eksplisit, if
pernyataan dan dua eksplisit returns
. Ini berisi lebih banyak pernyataan dan lebih banyak baris kode. Namun semua orang yang saya berkonsultasi menganggapnya lebih mudah dibaca dan beralasan, yang merupakan aspek kunci dari "kode bersih".
Jadi jawaban untuk pertanyaan Anda adalah "ya" tegas, lebih banyak verbose bisa lebih bersih daripada kode ringkas dan dengan demikian merupakan refactoring yang valid.
!
dari kondisi. Saya juga menyarankan menempatkan pengembalian kedua dalam else
. Tetapi bahkan ketika berdiri, itu adalah peningkatan besar-besaran.
if (!foo.HasValue)
merupakan idiom dalam kode Anda, bahkan lebih kuat lagi. Namun if
tidak benar-benar keluar-awal - itu adalah "melakukan ini atau itu tergantung."
1. Kurangnya korelasi antara LOC dan kualitas kode.
Tujuan dari refactoring adalah untuk meningkatkan kualitas sepotong kode.
LOC adalah metrik yang sangat mendasar yang, kadang-kadang, berkorelasi dengan kualitas sepotong kode: misalnya, metode dengan beberapa ribu LOC cenderung memiliki masalah kualitas. Perlu dicatat, bagaimanapun, bahwa LOC bukan satu - satunya metrik, dan dalam banyak kasus tidak memiliki korelasi dengan kualitas. Misalnya, metode 4 LOC tidak selalu lebih mudah dibaca atau lebih dapat dipelihara daripada metode 6 LOC.
2. Beberapa teknik refactoring terdiri dari penambahan LOC.
Jika Anda mengambil daftar teknik refactoring , Anda dapat dengan mudah menemukan teknik yang terdiri dari penambahan LOC secara sengaja . Contoh:
Keduanya adalah teknik refactoring yang sangat berguna, dan pengaruhnya terhadap LOC benar-benar tidak relevan ketika mempertimbangkan apakah akan menggunakannya atau tidak.
Hindari menggunakan LOC.
LOC adalah metrik yang berbahaya. Sangat mudah untuk diukur, dan sangat sulit untuk ditafsirkan dengan benar.
Sampai Anda menjadi terbiasa dengan teknik pengukuran kualitas kode, pertimbangkan untuk menghindari mengukur LOC di tempat pertama. Sebagian besar waktu, Anda tidak akan mendapatkan apa pun yang relevan, dan akan ada kasus di mana itu akan menyesatkan Anda untuk menurunkan kualitas kode Anda.
Jika Anda ingin melihat hasil akhir dari hanya meminimalkan jumlah byte atau jumlah LoC dari kode sumber Anda, silakan lihat kiriman ke situs Golf Kode Stack Exchange .
Jika kode sumber Anda dikurangi sedemikian rupa, Anda akan segera mengalami kekacauan yang tidak dapat dipertahankan. Bahkan jika Anda adalah orang yang menulis kode seperti itu, dan memahaminya sepenuhnya pada saat itu, seberapa efisienkah Anda ketika Anda kembali ke kode itu dalam waktu enam bulan? Tidak ada bukti bahwa kode minimal tersebut benar-benar mengeksekusi lebih cepat baik.
Kode harus ditulis sedemikian rupa sehingga setiap anggota tim Anda dapat melihatnya, dan memahami apa yang dilakukannya segera.
Ya refactoring pasti dapat menghasilkan lebih banyak baris kode.
Kasus IMO yang paling umum adalah ketika Anda mengambil kode yang tidak generik dan Anda membuatnya lebih generik / fleksibel . Pembuatan kode secara mudah membuat garis kode meningkat secara signifikan (terkadang dengan faktor dua atau lebih).
Jika Anda mengharapkan kode generik yang baru untuk digunakan oleh orang lain (bukan hanya sebagai komponen perangkat lunak internal) sebagai pustaka, maka Anda biasanya akan menambahkan kode yang belum dikirim dan markup dokumentasi dalam kode yang akan menambah baris kode lagi.
Misalnya, inilah skenario yang sangat umum terjadi pada setiap pengembang perangkat lunak:
Beberapa contoh nyata yang muncul di kepala saya: