Saya mendengar seseorang mengatakan bahasa mereka memiliki konvensi di mana nama fungsi yang bermutasi harus diakhiri dengan tanda seru. Saya mencoba untuk menulis kode yang lebih fungsional dan saya suka ide entah bagaimana menandai fungsi berdasarkan status efek sampingnya yaitu tidak ada, efek samping ke dalam, efek samping luar (saya tidak tahu tentang terminologi fp yang tepat tetapi Anda mendapatkan ide I berharap).
Jelas mudah bagi saya untuk membuat skema penamaan saya sendiri tetapi saya bertanya-tanya apakah skema / konvensi tersebut sudah ada sebelum saya pergi dan membuat homebake.
sunting: Terima kasih atas semua tanggapan, itulah yang saya kejar dan saya temukan semuanya benar-benar bermanfaat. Saya mungkin seharusnya menyebutkan saya refactoring beberapa javascript lama jadi, sementara bahasa yang diketik secara statis mungkin dapat menegakkan perbedaan antara kode dengan dan tanpa efek samping saya harus bergantung pada konvensi penamaan yang diberlakukan sendiri.
sunting2: Adapun mod menutup ini sebagai terutama berdasarkan pendapat saya harus tidak setuju. Saya bertanya apa, jika ada, konvensi yang umum digunakan - ini adalah definisi siapa pun pertanyaan sebenarnya bukan pendapat!
!
(itu tidak akan valid secara sintaksis untuk bermutasi keadaan variabel tanpa operator itu, jika memori berfungsi ), jadi sebenarnya itu adalah konvensi yang agak masuk akal dalam bahasa itu .set!
untuk memutasikan variabel, tetapi tidak ada!
operator yang berdiri sendiri . Konvensi tersebut ada karena Lisp memiliki riwayat penggunaan simbol dalam pengidentifikasi untuk menyampaikan makna karena sangat sedikit batasan pada apa pengidentifikasi yang valid. Kurangnya pembatasan ada karena fokus Lisp pada makro dan bahasa khusus domain.!
konvensi (mis. Untukdowncase
dandowncase!
), tetapi ini mengindikasikan "bahaya" lebih umum daripada "efek samping".Jawaban:
Ikuti pemisahan perintah-kueri . Fungsi yang mengembalikan nilai tidak memiliki efek samping, fungsi yang memiliki efek samping tidak mengembalikan nilai.
Juga membantu untuk menyebutkan fungsi yang mengembalikan nilai setelah barang dikembalikan, yaitu kata benda atau kata sifat. Sementara fungsi yang memiliki efek samping harus dinamai setelah efek yang mereka lakukan, yaitu, kata kerja.
Jadi misalnya
myArray.sort()
memiliki efek samping, ia mengurutkan array. Oleh karena itu tidak mengembalikan apa pun dan diberi nama setelah kata kerja. Sementara itu,myArray.sorted()
mengembalikan salinanmyArray
. Karena itu ia tidak memiliki efek samping dan dinamai sesuai dengan yang dikembalikan.FYI, ide di atas (kata benda / kata sifat untuk fungsi murni dan kata kerja untuk fungsi efek samping) adalah standar dalam Swift 3.
( https://swift.org/documentation/api-design-guidelines/#strive-for-fluent-usage )
sumber
Masalah mendasar adalah bahwa efek samping tidak ditangkap dalam sistem tipe. Menggunakan konvensi penamaan fungsi adalah pengganti yang buruk untuk verifikasi statis. Ada beberapa cara untuk mengatasi ini.
Haskell menggunakan monad untuk menangkap efek samping dalam suatu konteks.
bind
Operasi monadik menyusun fungsi-fungsi yang tidak murni sama seperti operator komposisi fungsi normal yang menyusun fungsi-fungsi murni. Undang-undang monad memastikan operator ini bertindak secara analog dengan komposisi reguler.Rute lain adalah dengan memisahkan murni dari tidak murni dengan memisahkan ekspresi dari perintah sepenuhnya . Ini adalah dua kategori sintaksis yang sama sekali berbeda yang tidak dapat dicampur. Ekspresi memiliki tipe yang memungkinkan kami membuat istilah. Ekspresi, menurut definisi, tidak dapat bergantung pada penugasan apa pun (tidak memiliki akses ke toko ). Perintah tidak memiliki tipe dalam pengertian tradisional, dan tidak dapat mengembalikan nilai. Mereka hanya dapat berinteraksi dengan program dengan memutasi toko.
Perhatikan bahwa bahasa "fungsional" yang aman secara konvensional, mungkin tidak mengikuti salah satu dari paradigma ini. Misalnya, OCaml dan SML tidak benar membedakan fungsi murni dari yang tidak murni.
Tidak satu pun dari solusi ini yang sempurna, dan ini masih merupakan area penelitian aktif.
sumber
Memanggil metode atau fungsi sepertinya ide yang fantastis karena bisa membantu menyiram saat-saat di mana kode memperkenalkan tingkat ketidakamanan. Joel Spolsky menyelidiki ide ini sedikit banyak dalam artikelnya Making Wrong Code Look Wrong ( http://www.joelonsoftware.com/articles/Wrong.html ) di mana ia merekomendasikan untuk menggunakan versi notasi Hungaria yang kurang dikenal untuk membuat ide-ide tertentu lebih transparan dalam sistem.
Bahasa yang Anda referensikan hampir pasti adalah Skema (lihat http://download.plt-scheme.org/doc/html/guide/set_.html untuk contoh yang mudah). Saya tidak mengetahui apa pun yang bersifat global.
Java awalan metode properti dengan
get
danset
untuk sebagian memenuhi tujuan ini, tapi saya tidak benar-benar mengetahui konvensi umum dari jenis yang Anda sebutkan di luar dunia Lisp yang tidak (seperti yang ditunjukkan @gardenhead) tertanam dalam sistem tipe.Saya pikir, pada intinya, Anda cukup aman membuat pedoman gaya untuk tim Anda, terutama jika Anda berurusan dengan sesuatu dengan banyak konkurensi di mana efek samping bahkan lebih berbahaya daripada biasanya.
Untuk apa pun nilainya, saya dapat memikirkan beberapa cara untuk mengimplementasikan ini dalam bahasa ALGOL-esque. Yang sederhana mungkin merupakan awalan, seperti yang disarankan oleh Spolsky - katakan
s_
untuk operasi stateful danl_
untuk operasi stateless.Gagasan yang lebih modern adalah menempatkan kata sebagai awalan atau sufiks. Mungkin
calculate
fungsi murni tetapimutateCalculation
tidak murni.Akhirnya, ada tingkat di mana banyak hal ini harus ditangani oleh pemisahan masalah - hanya lapisan yang memperbarui basis data yang dapat memperbarui database misalnya. Dalam hal ini, sangat jelas bahwa Anda harus khawatir tentang efek samping di lapisan stateful.
sumber