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?
programming-practices
coding-standards
terminology
Django Reinhardt
sumber
sumber
Jawaban:
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:
... 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.
sumber
Sebuah fungsi mengembalikan nilai, tetapi prosedur tidak.
Sebuah metode yang mirip dengan fungsi, tetapi
internal untukbagian dari kelas. Metode istilah digunakan hampir secara eksklusif dalam pemrograman berorientasi objek.sumber
function
memenuhi kedua peran dalam JS, tetapi fungsi JS mengembalikan semuanya. Ketika pernyataan kembali tidak memiliki nilai, nilai tersebut secara implisitundefined
. Ketika pernyataan kembali tidak ada, penerjemah menambahkan pernyataan kembali implisit. Esoterik, mungkin, tetapi konsisten dengan definisi yang diberikan di sini. Inilah sebabnya mengapavar x = function() {}();
legal di JS; jika bukan untuk pengembalian implisit, ini harus menjadi kesalahan, karena akan di Pascal.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 .
sumber
foo.doSomething()
bukan tanpa parameter. Ini memiliki satu parameter (objekfoo
) 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.foo.doSomething()
menutupfoo
variabel. Pernyataan apa pun didoSomething
dapat mengaksesfoo
melaluithis
atauself
, 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 ...foo.
di depanfoo.doSomething()
? Itu Anda melewatidoSomething()
parameter. Hanya karena tidak ada di antara kurung tidak berarti itu bukan parameter. Thethis
atauself
dalam metode ini gula hanya sintaksis untuk referensi parameter itu.Bruce punya jawaban yang bagus . Saya akan menambahkan, secara semantik:
printf
)sumber
A procedure should "do something" to the arguments
- atau menyebabkan beberapa efek samping lainnya (misalnyaprintf
).printf
mengembalikan nilai - jumlah karakter yang dicetak - sehingga secara teknis fungsi.printf
adalah 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.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!
sumber
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.
sumber