Apa gunanya OOP?

126

Sejauh yang saya tahu, terlepas dari jutaan atau miliaran yang dihabiskan untuk pendidikan OOP, bahasa, dan alat, OOP belum meningkatkan produktivitas pengembang atau keandalan perangkat lunak, juga tidak mengurangi biaya pengembangan. Hanya sedikit orang yang menggunakan OOP dalam arti yang ketat (hanya sedikit orang yang mematuhi atau memahami prinsip-prinsip seperti LSP); tampaknya ada sedikit keseragaman atau konsistensi dengan pendekatan yang dilakukan orang untuk memodelkan domain masalah. Terlalu sering, kelas digunakan hanya untuk gula sintaksisnya; itu menempatkan fungsi untuk tipe catatan ke dalam namespace kecil mereka sendiri.

Saya telah menulis sejumlah besar kode untuk berbagai aplikasi. Meskipun ada tempat-tempat di mana subtyping yang dapat diganti benar memainkan peran yang berharga dalam aplikasi, ini sudah sangat luar biasa. Secara umum, meskipun banyak layanan bibir diberikan kepada pembicaraan tentang "re-use" kenyataannya adalah bahwa kecuali sepotong kode tidak persis apa yang Anda ingin lakukan, ada sangat sedikit hemat biaya "digunakan kembali". Sangat sulit untuk mendesain kelas agar dapat diperluas dengan cara yang benar , sehingga biaya perpanjangan biasanya sangat besar sehingga "menggunakan kembali" sama sekali tidak bermanfaat.

Dalam banyak hal, ini tidak mengejutkan saya. Dunia nyata bukan "OO", dan gagasan yang tersirat dalam OO - bahwa kita dapat membuat model dengan beberapa taksonomi kelas - bagi saya kelihatannya sangat cacat mendasar (saya bisa duduk di atas meja, tunggul pohon, kap mobil) , pangkuan seseorang - tetapi bukan salah satu dari itu adalah-kursi). Bahkan jika kita pindah ke domain yang lebih abstrak, pemodelan OO seringkali sulit, berlawanan dengan intuisi, dan pada akhirnya tidak membantu (pertimbangkan contoh klasik lingkaran / elips atau kuadrat / bujur sangkar).

Jadi apa yang saya lewatkan di sini? Di mana nilai OOP, dan mengapa semua waktu dan uang gagal membuat perangkat lunak lebih baik?

DrPizza
sumber
11
Analogi Anda adalah abstraksi yang terlalu tinggi untuk "kasus penggunaan" yang Anda maksudkan; meja, tunggul pohon, kap mesin, pangkuan seseorang adalah komposisi molekul, atom, proton, neutron, elektron, yang membentuk area permukaan yang cukup besar agar bokong Anda dapat beristirahat karena gaya gravitasi.
icelava
38
Tidak peduli berapa kali utas yang sama ini dimulai, selalu menarik banyak minat (terlepas dari kenyataan bahwa duplikat biasanya tidak ditoleransi di sini). Dan tentu saja, jawaban yang dipilih selalu yang sesuai dengan pendapat awal si penanya.
TM.
4
Masalah dengan OOP adalah kegagalan untuk menempatkannya dalam konteks. Ini sangat baik untuk beberapa tujuan, tidak semua tujuan. Ini adalah alat yang hebat. Itu adalah Injil yang buruk.
Mike Dunlavey
16
Maaf, tetapi saya tidak bisa menghilangkan perasaan bahwa Anda belum pernah memprogram menggunakan bahasa apa pun. Inilah alasannya: OOP adalah basis operasi untuk pustaka komponen dasar di semua lingkungan modern (Java, .NET, Python, Ruby - hanya untuk beberapa nama aliran utama). Semua pustaka dasar tersebut digunakan kembali setiap hari jadi jika itu tidak masuk hitungan, saya tidak tahu apa. Jadi jangan salah paham di sini, tetapi kode digunakan kembali jika fakta - dan yang sangat umum! Saya tidak ingin ini terdengar menyinggung dengan cara apa pun - hanya membuat titik di sini.
Matthias Hryniszak
2
@ George Jempty: Joel Spolsky dalam "Bagaimana Microsoft kehilangan perang API" ( joelonsoftware.com/articles/APIWar.html ), tajuk utama dari bagian ini adalah "Transmisi Otomatis Menangkan Hari".
GodsBoss

Jawaban:

24

Tidak ada bukti empiris yang menunjukkan bahwa orientasi objek adalah cara yang lebih alami bagi orang untuk berpikir tentang dunia. Ada beberapa pekerjaan di bidang psikologi pemrograman yang menunjukkan bahwa OO entah bagaimana lebih cocok daripada pendekatan lain.

Representasi berorientasi objek tampaknya tidak secara universal lebih bermanfaat atau kurang berguna.

Tidak cukup hanya mengadopsi metode OO dan mengharuskan pengembang untuk menggunakan metode seperti itu, karena itu mungkin berdampak negatif pada produktivitas pengembang, serta kualitas sistem yang dikembangkan.

Yang berasal dari "On Usability of OO Representations" dari Communications of the ACM Oktober 2000. Artikel-artikel tersebut terutama membandingkan OO dengan pendekatan yang berorientasi pada proses. Ada banyak penelitian tentang bagaimana orang-orang yang bekerja dengan metode OO "berpikir" (Int. J. dari Human-Computer Studies 2001, edisi 54, atau Human-Computer Interaction 1995, vol. 10 memiliki tema keseluruhan pada studi OO), dan dari apa yang saya baca, tidak ada yang menunjukkan semacam kealamian pada pendekatan OO yang membuatnya lebih cocok daripada pendekatan prosedural yang lebih tradisional.

Svend
sumber
18
Ini bekerja dengan baik. Apa yang tidak bisa dilakukan adalah memaksa pembuat kode yang buruk untuk menulis kode yang baik. Ada rona dan seruan berkala karena itu.
kekacauan
6
@melaos: ringkasannya ada di tengah. OOP adalah satu alat dalam toolkit, bukan satu-satunya, dan tidak ada pengganti untuk pelatihan, pengalaman, dan penilaian.
Mike Dunlavey
44
Saya merasa agak lucu ketika seseorang memposting "Pertanyaan" untuk membantah suatu poin kemudian menerima jawaban pertama yang mendukung pendapatnya, meskipun ada pertanyaan dengan peringkat lebih tinggi yang mendukung hal sebaliknya. Sifat manusia itu keren.
Bill K
3
@melaos, ringkasan (setidaknya dari artikel-artikel itu) adalah bahwa tidak ada yang menyarankan OO sebagai cara berpikir alami bagi orang-orang, dan dengan demikian, tidak secara inheren lebih unggul daripada cara lain yang dapat digunakan seseorang untuk membangun program.
Svend
6
@ Bill K: Itu adalah salah satu dari beberapa jawaban yang memberikan kutipan daripada melambaikan tangan dan sekadar desakan bahwa OO "harus" lebih baik. Jika literatur yang direferensikan mendukung gagasan bahwa OO bukanlah perbaikan atau manfaat tertentu, dan karenanya mendukung posisi awal saya, saya tidak yakin mengapa saya harus mengabaikannya. Bisakah Anda memberikan referensi serupa yang berlawanan dengan OP saya?
DrPizza
119

Dunia nyata bukanlah "OO", dan gagasan yang tersirat dalam OO - bahwa kita dapat membuat model dengan beberapa taksonomi kelas - bagi saya sangat cacat secara mendasar.

Meskipun ini benar dan telah diamati oleh orang lain (ambil Stepanov, penemu STL), sisanya adalah omong kosong. OOP mungkin cacat dan tentu saja bukan peluru perak, tetapi itu membuat aplikasi skala besar jauh lebih sederhana karena itu cara yang bagus untuk mengurangi ketergantungan. Tentu saja, ini hanya berlaku untuk desain OOP "baik". Desain ceroboh tidak akan memberikan keuntungan apa pun. Tapi desain decoupled yang baik dapat dimodelkan dengan sangat baik menggunakan OOP dan tidak baik menggunakan teknik lain.

Ada banyak model yang lebih baik dan lebih universal (model tipe Haskell muncul di pikiran) tetapi ini juga sering lebih rumit dan / atau sulit untuk diterapkan secara efisien. OOP merupakan trade-off yang baik antara ekstrem.

Konrad Rudolph
sumber
10
Saya merasa menarik bahwa ini memiliki lebih banyak suara daripada pertanyaan, dan jawaban yang disetujui, digabungkan.
Brad Gilbert
15
Saya menemukan sistem tipe Haskell jauh lebih intuitif daripada OO.
axblount
4
@ Konrad: "tapi itu membuat aplikasi skala besar jauh lebih sederhana" - hmmm, saya tidak yakin itu benar. Itu membuat mereka lebih dapat dipertahankan dalam arti bahwa chnaging satu hal tidak boleh merusak yang lain, tetapi lebih sederhana? Itu yang harus ditelan ...
Mitch Wheat
2
@BradGilbert: tentu saja penanya memilih jawaban yang selaras dengan pendapat dalam pertanyaan awalnya. Yang menimbulkan pertanyaan, mengapa repot mengajukan pertanyaan jika Anda sudah memutuskan jawaban Anda?
TM.
2
@Itch: Saya akan mengklaim bahwa Anda tidak dapat (pada hari ini) menulis aplikasi skala besar tanpa semacam orientasi objek. Skala besar di sini adalah> 1 juta LOC.
Konrad Rudolph
45

OOP bukan tentang membuat kelas yang dapat digunakan kembali, ini tentang membuat kelas yang dapat digunakan.

Brian Leahy
sumber
7
Yang bagus! Dan memang benar.
Toon Krijthe
1
Cukup adil. Tapi kemudian itu tidak menyelesaikan masalah "reinventing the wheel", yang sejujurnya serius dalam pengembangan perangkat lunak - alih-alih memiliki satu perpustakaan yang memiliki N pasang mata mencari kekurangan, kami memiliki N perpustakaan dengan sepasang mata melakukan begitu. Ada begitu banyak kelas yang dapat digunakan yang bisa Anda bangun sebelum Anda perlu mulai menggunakannya kembali. Dan OOP menurut pendapat saya yang berpendidikan, pada dasarnya cacat pada daerah itu - kode digunakan kembali. Ini menyembunyikan data dan "kawin" dengan metode, secara efektif membuat data tersebut tidak dapat diakses atau sulit dioperasikan.
amn
42

Terlalu sering, kelas digunakan hanya untuk gula sintaksisnya; itu menempatkan fungsi untuk tipe catatan ke dalam namespace kecil mereka sendiri.

Ya, saya menemukan ini terlalu lazim juga. Ini bukan Pemrograman Berorientasi Objek. Ini Pemrograman Berbasis Objek dan pemrograman sentris data. Dalam 10 tahun saya bekerja dengan Bahasa OO, saya melihat orang-orang kebanyakan melakukan Pemrograman Berbasis Objek. OBP memecah IMHO sangat cepat karena Anda pada dasarnya mendapatkan yang terburuk dari kedua kata: 1) pemrograman prosedural tanpa mengikuti metodologi pemrograman terstruktur terbukti dan 2) OOP tanpa mengikuti metodologi OOP terbukti.

OOP yang dilakukan dengan benar adalah hal yang indah. Itu membuat masalah yang sangat sulit mudah untuk dipecahkan, dan bagi yang belum tahu (tidak berusaha terdengar sombong di sana), itu hampir bisa tampak seperti sulap. Yang sedang berkata, OOP hanyalah satu alat di toolbox metodologi pemrograman. Bukan akhir dari semua metodologi. Itu hanya terjadi sesuai dengan aplikasi bisnis besar dengan baik.

Sebagian besar pengembang yang bekerja dalam bahasa OOP menggunakan contoh-contoh OOP yang dilakukan dengan benar dalam kerangka dan jenis yang mereka gunakan sehari-hari, tetapi mereka tidak menyadarinya. Berikut adalah beberapa contoh yang sangat sederhana: ADO.NET, Hibernate / NHibernate, Logging Frameworks, berbagai jenis koleksi bahasa, tumpukan ASP.NET, JSP stack dll ... Ini semua adalah hal-hal yang sangat bergantung pada OOP dalam basis kode mereka.

Daniel Auger
sumber
32

Penggunaan kembali tidak boleh menjadi tujuan OOP - atau paradigma lainnya dalam hal ini.

Penggunaan kembali adalah efek samping dari desain yang baik dan tingkat abstraksi yang tepat. Kode mencapai penggunaan kembali dengan melakukan sesuatu yang bermanfaat, tetapi tidak melakukan sebanyak yang membuatnya tidak fleksibel. Tidak masalah apakah kodenya OO atau tidak - kami menggunakan kembali yang berfungsi dan tidak sepele untuk melakukannya sendiri. Itu pragmatisme.

Pemikiran OO sebagai cara baru untuk dapat digunakan kembali melalui warisan pada dasarnya cacat. Seperti yang Anda perhatikan, pelanggaran LSP berlimpah. Alih-alih, OO dianggap sebagai metode untuk mengelola kompleksitas domain masalah. Tujuannya adalah pemeliharaan sistem dari waktu ke waktu. Alat utama untuk mencapai ini adalah pemisahan antarmuka publik dari implementasi pribadi. Ini memungkinkan kita untuk memiliki aturan seperti "Ini hanya boleh dimodifikasi menggunakan ..." yang diberlakukan oleh kompiler, daripada review kode.

Menggunakan ini, saya yakin Anda akan setuju, memungkinkan kami untuk membuat dan memelihara sistem yang sangat kompleks. Ada banyak nilai dalam hal itu, dan tidak mudah dilakukan dalam paradigma lain.

theschmitzer
sumber
3
benar tentang penggunaan kembali dan OO menjadi masalah yang terpisah.
Dan Rosenstark
28

Beragama agama tetapi saya akan mengatakan bahwa Anda melukis gambar yang terlalu suram tentang keadaan OOP modern. Saya berpendapat bahwa itu sebenarnya telah mengurangi biaya, membuat proyek-proyek perangkat lunak besar dapat dikelola, dan sebagainya. Itu tidak berarti itu memecahkan masalah mendasar dari kekacauan perangkat lunak, dan itu tidak berarti pengembang rata-rata adalah seorang ahli OOP. Tetapi modularisasi fungsi menjadi komponen-objek tentu saja telah mengurangi jumlah kode spageti di dunia.

Saya bisa memikirkan lusinan perpustakaan dari atas kepala saya yang dapat digunakan kembali dengan indah dan yang telah menghemat waktu dan uang yang tidak pernah dapat dihitung.

Tetapi sejauh OOP telah membuang-buang waktu, saya akan mengatakan itu karena kurangnya pelatihan programmer, diperparah oleh kurva pembelajaran curam belajar pemetaan OOP bahasa tertentu. Beberapa orang "mendapatkan" OOP dan yang lain tidak akan pernah.

pengguna2189331
sumber
2
Saya baru saja memberi Anda upvote yang melemparkan Anda di atas 2000 poin - semoga akan tetap. : P
Jason Bunting
5
Jarang melihat OOP diajarkan secara efektif.
Jon W
Jawaban Anda terdengar sangat mirip dengan yang diberikan oleh pelatih Agile / Scrum ketika ditanya apakah itu masuk akal - "ini sangat berguna jika Anda melakukannya dengan benar; jika Anda gagal, Anda pasti salah melakukannya". Mudah untuk membuang kata-kata seperti "dapat digunakan kembali" dan "dapat dipelihara", tetapi tidak mudah untuk mengukur kualitas ini dalam kode aktual, juga tidak ada resep yang memberi tahu Anda cara menulis OOP yang baik (meskipun ribuan buku berupaya melakukannya) . Kami juga mendapatkan kebiasaan buruk mengabaikan perangkat keras, yang mengarah pada kinerja mengerikan di altar menghindari pengoptimalan prematur.
Tom
21

Saya pikir penggunaan objek konteks buram (HANDLE di Win32, FILE * s di C, untuk menyebutkan dua contoh terkenal - neraka, HANDLE hidup di sisi lain dari penghalang mode kernel, dan itu benar-benar tidak mendapatkan jauh lebih enkapsulasi daripada itu) ditemukan dalam kode prosedural juga; Saya berjuang untuk melihat bagaimana ini sesuatu yang khusus untuk OOP.

HANDLEs (dan WinAPI lainnya) adalah OOP! C tidak mendukung OOP dengan baik sehingga tidak ada sintaks khusus tetapi itu tidak berarti tidak menggunakan konsep yang sama. WinAPI dalam segala hal kata kerangka kerja berorientasi objek.

Lihat, ini adalah masalah dengan setiap diskusi yang melibatkan OOP atau teknik alternatif: tidak ada yang jelas tentang definisi, semua orang berbicara tentang sesuatu yang lain dan dengan demikian tidak ada konsensus yang dapat dicapai. Sepertinya buang-buang waktu bagiku.

Konrad Rudolph
sumber
1
Saya baru saja memposting sesuatu yang sangat mirip.
Brad Gilbert
Saya setuju bahwa Anda dapat menggunakan konsep OOP tanpa sintaks khusus, tetapi di sisi lain, saya tidak berpikir bahwa WinAPI adalah contoh yang baik dari konsep OOP.
Lena Schimmel
14

Ini adalah paradigma pemrograman .. Dirancang untuk membuatnya lebih mudah bagi kita manusia biasa untuk memecah masalah menjadi lebih kecil, bagian yang bisa dikerjakan ..

Jika Anda merasa itu tidak berguna .. Jangan menggunakannya, jangan membayar untuk pelatihan dan bahagia.

Saya di sisi lain memang merasa berguna, jadi saya akan :)

Rob Cooper
sumber
14

Sehubungan dengan pemrograman prosedural yang lurus, prinsip fundamental pertama OOP adalah gagasan menyembunyikan informasi dan enkapsulasi. Ide ini mengarah pada gagasan kelas yang memisahkan antarmuka dari implementasi. Ini adalah konsep yang sangat penting dan dasar untuk menempatkan kerangka kerja di tempat untuk berpikir tentang desain program dengan cara yang berbeda dan cara yang lebih baik (saya pikir). Anda tidak dapat benar-benar menentang properti-properti tersebut - tidak ada trade-off yang dibuat dan selalu merupakan cara yang lebih bersih untuk memodulasi hal-hal.

Aspek-aspek lain dari OOP termasuk pewarisan dan polimorfisme juga penting, tetapi seperti yang telah disinggung oleh orang-orang, itu biasanya digunakan secara berlebihan. yaitu: Kadang-kadang orang menggunakan warisan dan / atau polimorfisme karena mereka bisa, bukan karena seharusnya. Mereka adalah konsep yang kuat dan sangat berguna, tetapi perlu digunakan secara bijak dan tidak otomatis menjadi keunggulan OOP.

Relatif untuk digunakan kembali. Saya setuju digunakan kembali lebih dari penjualan untuk OOP. Ini adalah efek samping yang mungkin dari objek yang terdefinisi dengan baik, biasanya dari kelas yang lebih primitif / generik dan merupakan akibat langsung dari konsep enkapsulasi dan penyembunyian informasi. Ini berpotensi lebih mudah untuk digunakan kembali karena antarmuka kelas yang didefinisikan dengan baik hanya lebih jelas dan agak mendokumentasikan diri.

Tinggi Jeff
sumber
1
Penggunaan kembali adalah sesuatu yang sulit bagi pengembang perangkat lunak, bukan, terlepas dari paradigma apa pun yang mereka gunakan, apakah itu OO atau fungsional atau apa pun? Itu bertentangan dengan persyaratan yang selalu berubah yang dibuat pada perangkat lunak dan pertanyaannya tampaknya menjadi salah satu dari membuat desain yang fleksibel.
Geoglyph
"Gagasan tentang kelas yang memisahkan antarmuka dari implementasi" --- Saya pikir antarmuka adalah antarmuka dan kelas adalah implementasi? Mungkin saya hanya seorang pemikir yang terlalu berorientasi pada proses, tetapi saya pikir itu polimorfisme, perbedaan dalam kode dengan keseragaman yang digunakan, itulah penendang OOP; Saya pikir "sekelompok fungsi C" memisahkan antarmuka dari implementasi sama baiknya dengan "kelas java". Mungkin saya semua salah?
Jonas Kölker
2
@Jonas - Untuk Anda "banyak fungsi C" --- Saya setuju bahwa mereka dapat memisahkan antarmuka dari implementasi, dan pada saat itu IS mulai menjadi OOP. Jika contoh berlanjut untuk mendefinisikan struct C yang dioperasikan oleh API, pada dasarnya Anda telah membuat enkapsulasi (terutama jika API beroperasi secara tidak jelas pada struktur) ... dan kemudian itu benar-benar OOP dalam C.
Tall Jeff
12

Masalah dengan OOP adalah oversold.

Seperti Alan Kay awalnya disusun itu, itu adalah alternatif yang bagus untuk praktik sebelumnya memiliki data mentah dan semua rutinitas global.

Kemudian beberapa tipe konsultan manajemen mengaitkannya dan menjualnya sebagai messiah perangkat lunak, dan seperti lemming, akademisi dan industri jatuh setelahnya.

Sekarang mereka seperti jatuh lemming setelah ide bagus lainnya oversold, seperti pemrograman fungsional.

Jadi, apa yang akan saya lakukan secara berbeda? Banyak, dan saya menulis buku tentang ini. (Sudah tidak dicetak - saya tidak mendapatkan satu sen, tetapi Anda masih bisa mendapatkan salinan.) Amazon

Jawaban konstruktif saya adalah melihat pemrograman bukan sebagai cara memodelkan hal-hal di dunia nyata, tetapi sebagai cara pengkodean persyaratan.

Itu sangat berbeda, dan didasarkan pada teori informasi (pada tingkat yang dapat dipahami siapa pun). Dikatakan bahwa pemrograman dapat dipandang sebagai proses mendefinisikan bahasa, dan keterampilan dalam melakukannya adalah penting untuk pemrograman yang baik.

Ini mengangkat konsep domain-bahasa-spesifik (DSL). Itu setuju dengan tegas dengan KERING (jangan ulangi sendiri). Ini memberi acungan jempol besar untuk pembuatan kode. Ini menghasilkan perangkat lunak dengan struktur data jauh lebih sedikit daripada yang khas untuk aplikasi modern.

Ia berusaha untuk menguatkan kembali gagasan bahwa jalan ke depan terletak pada penemuan, dan bahkan gagasan yang diterima dengan baik pun harus dipertanyakan.

Mike Dunlavey
sumber
Keren. Karena buku ini tidak dicetak, Anda tidak ingin memberikan PDF, bukan? Amazon mengirim dengan lambat ke Argentina ...
Dan Rosenstark
Saya menduga bahwa di suatu tempat di awal proses, beberapa coder yang baik membesar-besarkan retorika tentang apa yang dapat mereka lakukan dengan OOP, dan seseorang mendengar mereka dan berpikir bahwa itu berarti semua orang bisa dan akan melakukan hal yang sama.
kekacauan
@Aniel: saran bagus. Saya akan bekerja pada itu, dan melihat apakah saya dapat melampirkannya ke blogspot saya. Anda akan merasa sedikit kuno, karena itu pada '94, tetapi prinsip-prinsipnya tidak berubah.
Mike Dunlavey
1
@Mike Dunlavey Dear Sir, bolehkah saya mendukung keingintahuan @ yar untuk mengetahui apakah ada kesempatan untuk membaca / mendapatkan buku Anda [setidaknya sebagian] melalui internet? Karena tampaknya cara spesifikasi / implementasi [komponen] perangkat lunak yang efektif yang Anda usulkan / kembangkan sangat cocok dengan yang [baru-baru ini saya kenali] Saya ingin belajar atau diajari (sebagai lawan dari, yah, cara 'kargo' yang diperkenalkan dengan baik buku-buku OO mainstream yang ditulis tetapi sangat membingungkan). Terima kasih sebelumnya [dan sorak-sorai dari Rusia :)].
mlvljr
1
@mlvljr: Oke. Cara tercepat mungkin hanya dengan memindai dan membuat file pdf besar. Saya akan melihat apakah saya bisa mendapatkannya dalam beberapa hari ke depan. Jangan biarkan saya lupa [belasungkawa tulus atas kejadian baru-baru ini di Moskow, dan sorak-sorai dari Massachusetts yang basah].
Mike Dunlavey
11

HANDLE (dan anggota WinAPI lainnya) adalah OOP!

Apakah mereka demikian? Mereka tidak bisa diwariskan, mereka tentu saja tidak dapat diganti, mereka tidak memiliki kelas yang terdefinisi dengan baik ... Saya pikir mereka jauh dari "OOP".

Pernahkah Anda membuat jendela menggunakan WinAPI? Maka Anda harus tahu bahwa Anda mendefinisikan kelas ( RegisterClass), membuat instance dari itu ( CreateWindow), memanggil metode virtual ( WndProc) dan metode kelas-dasar ( DefWindowProc) dan seterusnya. WinAPI bahkan mengambil nomenklatur dari SmallTalk OOP, menyebut metode "pesan" (Pesan Jendela).

Pegangan mungkin tidak dapat diwariskan tetapi kemudian, ada finaldi Jawa. Mereka tidak kekurangan kelas, mereka adalah pengganti untuk kelas: Itulah arti kata "pegangan". Melihat arsitektur seperti MFC atau .NET WinForms segera jelas bahwa kecuali sintaksisnya, tidak banyak yang berbeda dari WinAPI.

Konrad Rudolph
sumber
WINAPI bukan OOP. Itu hanya menunjukkan cara penulisan kode prosedural yang dapat diperpanjang. Teknik yang baik itu baik tidak masalah apakah itu OOP atau tidak. Saya dapat menulis program WINAPI dalam C dan menggunakan teknik yang sama dalam kode saya sendiri, jadi saya kira C adalah OOP.
bruceatk
3
Mungkin bukan apa yang ada dalam pikiran Alan Kay (google it!) Tapi itu OOP nontheless.
Konrad Rudolph
11

Ya OOP tidak menyelesaikan semua masalah kami, maaf soal itu. Namun, kami sedang mengerjakan SOA yang akan menyelesaikan semua masalah itu.

Nat
sumber
4
Apakah kamu tidak mendengar? SOA adalah masa lalu. Hari ini adalah cloud computing yang akan menjadi penyelamat kita.
DrPizza
Saya benar-benar bertanya-tanya apakah jawaban Anda ironis atau tidak. Aku seperti ironi, tetapi biasanya yang mendapatkan ditolak, ini membuat saya bertanya-tanya ...
Lena Schimmel
Saya pikir ini ironis, dan saya tidak akan memilihnya. Tapi aku juga tidak akan memilihnya! :-)
Yarik
Pertanyaannya cukup retoris sehingga ini adalah jawaban yang valid (dan jawaban terbaik).
Jeff Davis
10

OOP cocok untuk pemrograman struktur komputer internal seperti "widget" GUI, di mana misalnya SelectList dan TextBox mungkin subtipe Item, yang memiliki metode umum seperti "bergerak" dan "mengubah ukuran".

Masalahnya adalah, 90% dari kita bekerja di dunia bisnis di mana kita bekerja dengan konsep bisnis seperti Faktur, Karyawan, Pekerjaan, Pesanan. Ini tidak cocok untuk OOP karena "objek" lebih samar, dapat berubah sesuai dengan rekayasa ulang bisnis dan sebagainya.

Kasus terburuk adalah di mana OO secara antusias diterapkan ke database, termasuk "peningkatan" OO yang mengerikan untuk database SQL - yang diabaikan dengan benar kecuali oleh basis data yang menganggap bahwa mereka harus menjadi cara yang tepat untuk melakukan sesuatu karena mereka lebih baru.

Tony Andrews
sumber
Itu semua benar, tapi ... mungkin, fakta bahwa OOP dapat menyederhanakan BEBERAPA aspek bisnis yang tidak terkait (seperti implementasi UI) adalah salah satu alasan utama mengapa pengembang (akhirnya!) Dapat menghabiskan lebih banyak waktu bekerja di bisnis Aspek terkait?
Yarik
10

Dalam pengalaman saya meninjau kode dan desain proyek yang telah saya lalui, nilai OOP tidak sepenuhnya terwujud karena banyak pengembang belum mengonseptualisasikan model berorientasi objek dengan benar dalam pikiran mereka. Jadi mereka tidak memprogram dengan desain OO, sangat sering terus menulis kode prosedural top-down membuat kelas-kelas yang cukup datar desain yang . (jika Anda bahkan dapat memanggil "desain" itu di tempat pertama)

Sangat menakutkan untuk mengamati bagaimana kolega kecil tahu tentang apa kelas abstrak atau antarmuka, apalagi merancang hierarki warisan yang sesuai dengan kebutuhan bisnis.

Namun, ketika desain OO yang baik hadir, itu hanya kegembiraan belaka membaca kode dan melihat kode secara alami masuk ke dalam komponen / kelas yang intuitif. Saya selalu merasa arsitektur sistem dan desain seperti merancang berbagai departemen dan pekerjaan staf di sebuah perusahaan - semua ada di sana untuk menyelesaikan pekerjaan tertentu dalam skema besar, memancarkan sinergi yang diperlukan untuk mendorong organisasi / sistem ke depan.

Sayangnya , itu cukup langka . Seperti rasio benda-benda fisik yang dirancang dengan indah dan sangat mengerikan di dunia, hal yang sama dapat dikatakan tentang rekayasa dan desain perangkat lunak. Memiliki alat-alat bagus yang tersedia bagi seseorang tidak serta merta memberikan praktik dan hasil yang baik.

icelava
sumber
1
Saya belum pernah mencapai fase kesenangan semata-mata secara prosedural atau OOP saat membaca kode. :)
bruceatk
1
Semata-mata gembira, tidak, tapi mungkin senyum kecil?
Dan Rosenstark
9

Mungkin topi, pangkuan, atau pohon bukanlah kursi, tetapi semuanya bisa ISITI.

Johnno Nolan
sumber
2
Anda tidak pernah harus menggunakan bahasa OO tanpa antarmuka, bukan? Anda beruntung.
finnw
Tidak, mereka tidak. Mereka adalah hal-hal yang tidak dirancang untuk duduk, jadi saya pikir benar dengan analogi, mereka tidak akan ditulis untuk mengimplementasikan antarmuka ISittable. Mereka berasal dari pustaka pihak ke-3, dan sekarang Anda menulis proyek yang melibatkan domain yang mencakup duduk, Anda harus menulis objek adaptor untuk membungkusnya agar dapat ISIS. Lihat? Tidak terlalu seperti dunia nyata.
EricS
8

Saya pikir benda-benda dunia nyata itu benda

Kamu lakukan?

Metode apa yang dimiliki faktur? Oh tunggu. Itu tidak bisa membayar sendiri, tidak bisa mengirim sendiri, tidak bisa membandingkan dirinya dengan barang yang benar-benar dikirimkan oleh vendor. Itu tidak memiliki metode sama sekali; itu benar-benar lembam dan tidak berfungsi. Ini adalah tipe rekaman (sebuah struct, jika Anda mau), bukan objek.

Demikian juga hal-hal lain yang Anda sebutkan.

Hanya karena sesuatu itu nyata tidak menjadikannya objek dalam arti kata OO. Objek-objek OO adalah gabungan khusus dari keadaan dan perilaku yang dapat bertindak atas kemauannya sendiri. Itu bukan sesuatu yang berlimpah di dunia nyata.

DrPizza
sumber
2
Ambil mesin, perangkat elektronik, atau makhluk hidup, semua itu adalah "kopling kondisi dan perilaku".
TM.
1
Saya setuju bahwa metode seperti Kirim () atau Bayar () "tidak alami" untuk faktur. Tetapi, misalnya, bagaimana dengan jumlah total sebagai atribut faktur turunan tetapi INHERENT? Bukankah itu contoh dari apa yang memungkinkan OOP untuk membuat model dengan cara yang sangat "alami" bahkan untuk entitas kehidupan nyata yang benar-benar lembam? Bukan pencapaian besar dengan sendirinya, tetapi masih ...
Yarik
@Yarik: Entitas "inert" ini mengarah pada desain Berbasis Objek. Bagi saya, satu-satunya OO yang tepat adalah Simulasi, di mana objek "dapat bertindak atas kemauannya sendiri" , sebagaimana dinyatakan oleh jawaban ini. Jika OO adalah satu-satunya cara yang bisa dilakukan untuk menyelesaikan sesuatu, baiklah, tetapi sebaliknya tidak bisakah kita tetap berpegang pada sesuatu yang lebih sederhana dan lebih seperti masalah yang sedang dipecahkan?
7

Saya telah menulis kode OO selama 9 tahun terakhir ini. Selain menggunakan olahpesan, sulit bagi saya untuk membayangkan pendekatan lain. Manfaat utama yang saya lihat benar-benar sejalan dengan apa yang dikatakan CodingTheWheel: modularisasi. OO secara alami menuntun saya untuk membangun aplikasi saya dari komponen modular yang memiliki antarmuka yang bersih dan tanggung jawab yang jelas (yaitu longgar digabungkan, kode yang sangat kohesif dengan pemisahan keprihatinan yang jelas).

Saya pikir di mana OO rusak adalah ketika orang membuat pusaka kelas yang sangat bersarang. Ini dapat menyebabkan kompleksitas. Namun, memasukkan finctionality umum ke dalam kelas dasar, kemudian menggunakan kembali bahwa di kelas turunan lainnya adalah hal yang sangat elegan, IMHO!

Sean Kearon
sumber
7

Pertama, pengamatannya agak ceroboh. Saya tidak memiliki angka pada produktivitas perangkat lunak, dan tidak memiliki alasan yang baik untuk percaya itu tidak naik. Lebih lanjut, karena ada banyak orang yang menyalahgunakan OO, penggunaan OO yang baik tidak akan menyebabkan peningkatan produktivitas bahkan jika OO adalah hal terbesar sejak selai kacang. Bagaimanapun, seorang ahli bedah otak yang tidak kompeten cenderung lebih buruk daripada tidak sama sekali, tetapi yang kompeten bisa sangat berharga.

Yang sedang berkata, OO adalah cara yang berbeda untuk mengatur sesuatu, melampirkan kode prosedural ke data daripada memiliki kode prosedural beroperasi pada data. Ini harus setidaknya menang kecil dengan sendirinya, karena ada kasus di mana pendekatan OO lebih alami. Tidak ada yang menghentikan siapa pun untuk menulis API prosedural dalam C ++, dan karenanya pilihan untuk menyediakan objek malah membuat bahasa lebih fleksibel.

Lebih jauh, ada sesuatu yang dilakukan dengan sangat baik oleh OO: memungkinkan kode lama untuk memanggil kode baru secara otomatis, tanpa perubahan. Jika saya memiliki kode yang mengatur hal-hal secara prosedural, dan saya menambahkan hal-hal baru yang serupa tetapi tidak identik dengan yang sebelumnya, saya harus mengubah kode prosedural. Dalam sistem OO, saya mewarisi fungsi, mengubah apa yang saya suka, dan kode baru secara otomatis digunakan karena polimorfisme. Ini meningkatkan lokalitas perubahan, dan itu adalah Good Thing.

Kelemahannya adalah bahwa OO yang baik tidak gratis: itu membutuhkan waktu dan usaha untuk mempelajarinya dengan benar. Karena ini adalah kata kunci utama, ada banyak orang dan produk yang melakukannya dengan buruk, hanya demi melakukannya. Tidaklah mudah untuk merancang antarmuka kelas yang baik daripada API prosedural yang baik, dan ada segala macam kesalahan yang mudah dibuat (seperti hierarki kelas dalam).

Anggap saja sebagai alat yang berbeda, umumnya tidak selalu lebih baik. Palu selain obeng, katakanlah. Mungkin kita akhirnya akan keluar dari praktik rekayasa perangkat lunak karena mengetahui kunci pas mana yang digunakan untuk memalu sekrup.

David Thornley
sumber
Saya suka paragraf terakhir Anda yang terbaik.
Mike Dunlavey
6

@Sean

Namun, memasukkan finctionality umum ke dalam kelas dasar, kemudian menggunakan kembali bahwa di kelas turunan lainnya adalah hal yang sangat elegan, IMHO!

Tetapi pengembang "prosedural" telah melakukan itu selama beberapa dekade. Sintaks dan terminologinya mungkin berbeda, tetapi efeknya identik. Ada lebih banyak untuk OOP daripada "menggunakan kembali fungsi umum dalam kelas dasar", dan saya bahkan mungkin mengatakan bahwa itu sulit untuk digambarkan sebagai OOP sama sekali; Memanggil fungsi yang sama dari bit kode yang berbeda adalah teknik yang sama tuanya dengan sub-prosedur itu sendiri.

DrPizza
sumber
6

@Konrad

OOP mungkin cacat dan tentu saja bukan peluru perak tetapi itu membuat aplikasi skala besar jauh lebih sederhana karena itu cara yang bagus untuk mengurangi ketergantungan

Itu adalah dogma. Saya tidak melihat apa yang membuat OOP secara signifikan lebih baik dalam hal ini daripada pemrograman prosedural lama. Setiap kali saya melakukan panggilan prosedur saya mengisolasi diri dari spesifikasi implementasi.

DrPizza
sumber
6

Bagi saya, ada banyak nilai dalam sintaks OOP itu sendiri. Menggunakan objek yang berusaha mewakili hal-hal nyata atau struktur data seringkali jauh lebih berguna daripada mencoba menggunakan sekelompok fungsi flat (atau "mengambang") yang berbeda untuk melakukan hal yang sama dengan data yang sama. Ada "aliran" alami tertentu untuk hal-hal dengan OOP yang baik yang lebih masuk akal untuk membaca, menulis, dan memelihara jangka panjang.

Tidak masalah bahwa Faktur sebenarnya bukan "objek" dengan fungsi yang dapat ia lakukan sendiri - instance objek dapat ada hanya untuk melakukan fungsi pada data tanpa harus mengetahui jenis data apa yang sebenarnya ada. Fungsi "invoice.toJson ()" dapat dipanggil dengan sukses tanpa harus tahu apa jenis data "faktur" - hasilnya akan menjadi Json, tidak masalah apakah itu berasal dari database, XML, CSV, atau bahkan objek JSON lainnya . Dengan fungsi prosedural, Anda tiba-tiba harus tahu lebih banyak tentang data Anda, dan berakhir dengan fungsi seperti "xmlToJson ()", "csvToJson ()", "dbToJson ()", dll. Pada akhirnya menjadi berantakan dan Sakit kepala besar jika Anda pernah mengubah tipe data yang mendasarinya.

Maksud dari OOP adalah untuk menyembunyikan implementasi aktual dengan memisahkannya. Untuk mencapai tujuan itu, Anda harus membuat antarmuka publik. Untuk membuat pekerjaan Anda lebih mudah saat membuat antarmuka publik dan menjaga hal-hal KERING, Anda harus menggunakan konsep-konsep seperti kelas abstrak, pewarisan, polimorfisme, dan pola desain.

Jadi bagi saya, tujuan utama OOP yang sebenarnya adalah membuat pemeliharaan dan perubahan kode di masa mendatang lebih mudah. Tetapi bahkan lebih dari itu, itu bisa sangat menyederhanakan banyak hal ketika dilakukan dengan benar dengan cara yang tidak pernah bisa dilakukan oleh kode prosedural. Tidak masalah jika tidak cocok dengan "dunia nyata" - pemrograman dengan kode tidak berinteraksi dengan objek dunia nyata. OOP hanyalah alat yang membuat pekerjaan saya lebih mudah dan lebih cepat - saya akan melakukannya setiap hari.

Vance Lucas
sumber
5

@CodingTheWheel

Tetapi sejauh OOP telah membuang-buang waktu, saya akan mengatakan itu karena kurangnya pelatihan programmer, diperparah oleh kurva pembelajaran curam belajar pemetaan OOP bahasa tertentu. Beberapa orang "mendapatkan" OOP dan yang lain tidak akan pernah.

Saya tidak tahu apakah itu benar-benar mengejutkan. Saya pikir secara teknis pendekatan (LSP menjadi hal yang jelas) membuat sulit untuk digunakan , tetapi jika kita tidak menggunakan pendekatan seperti itu membuat kode rapuh dan tidak dapat dipertahankan lagi (karena kita tidak dapat lagi alasan tentang hal itu). Dan saya pikir hasil yang berlawanan dengan intuisi yang membuat OOP membuat kita tidak mengejutkan bahwa orang tidak mengambilnya.

Lebih penting lagi, karena perangkat lunak sudah terlalu sulit bagi manusia normal untuk menulis dengan andal dan akurat, haruskah kita benar-benar memuji teknik yang secara konsisten diajarkan dengan buruk dan tampaknya sulit untuk dipelajari? Jika manfaatnya jelas, maka mungkin ada gunanya bertahan meskipun kesulitan, tapi itu tampaknya tidak menjadi masalah.

DrPizza
sumber
"Pelatihan yang tepat" harus sangat panjang, abstrak dan kompleks akhir-akhir ini. Saya tahu: saya mengajar pemrograman. Beberapa dekade yang lalu, banyak orang dapat belajar melakukan semacam pemrograman. Saya pikir itu tidak benar lagi.
5

@ Jeff

Sehubungan dengan pemrograman prosedural yang lurus, prinsip fundamental pertama OOP adalah gagasan menyembunyikan informasi dan enkapsulasi. Ide ini mengarah pada gagasan kelas yang memisahkan antarmuka dari implementasi.

Yang memiliki implementasi lebih tersembunyi: iostreams C ++, atau C's FILE * s?

Saya pikir penggunaan objek konteks buram (HANDLE di Win32, FILE * s di C, untuk menyebutkan dua contoh terkenal - neraka, HANDLE hidup di sisi lain dari penghalang mode kernel, dan itu benar-benar tidak mendapatkan jauh lebih enkapsulasi daripada itu) ditemukan dalam kode prosedural juga; Saya berjuang untuk melihat bagaimana ini sesuatu yang khusus untuk OOP.

Saya kira itu mungkin menjadi bagian dari mengapa saya berjuang untuk melihat manfaatnya: bagian yang jelas baik tidak spesifik untuk OOP, sedangkan bagian yang khusus untuk OOP tidak jelas baik! (Ini bukan untuk mengatakan bahwa mereka selalu buruk, tetapi lebih karena saya belum melihat bukti bahwa mereka berlaku luas dan secara konsisten bermanfaat).

DrPizza
sumber
5

Di satu-satunya blog dev yang saya baca, oleh lelaki Joel-On-Software-Founder-SO, saya membaca sejak lama bahwa OO tidak menyebabkan peningkatan produktivitas. Manajemen memori otomatis tidak. Keren. Siapa yang bisa menolak data?

Saya masih percaya bahwa OO adalah untuk non-OO apa pemrograman dengan fungsi untuk memprogram semuanya sesuai.

(Dan saya harus tahu, ketika saya mulai dengan GWBasic.) Ketika Anda refactor kode untuk menggunakan fungsi, variable2654menjadi variable3metode yang Anda gunakan . Atau, lebih baik lagi, itu punya nama yang dapat Anda pahami, dan jika fungsinya pendek , Itu disebut value dan itu cukup untuk pemahaman penuh.

Ketika kode tanpa fungsi menjadi kode dengan metode, Anda bisa menghapus mil kode.

Ketika Anda refactor kode untuk benar-benar OO, b, c, q, dan Zmenjadi this, this, thisdan this. Dan karena saya tidak percaya menggunakan thiskata kunci, Anda bisa menghapus mil kode. Sebenarnya, Anda bisa melakukannya bahkan jika Anda menggunakannya this.



Saya tidak berpikir OO adalah metafora alami.

Saya tidak berpikir bahasa adalah metafora alami juga, saya juga tidak berpikir bahwa "bau" Fowler lebih baik daripada mengatakan "kode ini rasanya tidak enak." Yang mengatakan, saya pikir bahwa OO bukan tentang metafora alami dan orang-orang yang berpikir objek hanya muncul pada Anda pada dasarnya kehilangan intinya. Anda mendefinisikan objek semesta, dan objek semesta yang lebih baik menghasilkan kode yang lebih pendek, lebih mudah dipahami, bekerja lebih baik, atau semua ini (dan beberapa kriteria saya lupa). Saya berpikir bahwa orang yang menggunakan objek alami pelanggan / domain sebagai objek pemrograman kehilangan kekuatan untuk mendefinisikan kembali alam semesta.

Misalnya, ketika Anda melakukan sistem reservasi penerbangan, apa yang Anda sebut reservasi mungkin tidak sesuai dengan reservasi hukum / bisnis sama sekali.



Beberapa konsep dasar adalah alat yang sangat keren

Saya pikir sebagian besar orang melebih-lebihkan dengan keseluruhan "ketika Anda memiliki palu, semuanya adalah paku". Saya pikir sisi lain dari koin / cermin itu sama benarnya: ketika Anda memiliki gadget seperti polimorfisme / pewarisan, Anda mulai menemukan kegunaan yang cocok seperti sarung tangan / kaus kaki / lensa kontak. Alat-alat OO sangat kuat. Warisan tunggal, saya pikir, mutlak diperlukan agar orang tidak terbawa, perangkat lunak multi-warisan saya sendiri tidak tahan.



Apa gunanya OOP?

Saya pikir ini cara yang bagus untuk menangani basis kode yang sangat besar. Saya pikir itu memungkinkan Anda mengatur dan mengatur ulang kode Anda dan memberi Anda bahasa untuk melakukannya di (di luar bahasa pemrograman tempat Anda bekerja), dan memodulasi kode dengan cara yang cukup alami dan mudah dimengerti.

OOP ditakdirkan untuk disalahpahami oleh sebagian besar pengembang

Ini karena ini adalah proses yang membuka mata seperti kehidupan: Anda semakin memahami OO dengan pengalaman, dan mulai menghindari pola-pola tertentu dan mempekerjakan orang lain ketika Anda menjadi lebih bijaksana. Salah satu contoh terbaik adalah Anda berhenti menggunakan pewarisan untuk kelas yang tidak Anda kontrol, dan lebih memilih pola Facade sebagai gantinya.



Mengenai esai / pertanyaan Anda

Saya memang ingin mengatakan bahwa Anda benar. Dapat digunakan kembali adalah mimpi-pipa, sebagian besar. Berikut ini kutipan dari Anders Hejilsberg tentang topik itu (brilian) dari sini :

Jika Anda meminta para pemrogram pemula untuk menulis kontrol kalender, mereka sering berpikir pada diri mereka sendiri, "Oh, saya akan menulis kontrol kalender terbaik di dunia! Ini akan menjadi polimorfik sehubungan dengan jenis kalender. Ini akan memiliki pemajang, dan hijau, dan ini, itu, dan yang lainnya. " Mereka perlu mengirimkan aplikasi kalender dalam dua bulan. Mereka menempatkan semua infrastruktur ini pada kontrol, dan kemudian menghabiskan dua hari menulis aplikasi kalender jelek di atasnya. Mereka akan berpikir, "Dalam versi aplikasi berikutnya, saya akan melakukan lebih banyak lagi."

Begitu mereka mulai berpikir tentang bagaimana mereka sebenarnya akan mengimplementasikan semua konkretisasi lain dari desain abstrak mereka, bagaimanapun, ternyata desain mereka benar-benar salah. Dan sekarang mereka telah melukis diri mereka ke sudut, dan mereka harus membuang semuanya. Saya telah melihatnya berulang kali. Saya sangat percaya menjadi minimalis. Kecuali jika Anda benar-benar akan menyelesaikan masalah umum, jangan mencoba dan menempatkan kerangka kerja untuk memecahkan masalah tertentu, karena Anda tidak tahu seperti apa bentuk kerangka itu.

Yar
sumber
4

Pernahkah Anda membuat jendela menggunakan WinAPI?

Lebih sering dari yang saya ingin ingat.

Maka Anda harus tahu bahwa Anda mendefinisikan kelas (RegisterClass), membuat instance dari itu (CreateWindow), memanggil metode virtual (WndProc) dan metode kelas dasar (DefWindowProc) dan sebagainya. WinAPI bahkan mengambil nomenklatur dari SmallTalk OOP, menyebut metode "pesan" (Pesan Jendela).

Maka Anda juga akan tahu bahwa itu tidak mengirim pesan sendiri, yang merupakan kekosongan besar menganga. Ini juga memiliki subclass yang jelek.

Pegangan mungkin tidak dapat diwariskan tetapi kemudian, ada final di Jawa. Mereka tidak kekurangan kelas, mereka adalah pengganti untuk kelas: Itulah arti kata "pegangan". Melihat arsitektur seperti MFC atau .NET WinForms segera jelas bahwa kecuali sintaksisnya, tidak banyak yang berbeda dari WinAPI.

Mereka tidak dapat diwariskan baik dalam antarmuka atau implementasi, minimal dapat disubstitusikan, dan mereka tidak jauh berbeda dari apa yang telah dilakukan oleh coders prosedural sejak dulu.

Benarkah ini? Bit terbaik OOP hanyalah ... kode prosedural tradisional? Itu masalah besar?

DrPizza
sumber
Anda harus ingat antarmuka Win32 pada dasarnya adalah implementasi ulang Win16. Yang dirancang lebih dari dua dekade lalu.
Brad Gilbert
Ketika saya belajar untuk memprogram di perguruan tinggi, sebagian besar di C tetapi beberapa bahasa lain juga, kami diajarkan beberapa ide dasar dan terpapar pada beberapa platform, tetapi dipahami bahwa tanggung jawab keseluruhan untuk memunculkan desain, kerangka kerja, praktik terbaik, dll. akan terserah kita di tempat kerja. Kami belajar teknik, bukan pandangan dunia. Dengan OO, Anda harus mempelajari agama sebelum dapat melakukan sesuatu yang bermanfaat, dan itu sepenuhnya menentukan bagaimana Anda melihat solusinya. Saya pikir itu tidak benar.
4

Saya setuju sepenuhnya dengan jawaban InSciTek Jeff , saya hanya akan menambahkan penyempurnaan berikut:

  • Penyembunyian dan enkapsulasi informasi: Penting untuk kode yang dapat dipelihara. Dapat dilakukan dengan berhati-hati dalam bahasa pemrograman apa pun, tidak memerlukan fitur OO, tetapi melakukannya akan membuat kode Anda sedikit seperti OO.
  • Warisan: Ada satu domain aplikasi penting yang semua OO -nya adalah sejenis dan mengandung- hubungan yang sangat cocok: Graphical User Interface. Jika Anda mencoba membangun GUI tanpa dukungan bahasa OO, Anda akhirnya akan membangun fitur seperti OO, dan itu lebih sulit dan lebih rentan kesalahan tanpa dukungan bahasa. Glade (baru-baru ini) dan X11 Xt (secara historis) misalnya.

Menggunakan fitur OO (terutama hierarki abstrak yang bersarang mendalam), ketika tidak ada gunanya, tidak ada gunanya. Tetapi untuk beberapa domain aplikasi, benar-benar ada benarnya.

Liudvikas Bukys
sumber
Ya, saya pikir Anda harus menggunakan OOP untuk objek, pemrograman fungsional untuk fungsi ...
Svante
4

Saya percaya kualitas OOP yang paling bermanfaat adalah menyembunyikan / mengelola data. Namun, ada BANYAK contoh di mana OOP disalahgunakan dan saya pikir ini adalah di mana kebingungan muncul.

Hanya karena Anda dapat membuat sesuatu menjadi objek bukan berarti Anda harus melakukannya. Namun, jika melakukannya akan membuat kode Anda lebih terorganisir / lebih mudah dibaca maka Anda harus melakukannya.

Contoh praktis yang bagus di mana OOP sangat membantu adalah dengan kelas "produk" dan objek yang saya gunakan di situs web kami. Karena setiap halaman adalah produk, dan setiap produk memiliki referensi ke produk lain, itu bisa sangat membingungkan untuk produk mana data yang Anda rujuk. Apakah "strURL" ini variabel tautan ke halaman saat ini, atau ke halaman rumah, atau ke halaman statistik? Tentu Anda bisa membuat semua jenis variabel berbeda yang merujuk pada informasi yang sama, tetapi proCurrentPage-> strURL, jauh lebih mudah dipahami (untuk pengembang).

Selain itu, melampirkan fungsi ke halaman tersebut jauh lebih bersih. Saya dapat melakukan proCurrentPage-> CleanCache (); Diikuti oleh proDisplayItem-> RenderPromo (); Jika saya baru saja memanggil fungsi-fungsi itu dan menganggapnya data saat ini tersedia, siapa yang tahu kejahatan macam apa yang akan terjadi. Juga, jika saya harus meneruskan variabel yang benar ke dalam fungsi-fungsi itu, saya kembali ke masalah memiliki semua jenis variabel untuk produk yang berbeda-beda.

Alih-alih, menggunakan objek, semua data dan fungsi produk saya bagus dan bersih dan mudah dimengerti.

Namun. Masalah besar dengan OOP adalah ketika seseorang percaya bahwa SEMUA hal harus menjadi OOP. Ini menciptakan banyak masalah. Saya memiliki 88 tabel di database saya. Saya hanya memiliki sekitar 6 kelas, dan mungkin saya harus memiliki sekitar 10 kelas. Saya jelas tidak membutuhkan 88 kelas. Sebagian besar waktu secara langsung mengakses tabel-tabel itu dapat dipahami dengan sempurna dalam keadaan saya menggunakannya, dan OOP sebenarnya akan membuatnya lebih sulit / membosankan untuk mendapatkan fungsionalitas inti dari apa yang terjadi.

Saya percaya model hybrid objek mana yang berguna dan prosedural di mana praktis adalah metode pengkodean yang paling efektif. Sayang sekali kita memiliki semua perang agama ini di mana orang menganjurkan menggunakan satu metode dengan mengorbankan yang lain. Mereka berdua baik, dan mereka berdua memiliki tempat masing-masing. Sebagian besar waktu, ada kegunaan untuk kedua metode di setiap proyek yang lebih besar (Dalam beberapa proyek yang lebih kecil, satu objek, atau beberapa prosedur mungkin semua yang Anda butuhkan).

Jeff Davis
sumber
3

Saya tidak peduli untuk digunakan kembali sebanyak yang saya lakukan untuk keterbacaan. Yang terakhir berarti kode Anda lebih mudah diubah. Itu saja bernilai emas dalam kerajinan membangun perangkat lunak.

Dan OO adalah cara yang sangat efektif untuk membuat program Anda dapat dibaca. Menggunakan kembali atau tidak menggunakan kembali.

Frederick The Fool
sumber
2

"Dunia nyata bukan" OO ","

Betulkah? Dunia saya penuh dengan benda. Saya menggunakan satu sekarang. Saya pikir memiliki perangkat lunak "objek" model objek nyata mungkin bukan hal yang buruk.

OO mendesain untuk hal-hal konseptual (seperti Windows, bukan windows dunia nyata, tetapi panel layar pada monitor komputer saya) sering meninggalkan banyak hal yang diinginkan. Tetapi untuk hal-hal dunia nyata seperti faktur, pesanan pengiriman, klaim asuransi dan apa-tidak, saya pikir hal-hal dunia nyata adalah objek. Saya punya setumpuk di meja saya, jadi pasti nyata.

S.Lott
sumber
2

Inti dari OOP adalah untuk memberi programmer cara lain untuk menggambarkan dan mengkomunikasikan solusi untuk masalah dalam kode ke mesin dan orang. Bagian terpenting dari itu adalah komunikasi kepada orang-orang. OOP memungkinkan programmer untuk menyatakan apa artinya dalam kode melalui aturan yang diberlakukan dalam bahasa OO.

Bertentangan dengan banyak argumen tentang topik ini, konsep OOP dan OO meresap di seluruh kode termasuk kode dalam bahasa non-OOP seperti C. Banyak programmer canggih non-OO akan mendekati fitur objek bahkan dalam bahasa non-OO.

Memiliki OO dibangun ke dalam bahasa hanya memberi programmer cara ekspresi lain.

Bagian terbesar untuk menulis kode bukanlah komunikasi dengan mesin, bagian itu mudah, bagian terbesar adalah komunikasi dengan pemrogram manusia.

Bernard Igiri
sumber