Apa perbedaan antara paradigma pemrograman ini, dan apakah mereka lebih cocok untuk masalah tertentu atau apakah ada use-case yang lebih disukai dari yang lain?
Contoh arsitektur dihargai!
Apa perbedaan antara paradigma pemrograman ini, dan apakah mereka lebih cocok untuk masalah tertentu atau apakah ada use-case yang lebih disukai dari yang lain?
Contoh arsitektur dihargai!
Jawaban:
Semuanya baik dalam caranya sendiri - Mereka hanya pendekatan yang berbeda untuk masalah yang sama.
Dalam gaya prosedur murni, data cenderung sangat dipisahkan dari fungsi yang beroperasi di atasnya.
Dalam gaya berorientasi objek, data cenderung membawa kumpulan fungsi.
Dalam gaya fungsional, data dan fungsi cenderung memiliki lebih banyak kesamaan satu sama lain (seperti dalam Lisp dan Skema) sambil menawarkan lebih banyak fleksibilitas dalam hal bagaimana fungsi sebenarnya digunakan. Algoritma juga cenderung didefinisikan dalam hal rekursi dan komposisi daripada loop dan iterasi.
Tentu saja, bahasa itu sendiri hanya mempengaruhi gaya mana yang lebih disukai. Bahkan dalam bahasa fungsional murni seperti Haskell, Anda dapat menulis dalam gaya prosedural (meskipun sangat tidak dianjurkan), dan bahkan dalam bahasa prosedural seperti C, Anda dapat memprogram dalam gaya berorientasi objek (seperti di GTK + dan API EFL).
Agar jelas, "keunggulan" dari masing-masing paradigma hanyalah dalam pemodelan algoritma dan struktur data Anda. Misalnya, jika algoritme Anda melibatkan daftar dan hierarki, algoritme fungsional mungkin yang paling masuk akal. Atau, jika, misalnya, data Anda sangat terstruktur, mungkin lebih masuk akal untuk menjadikannya sebagai objek jika itu adalah paradigma asli bahasa Anda - atau, bisa dengan mudah ditulis sebagai abstraksi fungsional dari monad, yang adalah paradigma asli bahasa seperti Haskell atau ML.
Pilihan yang Anda gunakan hanyalah apa yang lebih masuk akal untuk proyek Anda dan abstraksi yang didukung bahasa Anda.
Saya pikir perpustakaan, alat, contoh, dan komunitas yang tersedia benar-benar mengalahkan paradigma akhir-akhir ini. Misalnya, ML (atau apa pun) mungkin merupakan bahasa pemrograman serbaguna untuk semua orang, tetapi jika Anda tidak bisa mendapatkan perpustakaan yang bagus untuk apa yang Anda lakukan, Anda akan gagal.
Misalnya, jika Anda membuat gim video, ada contoh kode dan SDK yang lebih baik di C ++, jadi Anda mungkin lebih baik dengan itu. Untuk aplikasi web kecil, ada beberapa kerangka kerja Python, PHP, dan Ruby yang hebat yang akan membuat Anda menjalankan dan menjalankannya dengan sangat cepat. Java adalah pilihan tepat untuk proyek yang lebih besar karena pengecekan waktu kompilasi dan perpustakaan dan platform perusahaan.
Dulu kasus bahwa perpustakaan standar untuk bahasa yang berbeda cukup kecil dan mudah direplikasi - C, C ++, Assembler, ML, LISP, dll. Datang dengan dasar-dasar, tetapi cenderung untuk keluar ketika datang ke standardisasi pada hal-hal seperti komunikasi jaringan, enkripsi, grafik, format file data (termasuk XML), bahkan struktur data dasar seperti pohon seimbang dan hashtable ditinggalkan!
Bahasa modern seperti Python, PHP, Ruby, dan Java kini hadir dengan perpustakaan standar yang jauh lebih baik dan memiliki banyak perpustakaan pihak ketiga yang baik yang dapat Anda gunakan dengan mudah, terima kasih banyak atas adopsi ruang nama mereka agar perpustakaan tidak saling bertabrakan, dan pengumpulan sampah untuk membakukan skema manajemen memori perpustakaan.
Paradigma ini tidak harus saling eksklusif. Jika Anda melihat python, ia mendukung fungsi dan kelas, tetapi pada saat yang sama, semuanya adalah objek, termasuk fungsi. Anda dapat mencampur dan mencocokkan gaya fungsional / oop / prosedural dalam satu kode.
Yang saya maksud adalah, dalam bahasa fungsional (setidaknya dalam Haskell, satu-satunya yang saya pelajari) tidak ada pernyataan! fungsi hanya diperbolehkan satu ekspresi di dalamnya !! TAPI, fungsi adalah warga negara kelas satu, Anda dapat membagikannya sebagai parameter, bersama dengan banyak kemampuan lainnya. Mereka dapat melakukan hal-hal yang kuat dengan beberapa baris kode.
Sementara dalam bahasa prosedural seperti C, satu-satunya cara Anda bisa melewatkan fungsi adalah dengan menggunakan pointer fungsi, dan itu saja tidak memungkinkan banyak tugas yang kuat.
Dalam python, suatu fungsi adalah warga negara kelas satu, tetapi dapat berisi jumlah pernyataan yang berubah-ubah. Jadi Anda dapat memiliki fungsi yang berisi kode prosedural, tetapi Anda dapat menyebarkannya seperti bahasa fungsional.
Hal yang sama berlaku untuk OOP. Bahasa seperti Java tidak memungkinkan Anda untuk menulis prosedur / fungsi di luar kelas. Satu-satunya cara untuk melewatkan fungsi adalah dengan membungkusnya dalam objek yang mengimplementasikan fungsi itu, dan kemudian meneruskannya.
Dengan Python, Anda tidak memiliki batasan ini.
Untuk GUI saya akan mengatakan bahwa Paradigma Berorientasi Objek sangat cocok. Jendela adalah Objek, Kotak Teks adalah Objek, dan Tombol Oke juga. Di sisi lain, hal-hal seperti String Processing dapat dilakukan dengan overhead yang lebih sedikit dan karenanya lebih mudah dengan paradigma prosedural sederhana.
Saya rasa ini bukan masalah bahasa. Anda dapat menulis fungsional, prosedural atau berorientasi objek di hampir semua bahasa populer, meskipun mungkin ada beberapa upaya tambahan dalam beberapa bahasa.
Untuk menjawab pertanyaan Anda, kami membutuhkan dua elemen:
Daftar gaya / pola arsitektur perangkat lunak ditampilkan pada artikel arsitektur perangkat lunak di Wikipeida. Dan Anda dapat meneliti mereka dengan mudah di web.
Singkatnya dan umum, Prosedural baik untuk model yang mengikuti prosedur, OOP baik untuk desain, dan Fungsional baik untuk pemrograman tingkat tinggi.
Saya pikir Anda harus mencoba membaca sejarah pada setiap paradigma dan melihat mengapa orang menciptakannya dan Anda dapat memahaminya dengan mudah.
Setelah memahami keduanya, Anda dapat menghubungkan item gaya / pola arsitektur ke paradigma pemrograman.
Saya pikir mereka sering kali bukan "lawan", tetapi Anda bisa menggabungkannya. Saya juga berpikir bahwa seringkali, kata-kata yang Anda sebutkan hanyalah kata kunci. Ada beberapa orang yang benar-benar tahu apa arti "berorientasi objek", bahkan jika mereka adalah penginjil yang paling sengit.
Salah satu teman saya sedang menulis aplikasi grafis menggunakan NVIDIA CUDA . Aplikasi sangat cocok dengan paradigma OOP dan masalahnya dapat diuraikan menjadi modul dengan rapi. Namun, untuk menggunakan CUDA Anda harus menggunakan C, yang tidak mendukung warisan . Karena itu, Anda harus pintar.
a) Anda menyusun sistem pintar yang akan meniru warisan sampai batas tertentu. Itu bisa dilakukan!
i) Anda dapat menggunakan sistem kait , yang mengharapkan setiap anak C dari orangtua P memiliki fungsi override tertentu untuk F. Anda dapat membuat anak-anak mendaftarkan override mereka, yang akan disimpan dan dipanggil ketika diperlukan.
ii) Anda dapat menggunakan fitur penyelarasan memori struct untuk memasukkan anak-anak ke orang tua.
Ini bisa rapi tetapi tidak mudah untuk datang dengan solusi yang dapat diandalkan di masa depan. Anda akan menghabiskan banyak waktu merancang sistem dan tidak ada jaminan bahwa Anda tidak akan mengalami masalah setengah jalan melalui proyek. Menerapkan banyak warisan bahkan lebih sulit, jika hampir tidak mungkin.
b) Anda dapat menggunakan kebijakan penamaan yang konsisten dan menggunakan pendekatan divide and conquer untuk membuat program. Itu tidak akan memiliki warisan tetapi karena fungsi Anda kecil, mudah dipahami dan diformat secara konsisten, Anda tidak memerlukannya. Jumlah kode yang Anda butuhkan untuk menulis naik, sangat sulit untuk tetap fokus dan tidak menyerah pada solusi mudah (peretasan). Namun, cara pengkodean ninja ini adalah cara pengkodean C. Tetap seimbang antara kebebasan tingkat rendah dan penulisan kode yang baik. Cara yang baik untuk mencapai ini adalah dengan menulis prototipe menggunakan bahasa fungsional. Misalnya, Haskell sangat bagus untuk membuat prototipe algoritma.
Saya cenderung ke arah pendekatan b. Saya menulis solusi yang mungkin menggunakan pendekatan a, dan saya akan jujur, rasanya sangat tidak wajar menggunakan kode itu.