Apa sebenarnya pemrograman prosedural? Bagaimana sebenarnya berbeda dari OOP? Apakah sama dengan pemrograman fungsional?

32

Saya pemrograman di Jawa dalam gaya yang sangat berorientasi objek (OO). OOP sangat intuitif bagi saya, tetapi saya memiliki sedikit pengetahuan tentang jenis pemrograman lainnya.

Apa sebenarnya pemrograman prosedural ? Bagaimana sebenarnya berbeda dari OOP? Apakah ini sama dengan pemrograman fungsional ?

Dulu saya berpikir bahwa semua pemrograman yang bukan OO adalah prosedural. Tapi saya mulai berpikir ini tidak benar.

Aviv Cohn
sumber
9
Berbagi penelitian Anda membantu semua orang. Beri tahu kami apa yang telah Anda coba dan mengapa itu tidak memenuhi kebutuhan Anda. Ini menunjukkan bahwa Anda telah meluangkan waktu untuk mencoba membantu diri sendiri, itu menyelamatkan kami dari mengulangi jawaban yang jelas, dan yang paling utama itu membantu Anda mendapatkan jawaban yang lebih spesifik dan relevan. Lihat juga Cara Meminta
nyamuk
2
Pemrograman prosedural tidak sama dengan pemrograman fungsional; itu sebenarnya pada dasarnya hal yang sama dengan pemrograman berorientasi objek, minus objek dan kelas.
Mason Wheeler
1
Imperative OOP sebenarnya adalah pemrograman prosedural, jadi itulah yang Anda lakukan sepanjang waktu ...
Ingo

Jawaban:

68

Wikipedia memiliki penjelasan yang bagus untuk istilah-istilah ini. Apapun, ini ringkasannya:

  • Komputasi model pemrograman imperatif sebagai urutan pernyataan yang mengubah keadaan bisa berubah.
  • Pemrograman prosedural adalah pemrograman imperatif yang memecah kode menjadi subrutin.
  • Pemrograman terstruktur adalah pendekatan yang lebih disiplin untuk pemrograman prosedural yang melarang lompatan sewenang-wenang (misalnya goto) dan perubahan keadaan global.

  • Pemrograman deklaratif adalah kebalikan dari pemrograman imperatif - ini menentukan apa yang harus dihitung daripada bagaimana (misalnya SQL, regex).

  • Model pemrograman fungsional menghitung sebagai ekspresi yang (mungkin) menghasilkan nilai. Fungsi adalah nilai dan dapat diteruskan ke atau dikembalikan dari fungsi lain. Mutasi tidak dianjurkan; semua variabel tidak dapat diubah secara default. Akibatnya, ini lebih bersifat deklaratif daripada imperatif, karena lebih menekankan apa yang sedang dihitung daripada urutan perubahan negara yang diperlukan untuk mencapainya.

  • Pemrograman yang murni fungsional tidak memungkinkan mutasi sama sekali (meskipun bertentangan dengan kepercayaan populer masih memiliki mekanisme untuk mencapai efek samping).
  • Pemrograman fungsional total juga melarang pengecualian dan perulangan tidak terbatas. (Fungsi total dalam matematika adalah fungsi yang mengembalikan nilai untuk semua inputnya.)

Hubungan mereka agak rumit karena OOP adalah istilah yang cukup dimuat. Anda dapat menggunakan objek dalam bahasa fungsional dan bahasa prosedural, tetapi bahasa yang mengiklankan diri mereka sebagai OO bersifat prosedural. Untuk lebih mengacaukan masalah ini:

  • Kebanyakan orang tidak tahu perbedaan antara objek dan tipe data abstrak
  • Bahasa OOP arus utama tidak menyebutkan ADT, memberikan dukungan yang sangat buruk untuk mereka, dan memuji objek sebagai The One True Way.
  • Tidak ada yang mengatakan Pemrograman Berorientasi Tipe Data Abstrak (karena itu akan menjadi hal yang konyol untuk dilakukan; Anda memerlukan ADT dan objek.)

Ini menyebabkan orang berpikir OOP adalah satu-satunya cara untuk mencapai abstraksi, dan bahwa pemrograman fungsional dan OOP entah bagaimana berlawanan atau saling eksklusif. Banyak orang juga berpikir bahwa semua bahasa fungsional murni dan tidak mengizinkan mutasi.

Selain itu, orang-orang pada umumnya melemparkan imperatif / prosedural secara bergantian, kadang-kadang membandingkannya dengan OOP (menyiratkan kode abstraksi-kurang, umumnya C) dan kadang-kadang membandingkannya dengan pemrograman fungsional. Istilah pemrograman terstruktur sebagian besar tidak digunakan sejauh yang saya tahu (mungkin karena pada titik ini kebanyakan orang menerima begitu saja bahwa kebohongan dan global dianggap berbahaya.)

Doval
sumber
3
"melarang melompat" agak umum; itu termasuk jika / sementara / dll. mungkin "melarang melompat sewenang-wenang"?
Izkata
@Izkata Poin bagus, berubah.
Doval
1
Mungkin layak untuk benar-benar menghubungkan ke entri wikipedia.
haylem
Dan itulah mengapa ini disebut Object "Oriented" dan bukan Object Only.
JeffO
1
@OrangeDog Bagaimana bedanya dengan tipe data abstrak, yang juga mendefinisikan sekumpulan data dan fungsi yang dienkapsulasi yang dapat bertindak dengannya? Selain itu, Anda dapat memiliki objek yang tidak berubah, jadi dalam hal ini, keadaan apa ?
Doval
12

Pemrograman Prosedural adalah pendekatan untuk pemrograman yang merupakan salah satu dasar dari blok bangunan untuk banyak desain bahasa lainnya (fungsional bukan menjadi satu).

Sebagian besar bahasa termasuk dalam "Pemrograman Prosedural" dan itu mungkin pendekatan desain yang paling alami bagi kebanyakan orang (jika Anda berpikir dalam hal OO, maka saya akan mengatakan Anda dalam minoritas).

BASIC bersifat prosedural.

Seperti yang dikatakan orang lain, ini adalah mekanisme untuk menyusun program secara berurutan.

  • Pertama saya lakukan x
  • Kedua saya lakukan y
  • Ketiga saya lakukan Z

Ini membutuhkan mekanisme untuk mendefinisikan "prosedur" - blok kode bernama mirip dengan metode OO, yang dapat menerima nol untuk banyak parameter, dan secara opsional mengembalikan nilai (yang kemudian umumnya akan disebut fungsi - mungkin menyebabkan kebingungan Anda dengan bahasa fungsional )

Paradigma itu tidak menentukan apa yang akan Anda lakukan, atau cara hal-hal yang dilewati.

Ini hanya menggambarkan bahwa program akan disusun sebagai serangkaian prosedur (atau fungsi) yang beroperasi secara berurutan. Data kemudian didefinisikan secara independen dari prosedur.

Ini berbeda dari pemrograman berorientasi objek, yang menyusun program di sekitar kumpulan data dan metode (bukan fungsi) yang bekerja pada data itu.

Salah satu cara untuk memikirkannya adalah dalam hal ruang lingkup data.

Dalam pelingkupan bahasa prosedural cukup sederhana. Suatu variabel mungkin berada dalam ruang lingkup prosedur yang diberikan (dideklarasikan secara lokal), hingga tingkat hal-hal pemanggilan hal tertinggi (dideklarasikan secara global), dengan cakupan bersarang di antaranya.

Dalam bahasa berorientasi objek Anda menambahkan konteks pelingkupan baru, yaitu bahwa dari objek yang sedang digunakan, yang ortogonal ke atas.

Cara lain untuk berpikir prosedural, dibandingkan dengan berorientasi objek adalah dengan mempertimbangkan bahasa berorientasi objek di mana semua metode harus dinyatakan sebagai statis. Hasilnya adalah bahasa prosedural di mana kelas dapat digunakan untuk mengelompokkan prosedur bersama.

Rob Baillie
sumber
5

Pemrograman Prosedural jelas bukan pemrograman fungsional.

Pemrograman prosedural adalah ketika Anda memiliki model komputer sebagai mesin di kepala Anda, dan Anda berpikir tentang cara memodifikasi data dalam memori. Jadi pertama-tama Anda menetapkan Ake nilai 3, lalu Anda menambahkan 1 dan menyimpannya di lokasi memori Alagi (menimpa nilai sebelumnya).

Pemrograman fungsional akan mengatakan Aadalah 3, dan Bsekarang A + 1, dan kemudian membiarkan komputer mencari cara menghitung B. Setelah Anda mendefinisikannya, Aia harus tidak berubah (tidak berubah). Fungsional juga memungkinkan Anda untuk melakukan hal-hal seperti melewatkan fungsi sekitar sebagai nilai kelas satu (fungsi dapat mengambil fungsi sebagai argumen).

Pemrograman berorientasi objek sering menggabungkan keduanya, dan merupakan jenis ortogonal untuk keduanya. Anda dapat menggunakan pemrograman fungsional dan mengembalikan objek yang tidak dapat diubah, dan objek itu dapat memiliki metode yang mengembalikan beberapa nilai yang dihitung, dan bahkan melakukannya dengan malas - itulah pemrograman berorientasi objek fungsional. Anda juga dapat memiliki objek yang mewakili "repositori" (versi abstrak dari database), dan Anda bisa "menyimpan" barang-barang di repositori dan "mendapatkan" barang-barang kembali, dan membiarkan objek itu menangani semua detail bagaimana hal itu dilakukan . Itu pada dasarnya pemrograman prosedural berorientasi objek.

Scott Whitlock
sumber
0

OOP tidak lebih dari bentuk pemrograman prosedural yang sedikit disempurnakan, yang lagi-lagi milik keluarga pemrograman imperatif yang lebih besar. Bukti dari klaim itu adalah bahwa banyak programmer C # / Java cenderung "melakukan sesuatu" dan lebih suka metode seperti:

void doThisAndThat(....) { ... do something ... }

Jadi, sebuah program yang terdiri dari sekelompok metode kosong (sebelumnya dikenal sebagai prosedur (sic!)) Dan kode seperti:

doThis();
if (state is that) doSomethingElse();
doThat();

adalah pemrograman prosedural yang sempurna.

Ingo
sumber
doThisAndThat (....) menyiratkan bahwa suatu metode akan melakukan lebih dari satu hal yang secara umum bukan praktik yang baik. Pengembang Java dan C # sebagian besar mematuhi Prinsip Tanggung Jawab Tunggal. Saya pikir analogi Anda cacat. objectmentor.com/resources/articles/srp.pdf
JohnK
@ John Saya tahu ini bukan praktik yang baik. Namun yang umum. Terutama di antara pengembang Java, jika seseorang dapat menilai dengan apa yang dilihat sehari-hari di SO.
Ingo
@JohnK Java dan pengembang C # sebagian besar mematuhi Prinsip Tanggung Jawab Tunggal - layanan Lip?
Ingo
Pengembang Java sebagian besar mematuhi Tanggung Jawab Tunggal? Kalau saja itu benar dalam kehidupan nyata ...
Sridhar Sarnobat