Kode Prosedural vs. kode OOP

19

Saya telah menyelesaikan sebuah proyek di PHP dengan 13.000+ baris dalam Gaya Prosedural [karena saya sangat terbiasa dengan itu, meskipun saya tahu OOP], dan proyek ini berjalan dengan sempurna.

Tetapi haruskah saya mengubahnya menjadi OOP? [ Karena dunia sibuk dengan OOP ]

Kode saya tidak memerlukan fitur OOP [enkapsulasi, pewarisan pada dasarnya ...]!

Jadi apa yang harus aku lakukan?

Dan bantuan apa yang akan saya dapatkan jika saya mengubahnya menjadi OOP?

Sourav
sumber
21
Harap informasikan kepada kami jika Anda harus mengubah proyek ini. Akan menarik untuk mengetahui apakah Anda senang Anda membuat keputusan ini atau menyesalinya.
JeffO
2
Anda perlu enkapsulasi. OO adalah salah satu cara untuk mendapatkannya; mungkin Anda memiliki cara lain yang berfungsi untuk Anda, tetapi dengan satu atau lain cara Anda perlu mengontrol dependensi kode.
Marcin
Bagaimana dengan anekdot untuk Anda: beberapa tahun yang lalu saya mengerjakan aplikasi web berukuran sedang yang sebagian besar ditulis dalam JavaScript (jangan tanya). Gaya pengkodean sebagian besar prosedural. Ketika proyek hampir selesai, saya merasa tidak puas dengan cara kode ditulis dan menulis ulang sebagian besar dalam OOP-JavaScript. Ini menyebabkan keterlambatan dalam menyelesaikan proyek, dan kami akhirnya melakukan pemeliharaan yang relatif sedikit pada proyek nanti. Saya selalu bertanya-tanya apakah semua pengkodean itu sepadan dengan usaha ;-)
Pandincus
ya itu sepadan. menjaga pintu reusability terbuka selalu layak.
Chani
1
Pertanyaannya adalah: apakah Anda mengharapkan pengembangan lebih lanjut? Pemrograman prosedural adalah pendekatan termudah dan tercepat ketika Anda tahu persis apa yang Anda butuhkan dan itu tidak akan berubah. Setiap perubahan pada kode prosedural akan terasa menyakitkan, dalam OOP akan jauh lebih mudah.
Kamil Tomšík

Jawaban:

52

Kode saya tidak memerlukan fitur OOP

Anda telah menjawab pertanyaan Anda sendiri - jika Anda tidak memerlukan OOP dalam kasus ini dan proyek Anda berfungsi maka jangan mengubahnya.

Namun, Anda harus melihat menggunakan OOP untuk proyek Anda berikutnya - tetapi hanya jika itu sesuai.

Pada dasarnya tidak ada yang salah dengan pemrograman prosedural - selama itu digunakan di tempat yang tepat.

ChrisF
sumber
2
+1 dari setuju "Anda harus melihat menggunakan OOP untuk proyek Anda selanjutnya".
Cary Chow
11
+1 ya, jika berfungsi dengan benar jangan memperbaikinya.
setzamora
4
Saya akan mengatakan, jika itu berfungsi dengan benar sekarang, jangan mengubahnya, tetapi Anda tidak pernah tahu seperti apa permintaan fitur selanjutnya.
JeffO
7
"Anda harus melihat menggunakan OOP untuk proyek Anda berikutnya", tetapi jangan menggunakannya kecuali itu masuk akal. Beberapa hal ditulis dengan lebih baik secara prosedural, beberapa lebih cocok untuk OOP. Gunakan apa pun yang sesuai.
TMN
@ TMN - itu tersirat - saya harus membuatnya eksplisit.
ChrisF
16

Tidak dan bukan hanya karena Anda tidak membutuhkan OOP.

Jika program Anda sudah selesai dan bekerja dengan memuaskan maka lebih dari 90% dari waktu itu adalah buang-buang waktu untuk menulis ulang kode yang sudah jadi untuk alasan apa pun.

OOP tidak semua kuat ada banyak tempat di mana OOP tidak boleh digunakan jadi jangan hanya menggunakannya karena OOP adalah tren.

Skeith
sumber
1
Dengan "kode selesai", maksud Anda apakah itu berfungsi?
JeffO
@ ya, ya, tuan! itu sempurna :)
Sourav
Dia mengatakan dia telah menyelesaikan proyek dan itu berjalan dengan sempurna. Bagi saya ini berarti sudah siap untuk dikirim ke pelanggan atau telah dikirim ke pelanggan dengan asumsi ada. Maksud saya, sudah teruji dan siap dikirim, tentu saja jika ada bug besar yang muncul, penulisan ulang dapat dilakukan.
Skeith
Tolong jelaskan "banyak tempat di mana OOP tidak boleh digunakan".
Falcon
3
@ Falcon, tidak peduli seberapa baik dirancang kode OOP Anda, tetapi jika domain masalah itu sendiri buruk dipetakan ke model OO, desain OOP Anda pasti jelek. Ada banyak domain masalah yang tidak boleh diungkapkan dalam istilah OOP .
SK-logic
8

Jendral saya mengambil paradigma (dan mengapa tidak satu pun dari tiga paradigma utama adalah cara yang benar atau cara yang salah untuk memprogram):

Pemrograman prosedural baik ketika Anda memiliki masalah yang sederhana di tingkat tinggi (meskipun mungkin rumit di tingkat rendah) dan ingin menulis kode linier yang sesuai dan sederhana. Ini bisa dibilang lebih mudah untuk ditulis dan dipahami daripada OO dan fungsional jika masalahnya tidak membutuhkan decoupling yang kuat di mana pun. Contoh: Kode numerik, sebagian besar skrip kecil, sebagian kecil subproblem setelah Anda menguraikannya menggunakan OO atau fungsional.

Kode berorientasi objek adalah baik ketika Anda perlu memisahkan masalah karena Anda mungkin memiliki lebih dari satu implementasi beberapa masalah. Contoh: Sebagian besar perangkat lunak bisnis besar. Anda dapat, misalnya, ingin memisahkan logika bisnis dari logika presentasi karena mereka mungkin perlu berubah secara mandiri.

Pemrograman gaya fungsional bagus ketika Anda membutuhkan pemisahan mekanisme yang kuat dari kebijakan. Memiliki fungsi mekanisme yang menerima fungsi kebijakan adalah pola yang bagus. (Saya mempelajarinya dengan melihat modul std.algorithm bahasa pemrograman D.) Mengabstraksi keadaan yang bisa berubah pada batas antara kebijakan dan kode mekanisme umumnya membuat API lebih mudah untuk dipikirkan . Jika keadaan dapat diubah digunakan secara pribadi di dalam keduanya, ini adalah detail implementasi. Kekuatan lain pemrograman fungsional adalah konkurensi, untuk alasan yang jelas.

dsimcha
sumber
Terima kasih atas jawaban yang bagus yang menggambarkan setiap jenis paradigma pemrograman dan memberikan contoh kapan / bagaimana menggunakannya.
Kevin Peno
7

Kode tidak pernah "membutuhkan OOP". Itu programmer, sejauh mereka mampu berpikir dalam mode yang berbeda, yang membayangkan bahwa masalah khusus ini atau itu "membutuhkan" $ PARADIGM atau paling baik diselesaikan dengan cara itu.

Sering terjadi bahwa programmer yang hanya tahu satu paradigma berpikir bahwa paradigma mereka adalah yang terbesar. Satu ukuran cocok untuk semua, dan kita semua harus tidur di tempat tidur Procrustes, jika ini atau itu sedang modis.

Ingo
sumber
5

Anda hanya harus mengubah proyek Anda menjadi OOP jika ada indikasi yang jelas akan kebutuhan untuk OOP. Skenario yang memungkinkan terjadinya hal ini adalah (antara lain):

  • meningkatkan proyek
  • menambahkan lebih banyak pengembang ke tim

dan bahkan dalam skenario ini mungkin masih tidak perlu mengubah proyek Anda menjadi OOP.

Timothy Groote
sumber
Poin yang bagus, tetapi dapatkah Anda memberi tahu saya mengapa akan meningkatkan skala proyek atau menambahkan lebih banyak pengembang dalam tim jika itu merupakan kode prosedural?
Sourav
Peningkatan proyek dapat melibatkan penambahan struktur relasional yang kompleks ke model aplikasi, dalam hal ini, mungkin menjadi menguntungkan untuk beralih ke OOP. Jika aplikasi meningkat sedikit demi sedikit, dan dalam jangka panjang akan menjadi lebih mudah direalisasikan atau dipahami dalam OOP, pengembang baru mungkin 'mengejar' lebih cepat, jika kodenya OOP. Meninggalkan warisan kode non-OO dapat berubah menjadi masalah di kemudian hari ketika proyek menjadi lebih besar. satu lagi dari kasus-kasus di mana 'segala sesuatu menjadi seperti adanya karena mereka mendapatkannya seperti itu'
Timothy Groote
3
inilah yang muncul di benak saya ketika saya membaca pertanyaan itu. dia bilang dia telah menulis 13 K baris kode. Saya harap itu tidak akan sia-sia dengan menggunakan hanya sekali. dan jika itu harus digunakan kembali maka oop akan menjadi suatu keharusan. jika tidak, itu akan menjadi mimpi buruk bagi pengembang baru
Chani
4

Keduanya bisa baik, keduanya bisa buruk. Tetapi perkuatan satu agar terlihat seperti yang lain tidak pernah merupakan ide yang baik.

jwenting
sumber
2

Jika Anda berpikir kembali mengapa OO ditemukan, Anda akan melihat bahwa Anda tidak membutuhkan OOP sama sekali, tetapi kadang-kadang itu membuat hidup Anda jauh lebih mudah.

Kembali pada zaman C coding, sebuah program yang sangat besar bisa menjadi sangat berantakan dan sulit untuk terus bekerja. Jadi mereka menemukan cara untuk memecahnya menjadi potongan modular. OOP mengambil pendekatan ini dan membuatnya lebih modular, menempatkan data dengan potongan-potongan logika program sehingga mereka lebih terpisah dari sisa kode.

Hal ini memungkinkan Anda untuk menulis program yang lebih besar dan lebih besar, aman karena Anda telah mengubah tugas besar gajah Anda menjadi seratus tugas berukuran tikus. Bonus tambahan adalah Anda dapat mengambil beberapa 'tikus' ini dan menggunakannya kembali di program lain!

Tentu saja, dunia nyata tidak seperti itu, dan penggunaan kembali objek tidak pernah benar-benar terjebak dalam cara yang dimaksudkan, tetapi itu tidak berarti itu adalah paradigma yang tidak berguna.

Apa yang tidak berguna adalah ketergantungan yang berlebihan pada kedua gaya pengkodean. Siapa pun yang melakukan OO dengan seribu kelas kecil dan tidak signifikan tidak benar-benar melakukannya dengan benar - mereka membuat mimpi buruk pemeliharaan untuk diri mereka sendiri (atau orang lain). Siapa pun yang menulis aplikasi prosedural yang hanya 3 fungsi juga membuat hidup menjadi sulit. Cara terbaik adalah middlle ground, objek besar-ish (kadang-kadang disebut komponen yang mana kita melihat sekali waktu) yang dapat memberikan cukup banyak kode yang berdiri sendiri dan data yang jauh lebih mungkin untuk digunakan kembali dalam isolasi dari sisa aplikasi Anda.

Saran saya untuk waktu berikutnya: cobalah menulis kode prosedural Anda yang biasa, tetapi buat satu objek dari struktur data utama Anda. Lihat bagaimana Anda menemukan bahwa bekerja dengannya lebih mudah daripada mengirimkan data dari satu fungsi ke fungsi lainnya.

gbjbaanb
sumber
0

Kode saya tidak memerlukan fitur OOP [enkapsulasi, pewarisan pada dasarnya ...]!

Bagaimana Anda tahu bahwa?

Apakah Anda perlu mempertahankan proyek ini? Apakah ada fitur baru yang direncanakan? Akan ada orang lain yang akan berkembang bersama Anda? Apakah kamu mengulangi dirimu sendiri? Apakah kode sulit dipahami?

Jika jawabannya "ya", daripada mungkin Anda harus mulai berpikir tentang membuat kerangka OOP dan pergi dengan cara ini.

vihus
sumber