Metode vs Fungsi vs Prosedur

107

Pertanyaan sederhana, tetapi saya sering mendengar tiga istilah ini didefinisikan dengan keganasan seperti itu, tetapi yang telah saya ketahui memiliki arti yang berbeda selama bertahun-tahun.

Apa definisi "Prosedur", "Metode", "Fungsi", "Subrutin" yang benar, dll?

Django Reinhardt
sumber
4
Anda melupakan "rutinitas"
mefisto
1
@teresko: Saya pikir "subroutine" lebih umum.
mk12

Jawaban:

108

Saya akan pergi dengan jawaban yang berbeda di sini: secara praktis, tidak ada perbedaan , dengan sedikit pengecualian bahwa "metode" biasanya mengacu pada subrutin yang terkait dengan objek dalam bahasa OO.

Istilah "prosedur, fungsi, subrutin, subprogram, dan metode" semuanya benar-benar memiliki arti yang sama: sub-program yang dapat dipanggil dalam program yang lebih besar. Tetapi sulit untuk menghasilkan definisi yang menangkap semua varian penggunaan istilah ini, karena mereka tidak digunakan secara konsisten di seluruh bahasa pemrograman atau paradigma.

Anda mungkin mengatakan suatu fungsi mengembalikan nilai. Nah, fungsi C berikut tidak mengembalikan nilai:

void f() { return; }

... tapi saya ragu Anda akan menemukan orang yang akan menyebutnya prosedur.

Tentu saja, dalam Pascal, prosedur tidak mengembalikan nilai dan fungsi mengembalikan nilai, tapi itu hanya refleksi bagaimana Pascal dirancang. Di Fortran, fungsi mengembalikan nilai, dan subrutin mengembalikan beberapa nilai. Namun tidak satu pun dari hal ini yang benar-benar memungkinkan kita untuk menghasilkan definisi "universal" untuk istilah-istilah ini.

Bahkan, istilah "pemrograman prosedural" mengacu pada seluruh kelas bahasa, termasuk C, Fortran dan Pascal, hanya satu yang benar-benar menggunakan istilah "prosedur" untuk berarti apa saja.

Jadi tidak ada yang benar-benar konsisten. Satu-satunya pengecualian mungkin adalah "metode", yang tampaknya digunakan hampir seluruhnya dengan bahasa OO, merujuk pada fungsi yang dikaitkan dengan objek. Meskipun, bahkan ini tidak selalu konsisten. C ++, misalnya, biasanya menggunakan istilah "fungsi anggota" daripada metode, (meskipun istilah "metode" telah merayap ke dalam bahasa C ++ di antara pemrogram.)

Intinya, tidak ada yang benar-benar konsisten. Ini hanya mencerminkan terminologi yang digunakan oleh bahasa apa pun yang sedang populer saat itu.

Charles Salvia
sumber
Itulah tepatnya yang saya pikirkan jawabannya. (Saya seharusnya menambahkan "subroutine" sebagai varian lain di belakang.) Dapatkah saya bertanya: Mengapa Anda tidak menemukan orang yang menyebut fungsi C sebagai "Prosedur"? Karena secara teknis salah, atau karena istilah "prosedur" saat ini tidak populer?
Django Reinhardt
7
Pemrogram C menggunakan istilah "fungsi" hanya karena perancang C menggunakan istilah itu.
Charles Salvia
15
Jangan membuang bayi dengan air mandi. Hanya karena terminologinya tidak digunakan dengan konsistensi penuh, tidak berarti bahwa istilah yang berbeda tidak memiliki makna yang berbeda. Definisi @ Bruce's dan @ Frank diakui secara luas, bukan idiosinkratik. Fakta bahwa maknanya tidak universal itu penting, tetapi itu tidak membenarkan lompatan untuk "secara praktis, benar-benar tidak ada perbedaan". (@Jango)
LarsH
9
Jenis dual ke C ++, yang memanggil metode "fungsi anggota", fungsi panggilan Java dan C # "metode statis".
Jörg W Mittag
2
Jawaban Bruce jelas merupakan jawaban yang harus Anda pilih jika Anda baru mengenal pemrograman. Definisinya akan sepenuhnya benar, 99% dari waktu. Tetapi saya mencari lebih banyak jawaban teknis / teoretis. Terkadang programmer yang lebih baru hanya tahu domain mereka sendiri, dan bersikeras bahwa hanya itu yang ada. Pada kenyataannya ada programmer yang bekerja hari ini yang masih menggunakan bahasa yang lebih tua, dan yang tidak "salah" untuk menggunakan definisi yang berbeda. Itulah yang paling saya minati.
Django Reinhardt
67

Sebuah fungsi mengembalikan nilai, tetapi prosedur tidak.

Sebuah metode yang mirip dengan fungsi, tetapi internal untuk bagian dari kelas. Metode istilah digunakan hampir secara eksklusif dalam pemrograman berorientasi objek.

Bruce Alderman
sumber
8
Tidak sepenuhnya internal. Metode adalah fungsi atau prosedur apa pun yang merupakan bagian dari kelas.
Scott Whitlock
8
Jadi "Prosedur Tersimpan" dalam SQL tidak mengembalikan nilai apa pun? Bagaimana dengan "Prosedur" dalam sesuatu seperti Pascal? Apakah definisi Anda didasarkan pada tren saat ini atau haruskah mereka dianggap sebagai definisi universal? Terima kasih!
Django Reinhardt
3
@ Django: Dalam Pascal prosedur tidak dapat memiliki nilai kembali, dan fungsi harus memiliki nilai kembali. Dalam beberapa bahasa lain, terminologi dapat digunakan lebih longgar.
Bruce Alderman
1
FWIW, FORTRAN memiliki SUBROUTINE dan FUNGSI sejak awal, perbedaannya adalah SUBROUTINE tidak mengembalikan nilai. Saya tidak ingat tentang ALGOL, dari mana Pascal diturunkan.
David Thornley
2
@ 3p1c_d3m0n Memang benar bahwa functionmemenuhi kedua peran dalam JS, tetapi fungsi JS mengembalikan semuanya. Ketika pernyataan kembali tidak memiliki nilai, nilai tersebut secara implisit undefined. Ketika pernyataan kembali tidak ada, penerjemah menambahkan pernyataan kembali implisit. Esoterik, mungkin, tetapi konsisten dengan definisi yang diberikan di sini. Inilah sebabnya mengapa var x = function() {}();legal di JS; jika bukan untuk pengembalian implisit, ini harus menjadi kesalahan, karena akan di Pascal.
Titik koma
52

Sebuah fungsi adalah sesuatu yang membutuhkan banyak masukan dan mengembalikan satu atau lebih nilai. Jika nilai yang dikembalikan sepenuhnya ditentukan oleh input, dan fungsi tidak memiliki efek samping (masuk, mungkin, atau menyebabkan perubahan status di luar dirinya sendiri), maka itu disebut fungsi murni.

Sebuah prosedur adalah fungsi yang tidak mengembalikan nilai. Secara khusus, ini berarti bahwa prosedur hanya dapat menyebabkan efek samping. (Itu mungkin termasuk memutasikan parameter input!)

Sebuah metode adalah fungsi yang menutup lebih dari satu set variabel, yaitu, penutupan . Dibutuhkan nol atau lebih parameter input, memiliki akses ke set variabel ini, dan mengembalikan nol atau lebih nilai. Dalam bahasa OO metode ini dilampirkan ke objek atau kelas.

Dalam sebagian besar bahasa OO arus utama, variabel-variabel tertutup tersebut disebut bidang anggota, atau variabel instan, dari suatu objek. Metode dapat berupa fungsi murni, fungsi tidak murni atau prosedur.

Definisi terakhir mengarah ke objek = struct + korespondensi penutupan .

Frank Shearar
sumber
5
Jadi objek adalah kumpulan variabel dan kumpulan penutupan atas variabel-variabel umum ini. Pada dasarnya, bahasa berorientasi objek selalu memiliki penutup dan tidak ada yang tahu? Tampilan menarik! +1
Giorgio
1
Saya tidak percaya sebagian besar metode menutup apa pun. foo.doSomething()bukan tanpa parameter. Ini memiliki satu parameter (objek foo) dengan diberikan dengan gula sintaksis. Penutupan akan dapat merujuk objeknya tanpa perlu parameter seperti itu. Itu tidak berarti metode tidak bisa menjadi penutupan, hanya saja sebagian besar tidak, dan menjadi OO tidak cukup untuk bahasa untuk mendukung penutupan.
8bittree
3
foo.doSomething()menutup foovariabel. Pernyataan apa pun di doSomethingdapat mengakses foomelalui thisatau self, tergantung pada bahasa Anda. Ini adalah definisi "tutup". Kelas menutup variabel anggota mereka, oleh karena itu (mengabaikan "apa itu OO"), OO sudah cukup. Ini cukup terkenal dalam literatur ...
Frank Shearar
1
Eh, tidak. Lihat itu sedikit foo.di depan foo.doSomething()? Itu Anda melewati doSomething()parameter. Hanya karena tidak ada di antara kurung tidak berarti itu bukan parameter. The thisatau selfdalam metode ini gula hanya sintaksis untuk referensi parameter itu.
8bittree
1
@ FrankShearar, saya akan mengatakan hanya ada dua perbedaan yang cukup jelas dalam komputasi - data, dan instruksi. Bahkan itu keluar jendela dalam kasus kode modifikasi diri (tidak biasa). Dalam OO, apa yang secara umum disebut sebagai "metode" (atau "fungsi anggota") tidak perlu berupa metode atau fungsi menurut definisi Anda - semua kata ini dalam penggunaan umum secara efektif bersinonim dengan makna umum dan yang dapat dipertukarkan. "Fungsi tidak murni" yang keberadaannya Anda singgung, hanyalah sinonim (dan juga bertele-tele) untuk konsep umum yang sama "instruksi".
Steve
14

Bruce punya jawaban yang bagus . Saya akan menambahkan, secara semantik:

  • Suatu prosedur harus "melakukan sesuatu" pada argumen atau menyebabkan efek samping lain (mis. printf)
  • Suatu fungsi harus (a) menjawab pertanyaan tentang argumen, atau (b) menghitung nilai baru berdasarkan argumen
  • Metode fungsi harus menjawab pertanyaan tentang keadaan objek
  • Metode prosedur harus mengubah keadaan objek
Scott Whitlock
sumber
Jawaban bagus! Hanya satu tambahan kecil: A procedure should "do something" to the arguments- atau menyebabkan beberapa efek samping lainnya (misalnya printf).
Allon Guralnek
1
@ Semua Catatan yang printfmengembalikan nilai - jumlah karakter yang dicetak - sehingga secara teknis fungsi.
Sjoerd
@ Soerd. Saya tidak setuju itu printfadalah nilai. Itu memiliki efek samping tertentu di luar ruang lingkup doa: yaitu I / O untuk apa pun output standar yang seharusnya. Meskipun, Scott tidak secara eksplisit membedakan ini, dalam fungsi pemrograman fungsional seharusnya tidak memiliki efek samping, dan harus dapat menjawab pertanyaan seolah-olah Anda memiliki data aktual yang dikembalikan.
Alan
4

jawaban rinci yang bagus di atas; ceritanya adalah bahwa mereka semua akan memberi rasa subrutin; apa yang dimaksud dengan setiap istilah akan bervariasi sesuai dengan konteks bahasa pemrograman

secara umum, fungsi mengembalikan nilai, tetapi tidak harus

metode adalah istilah OOP umum saat ini

dalam SQL, prosedur tersimpan memiliki output tetapi biasanya hanya mengembalikan kode kesalahan, sementara fungsi yang ditentukan pengguna harus mengembalikan nilai (yang mungkin merupakan hasil-set)

lagi, perbedaan yang tepat antara istilah-istilah ini tergantung pada siapa yang Anda ajak bicara!

Steven A. Lowe
sumber
2

80% kemahiran terkait langsung dengan keakraban dengan nomenklatur,

95% produktivitas adalah kemampuan untuk mengidentifikasi apa yang bermanfaat saat ini terlepas dari istilah yang digunakan untuk menggambarkannya

Saya lebih suka memanggil mereka semua metode dalam c # kecuali kembali ketika saya menggunakan MSSQL kita punya sproc, tapi tentu saja sekarang kita menggunakan Postgres dan mereka disebut fungsi.

MvcCmsJon
sumber
13
83,5% dari semua statistik dibuat di tempat ;-P
Django Reinhardt
1
Harus saya akui, saya merasa gugup ketika mendengar seseorang melontarkan istilah "metode" ketika bekerja dalam bahasa non-OO. Tampaknya sangat berkorelasi dengan berlari ke kode non-idiomatik.
Racheet
Saya menggunakan 'Metode' ketika merujuk ke kode C karena banyak programmer OO yang saya tangani mengalami gangguan mental saat mendengar istilah prosedur atau fungsi. Untuk bersenang-senang, jika saya benar-benar ingin mengacaukannya, saya mungkin menukar istilah secara acak. Ini tidak baik, seperti mengundang poltergeist ke rumah Anda ... :)
mattnz