OK, jadi judulnya sedikit clickbaity tapi serius saya sudah tahu, jangan minta tendangan untuk sementara waktu. Saya suka bagaimana ini mendorong metode untuk digunakan sebagai pesan dalam mode berorientasi objek yang benar. Tetapi ini memiliki masalah yang mengganggu yang telah mengoceh di kepala saya.
Saya curiga bahwa kode yang ditulis dengan baik dapat mengikuti prinsip-prinsip OO dan prinsip-prinsip fungsional secara bersamaan. Saya mencoba mendamaikan ide-ide ini dan poin penting yang saya dapatkan adalah return
.
Fungsi murni memiliki dua kualitas:
Menyebutnya berulang kali dengan input yang sama selalu memberikan hasil yang sama. Ini menyiratkan bahwa itu tidak berubah. Keadaannya diatur hanya sekali.
Tidak menghasilkan efek samping. Satu-satunya perubahan yang disebabkan oleh panggilan itu adalah menghasilkan hasilnya
Jadi, bagaimana seseorang berfungsi murni jika Anda telah bersumpah menggunakan return
cara Anda mengkomunikasikan hasil?
The kirim, jangan tanya karya ide dengan menggunakan apa yang beberapa akan mempertimbangkan efek samping. Ketika saya berurusan dengan suatu objek saya tidak menanyakannya tentang keadaan internalnya. Saya katakan apa yang harus saya lakukan dan menggunakan keadaan internal untuk mencari tahu apa yang harus dilakukan dengan apa yang saya perintahkan. Setelah saya katakan, saya tidak bertanya apa yang dilakukannya. Saya hanya berharap itu telah melakukan sesuatu tentang apa yang diperintahkan untuk dilakukan.
Saya memikirkan Tell, Don't Ask sebagai lebih dari sekedar nama yang berbeda untuk enkapsulasi. Ketika saya menggunakan return
saya tidak tahu apa yang memanggil saya. Saya tidak dapat berbicara protokol itu, saya harus memaksanya untuk berurusan dengan protokol saya. Yang dalam banyak kasus dinyatakan sebagai keadaan internal. Bahkan jika apa yang diekspos tidak benar-benar keadaan itu biasanya hanya beberapa perhitungan dilakukan pada keadaan dan masukan argumen. Memiliki antarmuka untuk merespons melalui pemberian kesempatan untuk memijat hasil menjadi sesuatu yang lebih bermakna daripada keadaan internal atau perhitungan. Itu adalah pesan yang lewat . Lihat contoh ini .
Kembali ke masa lalu, ketika disk drive benar-benar memiliki disk di dalamnya dan thumb drive adalah apa yang Anda lakukan di dalam mobil ketika roda terlalu dingin untuk disentuh dengan jari-jari Anda, saya diajari bagaimana orang yang menjengkelkan mempertimbangkan fungsi yang memiliki parameter. void swap(int *first, int *second)
tampak sangat berguna tetapi kami didorong untuk menulis fungsi yang mengembalikan hasilnya. Jadi saya menaruh hati ini pada iman dan mulai mengikutinya.
Tapi sekarang saya melihat orang-orang membangun arsitektur di mana objek membiarkan bagaimana mereka dibangun mengendalikan ke mana mereka mengirim hasilnya. Inilah contoh implementasi . Menyuntikkan objek port keluaran sepertinya sedikit seperti ide parameter keluar lagi. Tapi begitulah cara mengatakan-jangan-tanya benda memberi tahu objek lain apa yang telah mereka lakukan.
Ketika saya pertama kali belajar tentang efek samping saya menganggapnya seperti parameter output. Kami diberitahu untuk tidak mengejutkan orang-orang dengan membuat beberapa pekerjaan terjadi dengan cara yang mengejutkan, yaitu dengan tidak mengikuti return result
konvensi. Sekarang tentu, saya tahu ada tumpukan masalah threading asynchronous paralel yang efek samping bercampur dengan tetapi kembali benar-benar hanya sebuah konvensi yang membiarkan Anda mendorong hasilnya pada tumpukan sehingga apa pun yang disebut Anda dapat mematikannya nanti. Hanya itu yang sebenarnya.
Apa yang sebenarnya ingin saya tanyakan:
Apakah return
satu-satunya cara untuk menghindari semua efek samping kesengsaraan dan mendapatkan keselamatan benang tanpa kunci, dll. Atau bisakah saya mengikuti ceritanya, jangan bertanya dengan cara yang murni fungsional?