Konvensi penamaan untuk fungsi yang memiliki efek samping? [Tutup]

9

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!

cowok teknis
sumber
1
Ini mungkin bervariasi antar bahasa dan cenderung sangat berorientasi pada pendapat.
David Arno
1
Sebagai contoh, konvensi Scala adalah untuk mendeklarasikan metode tanpa tanda kurung (seperti properti), kecuali jika mereka memiliki efek samping. Tetapi Anda tidak dapat menggunakan ini dalam bahasa lain yang saya tahu. Tanda seru itu tampak mengerikan bagi saya; ada terlalu banyak kegunaan lain untuk simbol itu, dan saya akan menemukan itu digunakan untuk menandai metode yang mengganggu.
Robert Harvey
2
@RobertHarvey Saya percaya Skema adalah bahasa yang menggunakan konvensi itu, dan konvensi ada karena operator untuk mengubah keadaan variabel adalah !(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 .
Servy
3
@Servy Standard Scheme memiliki 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.
Jack
1
Ruby juga menggunakan !konvensi (mis. Untuk downcasedan downcase!), tetapi ini mengindikasikan "bahaya" lebih umum daripada "efek samping".
Andrew

Jawaban:

8

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 salinan myArray. 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.

Nama fungsi dan metode sesuai dengan efek sampingnya

  • Mereka yang tidak memiliki efek samping harus membaca frasa kata benda.
  • Mereka yang memiliki efek samping harus membaca sebagai frase kata kerja imperatif.

( https://swift.org/documentation/api-design-guidelines/#strive-for-fluent-usage )

Daniel T.
sumber
4

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. bindOperasi 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.

kepala kebun
sumber
perhatikan bahwa haskell juga memiliki unsafePerformIO
jk.
Saya tidak terlalu akrab dengan Haskell. Sebagian besar bahasa yang aman menyediakan cara untuk menumbangkan sistem tipe sebagai upaya terakhir. Juga, nama pengguna Anda menyulitkan saya untuk menganggap serius apa pun yang Anda ucapkan: D
gardenhead
@ jk unsafePerformIO dapat diabaikan dengan aman dalam konteks ini. Ini adalah jalan keluar yang tidak dimaksudkan untuk digunakan oleh kode reguler, dan ia datang dengan peringatan dan peringatan yang signifikan . Itu tidak harus digunakan dengan kode efek samping.
Andres F.
@AndresF. maksud saya adalah tidak aman * adalah konvensi penamaan untuk, hal-hal yang tidak aman di Haskell, yang cukup berarti hal-hal yang mereka sendiri melakukan efek samping, meskipun itu juga hanya digunakan oleh implementasi itu sendiri bukan oleh kode pengguna
jk.
3

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 getdan setuntuk 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 dan l_untuk operasi stateless.

Gagasan yang lebih modern adalah menempatkan kata sebagai awalan atau sufiks. Mungkin calculatefungsi murni tetapi mutateCalculationtidak 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.

Michael
sumber
Terima kasih atas tanggapannya. Saya setuju bahwa di dunia yang ideal ini sebagian besar harus ditangani oleh pemisahan keprihatinan. Kasus penggunaan utama saya untuk konvensi penamaan adalah dalam memilah-milah dan refactoring kode lama yang belum tentu ditulis dengan keanggunan dan praktik terbaik dalam pikiran! (mungkin kadang-kadang sendirian di hari sebelum saya mendapat agama!)
technicalbloke
Oh dan artikel Joel Spolsky itu fantastis, terima kasih untuk tautannya!
technicalbloke