Sederhananya, pembatasan berarti ada lebih sedikit cara yang benar untuk menyatukan segala sesuatunya, dan fungsi kelas satu memudahkan untuk memfaktorkan hal-hal seperti struktur loop. Ambil loop dari jawaban ini , misalnya:
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
iterator.remove();
}
}
Ini merupakan cara imperatif yang aman di Jawa untuk menghapus elemen dari koleksi saat Anda mengulanginya. Ada banyak cara yang terlihat sangat dekat, tetapi salah. Orang-orang yang tidak mengetahui metode ini kadang-kadang pergi melalui cara berbelit-belit untuk menghindari masalah, seperti iterasi melalui salinan.
Ini tidak terlalu sulit untuk membuat generik ini, jadi ini akan berfungsi pada lebih dari sekedar koleksi Strings
, tetapi tanpa fungsi kelas satu, Anda tidak dapat mengganti predikat (kondisi di dalam if
), sehingga kode ini cenderung disalin dan ditempelkan dan sedikit dimodifikasi.
Gabungkan fungsi-fungsi kelas satu yang memberi Anda kemampuan untuk lulus predikat sebagai parameter, dengan pembatasan kekekalan yang membuatnya sangat menjengkelkan jika Anda tidak melakukannya, dan Anda menghasilkan blok bangunan sederhana seperti filter
, seperti dalam kode Scala ini itu melakukan hal yang sama:
list filter (!_.isEmpty)
Sekarang pikirkan tentang apa tipe sistem memeriksa untuk Anda, pada waktu kompilasi dalam kasus Scala, tetapi pemeriksaan ini juga dilakukan oleh sistem tipe dinamis saat pertama kali Anda menjalankannya:
list
harus semacam jenis yang mendukung filter
metode, yaitu koleksi.
- Elemen-elemen
list
harus memiliki isEmpty
metode yang mengembalikan boolean.
- Output akan menjadi koleksi (berpotensi) lebih kecil dengan jenis elemen yang sama.
Setelah hal-hal itu diperiksa, cara-cara lain apa yang tersisa bagi programmer untuk gagal? Saya tidak sengaja lupa !
, yang menyebabkan kegagalan test case yang sangat jelas. Itu satu-satunya kesalahan yang tersedia untuk dibuat, dan saya hanya membuatnya karena saya langsung menerjemahkan dari kode yang diuji untuk kondisi terbalik.
Pola ini terus berulang. Fungsi kelas satu memungkinkan Anda merombak berbagai hal menjadi utilitas kecil yang dapat digunakan kembali dengan semantik yang tepat, pembatasan seperti immutability memberi Anda dorongan untuk melakukannya, dan mengetik memeriksa parameter dari utilitas tersebut menyisakan sedikit ruang untuk mengacaukannya.
Tentu saja, ini semua tergantung pada programmer yang mengetahui bahwa fungsi penyederhanaan seperti filter
sudah ada, dan dapat menemukannya, atau mengenali manfaat dari membuat sendiri. Cobalah untuk menerapkan ini sendiri di mana-mana hanya menggunakan rekursi ekor, dan Anda segera kembali ke kapal kompleksitas yang sama dengan versi imperatif, hanya lebih buruk. Hanya karena Anda dapat menulisnya dengan sangat sederhana, bukan berarti versi sederhananya jelas.