Manfaatnya adalah fungsi murni membuat kode Anda lebih mudah untuk dipikirkan. Atau, dengan kata lain, efek samping meningkatkan kompleksitas kode Anda.
Ambil contoh computeProductPrice
metode.
Metode murni akan meminta Anda untuk kuantitas produk, mata uang, dll. Anda tahu bahwa setiap kali metode dipanggil dengan argumen yang sama, itu akan selalu menghasilkan hasil yang sama.
- Anda bahkan dapat menyimpannya dan menggunakan versi yang di-cache.
- Anda dapat membuatnya malas dan menunda panggilannya saat Anda benar-benar membutuhkannya, mengetahui bahwa nilainya tidak akan berubah sementara itu.
- Anda dapat memanggil metode ini beberapa kali, karena tahu bahwa itu tidak akan memiliki efek samping.
- Anda dapat berargumen tentang metode itu sendiri dalam isolasi dari dunia, mengetahui bahwa semua yang dibutuhkan adalah argumen.
Metode non-murni akan lebih kompleks untuk digunakan dan debug. Karena itu tergantung pada keadaan variabel selain argumen dan mungkin mengubahnya, itu berarti bahwa itu dapat menghasilkan hasil yang berbeda ketika dipanggil beberapa kali, atau tidak memiliki perilaku yang sama ketika tidak dipanggil sama sekali atau dipanggil terlalu cepat atau terlambat.
Contoh
Bayangkan ada metode dalam kerangka kerja yang mem-parsing angka:
decimal math.parse(string t)
Itu tidak memiliki transparansi referensial, karena itu tergantung pada:
Variabel lingkungan yang menentukan sistem penomoran, yaitu Basis 10 atau sesuatu yang lain.
Variabel dalam math
pustaka yang menentukan ketepatan angka untuk diuraikan. Jadi dengan nilai 1
, parsing "12.3456"
akan memberikan string 12.3
.
Budaya, yang mendefinisikan pemformatan yang diharapkan. Misalnya, dengan fr-FR
, parsing "12.345"
akan memberi 12345
, karena karakter pemisahan seharusnya ,
, bukan.
Bayangkan betapa mudah atau sulitnya bekerja dengan metode seperti itu. Dengan input yang sama, Anda dapat memiliki hasil yang sangat berbeda tergantung pada saat Anda memanggil metode, karena sesuatu, di suatu tempat mengubah variabel lingkungan atau beralih budaya atau mengatur presisi yang berbeda. Karakter non-deterministik dari metode ini akan menyebabkan lebih banyak bug dan lebih banyak mimpi buruk debugging. Memanggil math.parse("12345")
dan memperoleh 5349
sebagai jawaban karena beberapa kode paralel menguraikan angka oktal tidak baik.
Bagaimana cara memperbaiki metode yang jelas-jelas rusak ini? Dengan memperkenalkan transparansi referensial. Dengan kata lain, dengan menyingkirkan keadaan global, dan memindahkan semuanya ke parameter metode:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
Sekarang metodenya murni, Anda tahu bahwa tidak peduli kapan Anda memanggil metode, itu akan selalu menghasilkan hasil yang sama untuk argumen yang sama.