Apa istilah yang digunakan untuk menggambarkan fungsi / metode yang memodifikasi objek yang dipanggilnya?

12

Maaf untuk pertanyaan umum. Saya telah mencari di seluruh dan menemukan begitu banyak utas yang mirip dengan ini, namun tidak satu pun yang menjawab pertanyaan spesifik saya - mungkin karena istilah yang saya cari bahkan tidak ada.

Seorang teman saya sedang belajar pemrograman, khususnya JavaScript, dan dia bertanya mengapa ini tidak berhasil:

var a = "Hello World";
a.replace("Hello", "Goodbye");

console.log(a)  // Logs "Hello World"

Alasannya adalah karena replacetidak memodifikasi a, karena string tidak dapat diubah di JavaSript. Karena mengembalikan string, Anda harus melakukan sesuatu seperti ...

var a = "Hello World";
a = a.replace("Hello", "Goodbye");

console.log(a);  // Logs "Goodbye World"

Namun, alternatifnya adalah fungsi seperti JavaScript reverse(), karena memodifikasi apa pun namanya. Sebagai contoh:

var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();

console.log(fruits)  // ["Bananas", "Oranges", "Apples"]

Ketika teman saya bertanya kepada saya mengapa replaceitu tidak berfungsi, saya menyadari saya meraih kata yang tidak saya ketahui (sejauh yang saya ketahui) ...

"Anda harus mengatur string ke" string dot replace ", karena fungsi ganti adalah ________."

Anda tidak perlu mengatur array sama dengan "array dot mundur", karena terbalik adalah ________. "

Saya akrab dengan fungsi prototipe meskipun saya tidak percaya itu kata yang saya cari. Adakah yang bisa membantu saya mengisi kekosongan ini?

Santi
sumber
6
Mungkin kata itu "mutator"? seperti di: You don't need to set an array equal to "array dot reverse", because reverse is a mutator function. Saya pikir saya pernah mendengar istilah itu untuk merujuk ke fungsi yang "mengubah" instance yang memanggil mereka. Tapi Anda mungkin harus memeriksa itu di tempat lain.
FrustratedWithFormsDesigner
Menghargai itu! Saya baru saja membaca tentang Metode Mutator dan saya pikir itu sangat cocok dengan percakapan ini. Tentu saja dalam bidang apa yang saya cari.
Santi
Saya bingung: dalam judul, Anda bertanya tentang fungsi yang memodifikasi objek yang menyebutnya, tetapi dalam contoh Anda, Anda menunjukkan metode yang memodifikasi objek mereka disebut pada , yaitu kebalikan dari judul. Yang mana dari keduanya?
Jörg W Mittag
Ya pasti yang dijelaskan dalam 30 baris detail. Saya akan memodifikasi judulnya menjadi akurat, terima kasih untuk head-up!
Santi

Jawaban:

12

Pasangan konsep yang Anda cari adalah parameter yang bisa berubah / tidak berubah dan di tempat / pengembalian hasil.

Dalam contoh Anda:

Anda harus mengatur string ke "string dot replace", karena fungsi replace beroperasi pada string yang, dalam python, tidak dapat diubah sehingga fungsi ganti mengembalikan string baru.

Untuk seorang programmer C / C ++ ini lebih dikenal sebagai parameter "dilewati oleh nilai", daripada "dilewatkan oleh referensi", yang membuat mereka tidak berubah dan mengembalikan hasilnya.

Anda tidak perlu mengatur array sama dengan "array dot reverse", karena reverse beroperasi pada array, yang bisa berubah , sehingga mampu membuat perubahan di tempat sebelum kembali.

Dalam bahasa seperti C / C ++ ini dikenal sebagai parameter "lulus dengan referensi" yaitu melewati alamat yang, jika tidak dimodifikasi oleh const, memungkinkan fungsi untuk mengubah, bermutasi , isi alamat yang mengubah hasil di tempat sebelum kembali.

Tentu saja tidak biasa memiliki fungsi yang mengembalikan hasil oleh kedua mekanisme, misalnya int SomeFn(int p1, int p2, int *ErrCode)dapat, berpotensi mengembalikan hasil baik dalam nilai kembali dan dengan memodifikasi konten ErrCode.

Metode ke-3

Untuk kelengkapan, mekanisme ketiga untuk mengembalikan hasil adalah efek samping atau global , yaitu mengubah cakupan file, lebar program, nilai bersama atau nilai lingkungan. Ini umumnya dianggap berita buruk karena, kecuali didokumentasikan dengan sangat baik, Anda hanya dapat mengetahui apa yang sedang diubah dengan membaca kode secara cermat. Dalam bahasa seperti C / C ++ ini terlalu mudah dilakukan dengan memiliki variabel lingkup luar dengan nama yang diberikan, bahkan mungkin dalam modul lain, dan tidak ada variabel lingkup lokal masking dari nama yang sama. Dalam Python, saat Anda dapat membaca nilai nilai di cakupan luar, kecuali nilai lingkup luar secara eksplisit diatur sebagai tersedia untuk dimodifikasi denganglobal kata kunci, berusaha mengubah variabel lingkup luar secara otomatis membuat lokal dengan nama yang sama.

Steve Barnes
sumber
Ah, saya akrab dengan istilah-istilah ini, meskipun saya tidak yakin apakah ada kata aktual yang menggambarkan fungsi itu sendiri . Seperti dalam, (The reverse function is a _______ function.) Yang dikatakan, ini hampir merupakan respons yang identik dengan yang akhirnya saya berikan kepada teman saya, jadi saya menghargai konfirmasi Anda - meskipun saya masih bertanya-tanya apakah ada istilah tertentu. Saya akan membiarkan pertanyaannya tetap terbuka sedikit tetapi pasti akan menerima ini sebagai jawaban jika kata-kata ini tidak ada.
Santi
2
Dalam beberapa bahasa, seperti python, Anda juga dapat memiliki kelas yang memodifikasi diri mereka sendiri - sementara dalam beberapa konteks ini "tambalan monyet" dianggap sebagai hal yang baik dalam banyak hal itu dianggap "kode modifikasi diri" dan dilarang. Anda juga dapat memiliki "kode evolusi" di mana fragmen kode secara acak "dimutasi" dan / atau digabungkan kemudian diuji dan dipilih untuk kinerja "terbaik" dalam beberapa cara.
Steve Barnes
-1. Apakah string bisa berubah atau tidak ada hubungannya dengan fungsi yang beroperasi di atasnya. Fungsi ini tidak bisa berubah atau berubah, dan itu tidak "kembali atau di tempat". Fungsi dapat mengubah argumennya dan tetap kembali.
Miles Rout
@MilesRout menambahkan bahwa fungsi yang memodifikasi di tempat masih kembali dan beberapa contoh C / C ++ untuk kejelasan ditambah hasil dengan efek samping untuk kelengkapan.
Steve Barnes
4

Cara pilihan saya untuk mengekspresikannya adalah:

  • reverseMetode Array bermutasi . Ini seorang mutator . Kasing khusus yang umum adalah setter .

  • replaceMetode String tidak bermutasi . Itu bukan mutator . Jika tidak mengubah apa pun , itu efek samping gratis . Kasus khusus yang umum adalah pengambil .

  • Karena JavaScript Strings tidak dapat diubah , metode String tidak dapat bermutasi.

    "Hello World". Ganti ("Hello", "Selamat tinggal");

    seharusnya membuat Anda tidak nyaman. Itu tidak mengubah string literal. Itu membuang hasilnya. Analisis kode statis terkadang dapat mendeteksi bug semacam itu.

  • Karena JavaScript Array bisa diubah , metode array dapat bermutasi. JavaScript cenderung menggunakan Array sebagai tempat penyimpanan lokal, mudah dimodifikasi dan jarang disalin.
Jerry101
sumber
2

Terkadang, ketika digunakan dalam konteks pemrograman fungsional murni, saya pernah mendengar fungsi yang memodifikasi nilai input (dan karenanya bukan fungsi murni) yang disebut destruktif . Saya tidak yakin apakah ini istilah yang tepat.

Dalam kasus Anda, Anda akan mengatakan:

Anda harus mengatur string ke "string dot replace", karena fungsi ganti tidak merusak .

Anda tidak perlu mengatur array sama dengan "array dot reverse", karena sebaliknya merusak .

Penantang5
sumber
1

Mungkin murni kata yang Anda cari?

replace()adalah (atau tampaknya) murni karena tidak tampak seperti memiliki efek samping (yaitu, memodifikasi string) sedangkan reverse()tidak murni karena mengubah keadaan array.

Kyle Rush
sumber
Ini adalah konsep terkait, tetapi juga menyiratkan properti lain (misalnya tidak mengakses negara global dan selalu menghasilkan output yang sama untuk input yang sama).
Jacob Raihle
1

Ini biasanya akan dipisahkan menjadi fungsi dan metode (di mana metode adalah subset fungsi). Fungsi adalah bagian dari kode yang dapat disebut secara terpisah, sedangkan metode memiliki konsep 'konteks' saat ini di mana ia beroperasi. Tindakan suatu metode mengubah keadaan konteksnya.

Dalam pemrograman berorientasi objek, konteksnya adalah contoh fungsi yang beroperasi.

richzilla
sumber
0

Saya tidak tahu bahwa ada jawaban resmi, tapi ini dua yang mungkin Anda sukai.

Prosedur

Hanya karena sepertinya jawaban yang bagus untuk pertanyaan ini , yang sangat mirip dengan pertanyaan Anda BTW - Anda harus memeriksanya.

Operasi unary di tempat

Tinjau halaman ini: java.util.function . Ini memberikan semacam nama dibuat untuk delegasi (tanda tangan input / output) dari berbagai prototipe, misalnya delegasi yang mengambil argumen dan tidak mengembalikan apa pun yang disebut konsumen .

Sekarang, sebagai siswa yang cerdik dari OOP, Anda harus menyadari bahwa suatu metode hanyalah fungsi yang mengambil parameter tersembunyi ( this). Karena diberikan sebagai referensi, ia berfungsi sebagai input dan parameter output.

Menurut orang-orang Jawa ini (dan mereka tampak cukup pintar), delegasi yang menerima input tunggal dan mengembalikan nilai dari jenis yang sama disebut operator unary .

Sekarang dalam kasus array::Reverse(), sebuah array tidak berubah, dan berpotensi dapat memakan banyak ruang, sehingga lebih efisien dan nyaman untuk melakukan operasi di tempat. Oleh karena itu Reverse()adalah operator unary di tempat .

Tetapi bagi saya, "operator" adalah simbol khusus (seperti operator tambahan, juga dikenal sebagai +) atau kata kunci matematika seperti mod. Karena itu saya lebih suka menyebutnya operasi ion , menghasilkan operasi unary di tempat .

John Wu
sumber
Anda mencampuradukkan konsep. Reverse()bukan operator, operator unary tidak perlu mengembalikan nilai dari jenis yang sama (misalnya !, delete, typeof), dan operator tidak delegasi. Tetapi "di tempat" adalah istilah yang bagus untuk metode yang mengubah contohnya. [Saya tidak memilih, tapi sepertinya seseorang memilih semua jawaban meskipun semuanya berguna.]
Jerry101
Tidak yakin Anda mengikuti. Prototipe apa pun dapat diwakili oleh delegasi. "Operator" tidak berfungsi untuk saya (seperti yang saya sebutkan) jadi saya katakan "Operasi," dan ya memang Reverse()operasi yang tidak disadari. Tapi secara keseluruhan saya setuju ini semua sedikit aneh, namun saya menggunakan kata demi kata dari dokumen yang ditautkan , yang tampaknya telah ditulis oleh beberapa orang yang cukup pintar. Setidaknya itu lebih baik daripada tidak sama sekali.
John Wu
Oh begitu! Perhatikan bahwa untuk retrofit lambdas ke Jawa, mereka dibangun di atas gagasan antarmuka fungsional (antarmuka Java dengan hanya 1 metode) sehingga kita dapat meneruskan objek Java biasa untuk diterapkan sebagai "fungsi." (Brian Goetz berbicara tentang menambahkan lambda. Beberapa kali dia mengatakan "pendekatan yang jelas akan menyedot.") Ketika membuat antarmuka fungsional untuk objek pemrosesan aliran, mereka semacam istilah yang disalahgunakan seperti "operator." Itu membingungkan! Mereka pasti kehabisan nama baik. Saya tidak berpikir itu sumber istilah yang baik untuk metode OOP yang melakukan / tidak memodifikasi objek penerima.
Jerry101