Untuk masalah apa pemrograman berorientasi objek bukan pilihan yang baik? [Tutup]

19

Agak terinspirasi oleh pertanyaan ini: Untuk masalah umum apa pemrograman fungsional tidak cocok? - namun demikian sebuah pertanyaan yang selalu saya inginkan, tetapi terlalu takut untuk bertanya.

Saya sudah berada di ... yah, sebut saja itu pengembangan perangkat lunak praktis hampir sepanjang hidup saya, dan dalam semua waktu itu, meskipun OO selalu ada di sana (well, sebagian besar waktu itu) saya tidak pernah memiliki kebutuhan untuk menggunakan "jalannya", atau untuk mempelajari paradigma itu. Kami selalu menggunakan struktur, rutinitas / fungsi / modul program yang agak sederhana dan meskipun bertentangan dengan praktik terbaik saat ini mengelola program-program tersebut (program hingga sekitar 300k LOC, tidak ada yang terlalu besar) tidak pernah terbukti sulit, apalagi mustahil.

Jadi saya ingin bertanya kepada Anda, apa yang akan menjadi masalah yang paradigma berorientasi objek tidak akan menjadi pilihan yang baik? Dibandingkan dengan pemrograman prosedural?

Benteng
sumber

Jawaban:

8

Pemrograman berorientasi objek adalah pemrograman prosedural. Hal yang membuat OO berorientasi objek adalah, seperti yang dikatakan Robert Harvey dalam komentar, bahwa OO mengabstraksi data dengan cara tertentu (yaitu: menggabungkan fungsi-fungsi yang beroperasi pada struktur dengan struktur itu).

William Cook menjelaskan perbedaan antara objek dan tipe data abstrak dengan baik.

Jadi dengan risiko terdengar mudah, saya akan mengatakan bahwa objek tidak cocok untuk ketika Anda perlu dengan mudah memperpanjang (jumlah) operasi yang dilakukan pada data Anda, dan Anda tidak perlu memiliki berbagai implementasi dari Anda data. Karena itu, ada beberapa hal yang dapat Anda lakukan untuk mendekatkan keduanya.

Frank Shearar
sumber
5

Nilai utama dari OO adalah ia menyediakan decoupling di antara komponen-komponen sistem Anda, membuatnya lebih mudah untuk menulis kode KERING dan beradaptasi dengan jenis perubahan spesifik yang Anda rencanakan dalam desain Anda. Biayanya adalah menambahkan lapisan tipuan, yang dapat membuat kode lebih sulit untuk dipikirkan, kurang efisien dan sulit untuk dimodifikasi dengan cara yang tidak diantisipasi (cara-cara yang tidak dibantu oleh decoupling yang disediakan desain Anda). Oleh karena itu buang-buang waktu untuk masalah apa pun di mana Anda tidak perlu decoupling yang disediakannya. Secara khusus, itu adalah buang-buang waktu jika Anda dapat dengan mudah menulis kode KERING tanpa kode tersebut dan tidak mengantisipasi perubahan persyaratan khusus yang akan mendapat manfaat dari decoupling kuat yang disediakan OO.

dsimcha
sumber
3
Decoupling adalah efek samping yang bagus dari pemrograman OO dilakukan dengan baik, tetapi saya akan mengatakan bahwa manfaat utama dari pemrograman OO adalah enkapsulasi fungsionalitas organisasi.
Robert Harvey
1
@ Robert Harvey: Saya memiliki sudut pandang berbeda dari realitas yang sama: bagi saya enkapsulasi fungsionalitas organisasi adalah cara untuk memperoleh decoupling yang pada gilirannya memungkinkan untuk digunakan kembali.
mouviciel
@Robert Harvey: Coupling dan kohesi adalah dua cara memandang hal yang pada dasarnya sama, yang merupakan semacam lokalitas di mana Anda dapat memahami sesuatu tanpa perlu terlalu banyak memahami hal lain.
David Thornley
Saya pikir bagian dari ketidaksepakatan adalah bahwa, IMHO menggunakan OO berarti Anda menggunakan polimorfisme dan pewarisan, setidaknya antarmuka, secara luas. Dengan definisi saya tentang OO, misalnya, C # atau D struct, atau hanya menggunakan kelas final / disegel dan tidak ada antarmuka akan dianggap hanya gula sintaksis ditambah beberapa atribut kontrol akses, bukan OO nyata.
dsimcha
3

concurrency: mekanisme penguncian tampaknya agak bermasalah; hanya beberapa pengembang yang sangat baik yang bekerja pada bagian threading proyek

extending: tidak tahu seberapa bisa diperluas bahasa OO saat ini. hanya tahu bahwa Java itu buruk. karenanya DSL (bahasa khusus domain) harus diimplementasikan sebagai Kerangka Kerja. Clojure di sisi lain (yang fungsional), memiliki makro.

Belun
sumber
+1 untuk argumen penguncian - bukti tampaknya bahwa penguncian logika pada objek yang bisa berubah menjadi kompleks tak terkendali melampaui titik tertentu dalam bahasa OO
mikera
+1 untuk menyebutkan konkurensi. Konsep yang mirip dengan objek tetapi mendukung konkurensi adalah konsep aktor. Aktor adalah entitas konkuren yang berkomunikasi dengan bertukar pesan asinkron.
Giorgio
Ditto pada konkurensi; Saya telah membuat pernyataan bahwa OO, dalam mendorong Anda untuk mengidentifikasi / mempertahankan unit negara yang terpisah , sebenarnya mendorong masalah konkurensi.
user1172763
0

Sebagian besar programmer, mengerti atau tidak OO, menggunakan konsep seperti abstraksi, menyembunyikan informasi dan antarmuka dalam kode mereka. Bahasa OO membuatnya lebih mudah karena konsep-konsep ini sudah ada di dalamnya. Anda tidak harus menciptakannya sendiri.

Algoritme inti seperti qsort()menggunakan abstraksi untuk perbandingan objek arbitrer. fread()menggunakan antarmuka untuk memisahkan detail aliran dll.

Dari sudut pandang itu saya merasa sulit untuk menemukan masalah tertentu yang lebih baik diselesaikan dengan pendekatan non-OO.

Martin Wickman
sumber
0

Saya pikir ketika membangun sistem yang menggabungkan sistem lain melalui web apis (istirahat, xmlprc, ikal polos / wget) Anda dapat menulis pembungkus OO tetapi jelas hanya kenyamanan. Jika layanan web yang digunakan sederhana, dan itu hanya masalah satu atau dua baris, maka OO terlalu banyak. Jika di sisi lain Anda akhirnya harus membungkus api web yang kompleks (seperti Amazon AWS misalnya) maka itu bagus untuk memiliki perpustakaan pembungkus (seperti boto di python untuk AWS).

Pikiran?

Christopher Mahan
sumber
0

Bahasa berorientasi objek PURE tidak cocok untuk banyak kasus. Karena ada beberapa kriteria yang harus dipenuhi untuk menjadi bahasa berorientasi objek murni. Lihat-
/programming/250062/what-is-meant-by-the-term-true-object-orientation/250098#250098

Tetapi bahasa pemrograman yang paling banyak digunakan adalah multi-paradigma. Mereka menggabungkan banyak fitur non-OO untuk menghadapi berbagai jenis masalah pemrograman dan pengembangan. C ++, C #, Java atau Ruby semuanya memiliki fungsi non-OO. Jadi, mereka bisa menghadapi masalah-masalah yang murni-OO tidak pandai.

Gulshan
sumber
0

Pemrograman berorientasi objek dapat digunakan untuk memodelkan domain Anda. Kelas-kelas dapat digunakan untuk mewakili keadaan dan perilaku entitas, agregat, kolaborasi, layanan dalam model domain Anda. Selain itu, metode invokasi dan protokol antar objek dapat memodelkan hubungan dinamis antar entitas.

Saya telah menemukan itu menjadi cara yang berguna untuk menghasilkan model KERING yang bersih dapat mewakili aturan dan perilaku aplikasi Anda dengan cara yang dipisahkan dari masalah teknis (seperti penggunaan database, atau antrian pesan, atau sebenarnya itu adalah aplikasi web). Buku bagus tentang topik ini adalah Desain Berbasis Domain

Satu hal penting yang perlu diperhatikan di sini, adalah bahwa "entitas" yang saya sebutkan di atas tidak harus dipetakan ke objek dunia nyata! Mereka dapat mewakili bagian abstrak dari domain aplikasi Anda.

Jadi, jika itu yang pemrograman Object Orientated pandai; apa yang tidak bisa dilakukan dengan baik? Nah, apa pun di mana model domain tidak dapat diekspresikan dengan baik sebagai objek. Sebagai contoh, beberapa program matematika, (statistik, logika, dll) atau teknis (misalnya kompiler) dapat diekspresikan lebih baik dalam gaya yang berbeda. Saya telah menemukan bahwa untuk aplikasi alur kerja bisnis kombinasi dari OO dan teknik DSL kustom telah sangat efektif dalam memungkinkan kita untuk memodelkan jenis hubungan dan peristiwa yang terjadi dalam proses bisnis. Untuk verifikasi program dan pemeriksaan bukti otomatis, pendekatan fungsional sering digunakan, karena fungsinya yang murni memungkinkan penalaran matematis yang lebih langsung.

flamingpenguin
sumber