Apakah Pemrograman Berorientasi Objek Memodelkan Dunia Nyata? [Tutup]

52

Saya telah melihatnya secara umum diulang pemrograman berorientasi objek didasarkan pada pemodelan dunia nyata tetapi apakah itu?

Tampaknya bagi saya itu tidak benar pada apa pun di luar lapisan bisnis. Kelas GUI saya / kelas akses data tidak memodelkan apa pun di dunia nyata. Bahkan di lapisan bisnis saya, saya punya kelas seperti pengamat, manajer, pabrik, dll. Yang bukan objek dunia nyata. Saya mencoba merancang kelas saya untuk mengambil keuntungan dari hal-hal seperti enkapsulasi tetapi apakah dunia nyata dienkapsulasi?

Sementara beberapa objek yang saya buat memodelkan objek dunia nyata, tidakkah kode pra-OOP melakukan hal yang sama? Saya ragu bahwa OO adalah orang pertama yang memasukkan konsep seperti Pelanggan dalam basis kode mereka. Tapi OO benar-benar tentang bagaimana memodelkan sesuatu, dan metode pemodelan itu tampaknya tidak terinspirasi oleh dunia nyata bagi saya.

Jadi: apakah pemrograman berorientasi objek benar-benar memodelkan dunia nyata?

Winston Ewert
sumber
85
Gagasan menggunakan analogi objek OOP yang mewakili objek dunia nyata adalah contoh utama dari konsep "kebohongan untuk anak-anak". Kami memberi tahu orang-orang yang baru mulai mempelajari OOP kebohongan ini karena ini adalah cara intuitif untuk mendapatkan dasar-dasarnya. Segera setelah mereka mempelajari dasar-dasar itu, mereka siap menyerap fakta bahwa semua yang mereka tahu salah; semuanya sebenarnya lebih kompleks dari itu. Seperti halnya fisika di sekolah: benda-benda pertama jatuh, lalu benda-benda tertarik ke benda-benda yang lebih besar, lalu benda-benda besar membelokkan ruang, lalu pada akhirnya kita diberitahu bahwa kita sebenarnya tidak tahu apa-apa tentang cara kerja benda-benda.
evilcandybag
4
Apa pendapat sebenarnya di sini? Apakah ada beberapa entitas dunia nyata yang tidak dapat dimodelkan secara memadai dimodelkan oleh teknik OO sama sekali? atau apakah pemodelan yaitu menggunakan pemahaman yang disederhanakan tidak cukup sesuai dengan dunia adalah ide buruk yang tidak berfungsi?
Dipan Mehta
1
@DipanMehta, perdebatannya adalah menggambarkan OO sebagai pemodelan dunia nyata merindukan inti pemrograman berorientasi objek. Semua teknik pemrograman memodelkan dunia nyata (sampai tingkat tertentu), bukan itu yang membuat OO unik.
Winston Ewert
@ WinstonEwert Yah, modeling the real worldmungkin bukan yang benar-benar membedakan OO. Mungkin. Tapi saya pasti tidak akan percaya bahwa Anda akan gagal melakukan ini di OO juga. Paradigma atau teknik apa yang menurut Anda membuatnya lebih baik daripada OO?
Dipan Mehta
14
Semua pemrograman mencoba memodelkan sesuatu di dunia nyata. Beberapa paradigma hanya memodelkan bagian yang berbeda lebih baik daripada yang lain. Alur kerja model kode prosedural, model kode fungsional pemecahan masalah logis, kode berorientasi objek model hubungan hirarkis. Model kode Bahasa Majelis mengagumkan .
Jesse C. Slicer

Jawaban:

50

Tidak, tidak sama sekali.

Namun itu adalah metodologi yang memungkinkan untuk membuat abstraksi yang bagus untuk menahan struktur data yang kompleks bersama dengan beberapa metode yang bekerja pada struktur data.

Darknight
sumber
Jawaban singkat yang bagus. Menurut definisi Anda kehilangan beberapa detail dalam model.
MathAttack
Maaf, saya tidak suka jawaban ini. Dengan OOP Anda dapat membuat model (beberapa aspek) dunia nyata.
iklim
33

Model, apa pun jenisnya, tidak memodelkan dunia nyata, tidak sepenuhnya.

Mereka memodelkan bagian yang dipilih , yang relevan dengan aplikasi yang ada.

Apa yang Anda bicarakan (pengamat, manajer, pabrik dll ...) adalah infrastruktur yang ada untuk membantu Anda mendapatkan hak abstraksi dan mendukung fungsi-fungsi yang diperlukan seperti ketekunan.

Oded
sumber
15
Saya berpendapat bahwa "pemodelan" sudah berarti meniru aspek-aspek tertentu (sambil meninggalkan yang lain). Dalam hal itu, OO memungkinkan untuk memodelkan dunia nyata.
Tamás Szelei
Bagian mana dari masalah Anda yang dimodelkan dengan baik oleh OO? Beberapa masalah tidak dipetakan dengan baik ke model OO, model iklim muncul di pikiran. Banyak masalah bisnis memetakan dengan baik ke OO yang mengapa model ini banyak digunakan.
Michael Shopsin
@MichaelShopsin - Apakah maksud Anda komentar Anda lebih pada pertanyaan daripada jawaban saya?
Oded
@Oded Saya suka jawaban Anda; komentar saya adalah perluasan "model bagian yang dipilih". Pola OO memodelkan banyak masalah, ini masalah memastikan bahwa mereka cocok dengan masalah yang dihadapi.
Michael Shopsin
31

Apa yang dimaksud dengan model:
Model adalah representasi yang disederhanakan yang digunakan untuk menjelaskan cara kerja sistem atau peristiwa dunia nyata

Apakah pemrograman berorientasi objek memungkinkan Anda memodelkan dunia nyata?

Pasti ya

Hampir tidak mungkin untuk memodelkan sistem agar benar-benar cocok dengan dunia nyata.

Apakah saya harus selalu memodelkan perangkat lunak persis setelah dunia nyata?

TIDAK

Setelah mengatakan bahwa Anda dapat memodelkan segalanya bukan berarti Anda harus memodelkan segalanya. Bahkan, esensi pemodelan yang berguna adalah menghadirkan representasi yang disederhanakan. Berapa banyak penyederhanaan yang cukup untuk mengekspresikan kebutuhan bisnis saat ini, dan apa yang perlu dihilangkan, adalah keseimbangan yang baik antara menggunakan teknik dengan sukses vs tersesat dengan itu atau tidak menggunakannya sama sekali.

Tentu saja ada entitas yang tidak benar-benar ada, tetapi hanya melalui pemodelan kita benar-benar dapat dikonsep dengan baik.

Dipan Mehta
sumber
9
Apa itu model? ” Setumpuk prajurit kecil yang menyedihkan. Tapi cukup kode, miliki padamu!
Ben Brocka
Saya pikir poin terakhir Anda menangkap hubungan tidak berwujud. Terkadang benda ada di dunia nyata, kita tidak melihatnya.
MathAttack
19

Saya pikir mengajarkan bahwa ada hubungan antara kata benda dan kelas menyebabkan kebiasaan buruk yang mengganggu untuk dikembangkan yang harus dihancurkan kemudian oleh arsitek atau insinyur senior yang tidak sabar.

Apa yang harus diajarkan adalah bahwa kelas memodelkan benda-benda abstrak, seperti otak Anda. Anda memiliki konsep abstrak "mobil" di kepala Anda yang tidak memetakan ke mobil fisik tertentu, itu dapat digunakan kembali, implementasi spesifik mobil dapat mewarisi dari itu. Otak Anda bahkan meta-konsep konsep untuk Anda. Anda memiliki model mental tentang apa itu pikiran, apa konsep itu.

Jika kami mengajarkan orang untuk mengidentifikasi model yang sudah mereka hasilkan di kepala Anda, mereka akan jauh lebih siap untuk membangun perangkat lunak nyata.

mengancam
sumber
+1 Sudut pandang yang luar biasa dan luar biasa. Terima kasih telah membagikannya! Saya ingin tahu apakah Anda telah mengambilnya dari sebuah buku atau tidak? Saya pasti suka membaca buku itu.
Mahdi
8

... Dunia lebih kaya dari apa yang bisa diekspresikan dengan sintaks berorientasi objek.

Pertimbangkan beberapa konsep umum yang digunakan orang secara universal untuk memahami dan menggambarkan semua sistem - konsep yang tidak sesuai dengan cetakan objek. Paradigma 'sebelum / sesudah', juga dari 'sebab / akibat', dan gagasan tentang 'keadaan sistem' adalah di antara contoh-contoh yang paling jelas. Memang, proses 'menyeduh kopi', atau 'merakit kendaraan', atau 'mendaratkan penjelajah di Mars' tidak dapat diuraikan menjadi benda-benda sederhana. Ya, mereka diperlakukan seperti itu dalam bahasa OO, tapi itu dibuat-buat dan kontra-intuitif. Urutan dari rutinitas itu sendiri - apa yang terjadi sebelum apa dalam kondisi apa yang didasarkan pada kausalitas apa - tidak memiliki representasi yang berarti dalam OO , karena OO tidak memiliki konsep pengurutan, atau keadaan, atau sebab.

Proses sangat umum di dunia nyata dan pemrograman. Mekanisme rumit telah dirancang selama bertahun-tahun untuk menangani transaksi, alur kerja, orkestrasi, utas, protokol, dan konsep 'prosedural' lainnya yang inheren. Mekanisme-mekanisme tersebut menghasilkan kompleksitas ketika mereka mencoba untuk mengkompensasi kekurangan waktu-invarian yang tak terpisahkan dalam pemrograman OO. Alih-alih, masalahnya harus diatasi pada root dengan memungkinkan konstruksi proses-spesifik, seperti 'sebelum / sesudah', 'sebab / akibat', dan, mungkin, 'keadaan sistem' menjadi bagian inti dari bahasa ...

sumber kutipan: Victoria Livschitz, Langkah Selanjutnya dalam Pemrograman

agas
sumber
2
Perasaan aneh ketika Anda melihat kasus yang memaksa yang dibuat untuk sesuatu yang masih tidak Anda setujui. Saya mendapatkan motivasi untuk kutipan, dan akan sulit untuk mengatakannya dengan lebih baik. Saya hanya tidak tahu bahwa merupakan kesalahan untuk memodelkan masalah kita dengan cara yang sama seperti proses berpikir simbolis dan berorientasi pada hubungan kita.
mengancam
Menarik, kurasa ... tapi aku tidak pernah ingin menulis sebuah program yang membuat kopi. Masalahnya sendiri samar-samar didefinisikan. Apakah program memiliki akses ke aktuator perangkat keras, atau ini simulasi murni? Dalam kedua kasus, tampaknya pendekatan objek akan menyediakan tempat yang baik untuk memulai, baik memodelkan aktuator yang terlibat atau memodelkan keadaan internal para aktor dan alat yang terlibat.
Mark E. Haase
13
this.MoveTo(Environment.Find<Bathroom>().OrderBy(b=>b.Distance(this)).First()); this.SitOn(Environment.Find<Toilet>().Where(t=>!t.IsOccupied).OrderBy(t=>t.Distance(this)).First().Component<Seat>()); this.DiscardWaste(HumanWasteType.All);
Adam Robinson
1
Sulit dipercaya dia adalah pendukung Jawa ketika memberikan begitu banyak poin kritik terhadap paradigma OO yang terlalu sempit. Dan agak konyol dia tidak menyebutkan salah satu bahasa yang membuatnya lebih baik (kecuali "Ini peningkatan besar dibandingkan pendahulunya, C ++." ...).
leftaroundabout
1
OO tidak memiliki konsep pengurutan, atau status . Omong kosong. Tidak ada konsep pengurutan dan status dalam OOP? O
clime
5

Ya, OO sering dapat digunakan untuk memodelkan entitas dunia nyata.

Bahkan di lapisan bisnis saya, saya punya kelas seperti pengamat, manajer, pabrik, dll. Yang bukan objek dunia nyata.

Jangan bingung pengembangan berorientasi objek dengan pola desain. Analisis dan desain OO adalah cara untuk mendekati pemrograman kode yang dapat dipelihara. Digabungkan dengan bahasa OO, programmer diberi kekuatan untuk membuat kode yang dapat digunakan kembali melalui pilar OO: enkapsulasi, polimorfisme, dan pewarisan.

Untuk mengenkapsulasi suatu entitas, kita dapat memodelkan entitas tersebut setelah entitas aslinya. Misalnya, jika kita memiliki gitar maka kelas gitar merangkum perilaku dan sifat gitar dunia nyata. Kita dapat lebih jauh mengabstraksi gitar sebagai, katakanlah, IInventoryItemuntuk mengambil keuntungan dari potensi penggunaan kembali kode melalui polimorfisme dan pewarisan.

Di sisi lain, kita mungkin menemukan bahwa pabrik gitar dapat membantu kita dalam memelihara serangkaian jenis gitar yang berbeda. Ini bukan karena OO. Sebaliknya, sebuah pabrik adalah pola desain yang telah teruji oleh waktu sebagai sarana yang terbukti berhasil menciptakan kode yang dapat dikelola untuk tujuan semacam itu. Dengan kata lain, kami para programmer seringkali memecahkan masalah yang sama. Jadi kami datang dengan solusi umum untuk menyelesaikannya (jangan menemukan kembali roda).

Itu tidak berarti OO harus memodelkan dunia nyata, juga tidak selalu merupakan solusi paling optimal untuk melakukannya. Sederhananya, itu sebagai aturan praktis "OO modelling the real world" masuk akal.

P.Brian.Mackey
sumber
5

Itu tergantung pada dunia nyata yang kamu bicarakan.

Jorge Luis Borges menulis sebuah cerita "Tlön, Uqbar, Orbis Tertius", di mana salah satu penduduk tampaknya memandang dunia nyata mereka secara sangat berbeda:

[...] orang-orang Tlön imajiner [...] memiliki bentuk ekstrim idealisme Berkele, menyangkal kenyataan dunia. Dunia mereka dipahami "bukan sebagai persetujuan objek di luar angkasa, tetapi sebagai serangkaian tindakan independen yang heterogen." Salah satu bahasa imajiner Tlön tidak memiliki kata benda. Unit sentralnya adalah "kata kerja impersonal yang dikualifikasikan oleh sufiks atau awalan satu suku kata yang memiliki kekuatan kata keterangan." Borges mencantumkan Tlönic yang setara dengan "Bulan naik di atas air": hlör u fang axaxaxas mlö, yang secara harfiah berarti "Ke atas di belakang sungai yang mengalir itu melayang". [...] Dalam bahasa lain Tlön, "unit dasar bukan kata kerja, tetapi kata sifat satu suku kata," yang, dalam kombinasi dua atau lebih, membentuk kata benda: "bulan" menjadi "bundar ringan pada" gelap "atau"

(disalin dari wikipedia artice tentang buku)

Bagi saya, intinya adalah bukan bahwa dunia dapat dipersepsikan berbeda dari yang kita lakukan, yang agak klise, tetapi persepsi tentang struktur realitas itu sendiri tergantung pada bahasa yang kita gunakan, baik itu bahasa alami atau bahasa pemrograman. Tlönese mungkin sangat senang dengan Lisp, dan mungkin melihat Java (AKA The Kingdom Of Nouns ) sebagai sangat tidak wajar, sedangkan kebanyakan programmer terran cenderung lebih menyukai berorientasi objek daripada bahasa fungsional. Saya suka kedua gaya, karena saya pikir ini terutama masalah perspektif. Beberapa masalah paling baik diserang dengan fungsional, beberapa lainnya dengan teknik pemrograman berorientasi objek. Seorang programmer yang baik selalu melihat masalah yang sulit dari sudut yang berbeda, sebelum ia mencoba solusi. Atau, seperti yang dikatakan Alan Kay: Sudut pandang bernilai 80 poin IQ .

Jadi, jawaban saya untuk pertanyaan Anda adalah: Dunia nyata mana yang Anda bicarakan? Dan bagaimana?

pembuat pil
sumber
"Bahwa persepsi tentang struktur realitas itu sendiri tergantung pada bahasa yang kita pakai, baik itu bahasa alami atau bahasa pemrograman". Itu sangat benar!
iklim
4

Sementara beberapa objek yang saya buat memodelkan objek dunia nyata, tidakkah kode pra-OOP melakukan hal yang sama?

Saya akan mengatakan tidak. OOP mengikat hubungan antara hal-hal (properti / objek) dan apa yang dapat mereka lakukan / dapat dilakukan untuk mereka (metode), sedangkan pemrograman prosedural tidak melakukan ini (selain dari, pada tingkat kecil, ketika menggunakan pengetikan ketat). Sebuah model bukan hanya tentang mendefinisikan bagian-bagian dan proses-proses yang terpisah, tetapi juga menentukan bagaimana mereka cocok bersama, dan OOP sangat pandai dalam hal ini.

wheresrhys
sumber
Saya pikir maksud Anda prosedural tidak fungsional.
Winston Ewert
ya benar. Saya akan mengubahnya
wheresrhys
3

Saya sudah sering melihatnya pemrograman berorientasi objek didasarkan pada pemodelan dunia nyata, tetapi apakah itu?

Iya. Penekanan di sini didasarkan pada . OOP tidak membuat model dunia nyata (jika ya, maka secara kebetulan) dan tidak seharusnya demikian. Apa yang dilakukan OOP adalah untuk memungkinkan kita memodelkan masalah pemrograman dengan cara kita memodelkan dunia nyata: sebagai sistem entitas yang didefinisikan melalui abstraksi perilaku mereka.

back2dos
sumber
3
Ya - jadi itu tidak didasarkan pada pemodelan dunia nyata, kan?
leftaroundtentang
3

Kode OO biasanya tidak memodelkan dunia nyata - setidaknya itu bukan tujuannya, itu hanya memungkinkan Anda untuk berpikir tentang kode Anda dengan cara yang lebih alami, lebih seperti cara Anda berpikir tentang hal-hal di dunia nyata - inilah yang ingin dikatakan oleh kutipan tersebut.

Bill K
sumber
3

Itu tidak mencontoh dunia kita, tetapi memodelkan interpretasi manusia atas dunia kita. Manusia secara alami memisahkan benda sebagai benda. OO efektif karena memungkinkan manusia memprogram cara mereka berpikir.

Dokkat
sumber
2

OOP mungkin bukan model yang sempurna dari dunia nyata dan objek yang terkandung di dalamnya, tetapi ini adalah metodologi yang membantu menangani meningkatnya kompleksitas perangkat lunak kehidupan nyata. Ini juga membantu menulis kode dengan lebih baik, dengan memecahnya menjadi potongan yang terkait secara logis.

Walaupun metode berorientasi prosedur yang lebih lama pasti akan memberikan hasil juga, OOP membantu Anda mencapai sana lebih cepat dan dengan relatif mudah, bahkan ketika berhadapan dengan proyek-proyek besar & kompleks.

Abstraksi dan Enkapsulasi membantu berkonsentrasi pada inti masalah sambil menyembunyikan semua pipa ledeng yang benar-benar membuat hal-hal terjadi. Warisan dan memungkinkan Anda menjalin hubungan yang bermakna dan logis antara berbagai aspek kode Anda. Polimorfisme mempromosikan penggunaan kembali kode dan memungkinkan Anda menangani variasi dengan mudah ( kategori "perilaku yang hampir sama dengan objek yang ada" masalah yang sering terjadi) dan memperluas kode dengan memperluas semantik yang terkait dengan suatu objek.

Saya merasa OOP lebih seperti bantuan terbukti yang memungkinkan Anda menangani semua kompleksitas sistem kehidupan nyata secara efektif. Jadi, walaupun itu mungkin bukan model yang sangat teliti dari dunia nyata, itu cukup dekat dan membantu Anda menyelesaikan pekerjaan, yang IMHO adalah yang paling penting pada akhirnya.

Bhargav Bhat
sumber
2

Saya sudah sering melihatnya pemrograman berorientasi objek didasarkan pada pemodelan dunia nyata, tetapi apakah itu?

Tampaknya bagi saya itu tidak benar pada apa pun di luar lapisan bisnis.

Tidak. Seperti yang Anda tunjukkan, banyak hal yang "dimodelkan" dalam bahasa OOP adalah konsep abstrak seperti antrian pesan, pengontrol, dan tumpukan.

Bahkan di lapisan bisnis Anda, Anda masih belum memodelkan "dunia nyata". Anggaplah Anda memiliki kelas karyawan. Karyawan juga Orang, yang juga Mamalia, yang juga Binatang, yang juga ... (menguap) Karyawan memiliki warna favorit, dan mereka mengenakan pakaian tertentu dan meyakini hal-hal tertentu. Singkatnya, ada sejumlah besar kompleksitas di dunia nyata yang bahkan tidak kami coba tangkap di sebagian besar program.

Dalam pemodelan, kami hanya fokus pada aspek-aspek model yang bermakna untuk tugas yang ada. Jika kita merancang sistem entri waktu, maka kita mungkin menginginkan semacam kelas Karyawan, tetapi kelas itu tidak membutuhkan properti untuk mengekspresikan warna favorit karyawan.

Oleh karena itu, model tidak boleh berusaha (atau berpura-pura) untuk sepenuhnya mewakili "Dunia Nyata".

Sementara beberapa objek yang saya buat memodelkan objek dunia nyata, tidakkah kode pra-OOP melakukan hal yang sama? Saya ragu bahwa OO adalah orang pertama yang memasukkan konsep seperti Pelanggan dalam basis kode mereka.

Anda benar. Jika Anda melihat program besar yang bukan OOP, mereka sering masih diatur di sekitar struktur data. Struktur data dan semua fungsi yang memanipulasi didefinisikan berdekatan satu sama lain, untuk alasan kejelasan. (Proyek subversi adalah contoh yang bagus untuk ini. Struktur dan fungsi data diawali dengan nama modul sehingga jelas struktur dan fungsi mana yang dimaksudkan untuk digunakan satu sama lain.)

Saya bukan ahli dalam sejarah bahasa pemrograman, tapi saya membayangkan bahwa OOP tumbuh dari pengamatan biasa bahwa kode lebih jelas dan lebih mudah dipahami ketika diatur dengan cara ini, jadi perancang bahasa mulai merancang bahasa di mana jenis organisasi itu berada lebih ketat ditegakkan.

Perbedaan terbesar antara OOP dan non-OOP adalah bahwa OOP mengikat kode ke data. Jadi daripada memanggil kode seperti ini:

verb(noun);

kami melakukan ini sebagai gantinya:

noun->verb();

Meskipun ini mungkin tampak seperti perbedaan tata bahasa, perbedaannya sebenarnya dalam pola pikir. Kami memberi tahu objek apa yang harus dilakukan, dan biasanya tidak peduli apa keadaan internal atau cara kerja objek tersebut. Saat mendeskripsikan sebuah objek, kita hanya perlu mendeskripsikan antarmuka publiknya agar dapat bekerja dengannya.

Mark E. Haase
sumber
2

Apakah Pemrograman Berorientasi Objek Memodelkan Dunia Nyata?

Tidak sepenuhnya.

Nah di dunia nyata, kita menghadapi masalah nyata. Kami ingin menyelesaikan masalah ini menggunakan paradigma yang mereplikasi sistem yang ingin kami bangun yang menjadi modelnya.

Misalnya, jika aplikasi Keranjang Belanja adalah masalah yang ada, kami memiliki entitas yang berbeda suka

  1. Produk yang merupakan istilah abstrak yang dapat memiliki banyak anggota seperti Buku, Gadget, Mobil yang dapat dibagi lagi.

  2. Kriteria Pajak seperti (Pajak Penjualan) akan tergantung pada lokasi mana perangkat lunak diimplementasikan karena dapat berubah berdasarkan kebijakan pemerintah.

  3. Pajak dipertimbangkan berdasarkan apakah produk itu diimpor bersama dengan kriteria pajak.

  4. Pengguna dapat memiliki keranjang belanja yang memiliki daftar produk dll.

Jadi seperti yang Anda lihat, ada masalah nyata yang kami coba selesaikan tetapi dimodulasi dengan paradigma OOP untuk membuatnya sedekat mungkin dengan sistem nyata.

Karthik Sreenivasan
sumber
1
Saya suka jawaban ini. OO harus memodelkan domain masalah Anda, jadi sementara ada banyak konsep dunia nyata beberapa dari mereka tidak akan berhubungan dengan masalah yang Anda coba selesaikan, dan Anda akan memiliki konstruksi OO yang tidak memetakan dengan tepat kembali ke sesuatu di dunia nyata, tetapi memenuhi kebutuhan dalam domain masalah.
Andy
2

Saya pikir Anda terlalu banyak membaca apa yang dimaksudkan untuk menjadi pernyataan yang sangat membosankan, historis,. Banyak ide pemrograman OO, kelas, polimorpisme, fungsi virtual, dll. Diperkenalkan dalam bahasa Simula, di tahun 1960-an (http://en.wikipedia.org/wiki/Simula). Seperti namanya, Simula dirancang untuk menjadi bahasa untuk menulis simulasi. Jadi secara historis, ya, ide-ide OO diperkenalkan dalam upaya untuk memodelkan "dunia nyata". Apakah mereka berhasil lebih dari gaya lain adalah masalah perdebatan.

Charles E. Grant
sumber
2

Sementara beberapa objek yang saya buat memodelkan objek dunia nyata, tidakkah kode pra-OOP melakukan hal yang sama?

Perbedaan terbesar antara kode OOP dan kode pra-OOP adalah bahwa model sebelumnya adalah situasi dunia nyata sebagai kelompok entitas yang berbeda berinteraksi satu sama lain, masing-masing dengan "kekuatan" terbatas mengenai apa yang dapat dilakukan, dan juga mampu "bereaksi" terhadap peristiwa eksternal dengan tindakannya sendiri. Yang terakhir memodelkan semuanya sebagai sebagian besar data yang tidak melakukan apa-apa sendiri, sedangkan perhitungannya mewakili "hal-hal yang terjadi" dan dapat mempengaruhi salah satu atau semuanya.

Apakah itu lebih baik memodelkan dunia nyata atau tidak, itu benar-benar tergantung pada segi dunia mana yang Anda modelkan. Sebuah simulasi fisika, misalnya, di mana Anda ingin menggambarkan efek yang, katakanlah, api yang sedang menyala akan ada di objek sekitarnya, akan lebih baik diwakili oleh pendekatan "tradisional", karena baik cahaya maupun panasnya baik-baik saja. proses yang didefinisikan yang mempengaruhi keadaan eksternal dan internal dari objek lain, dan tidak bervariasi sesuai dengan perilaku masing-masing objek tertentu, hanya dipengaruhi oleh sifat-sifatnya.

Di sisi lain, jika Anda memodelkan komponen berbeda yang berinteraksi untuk menghasilkan perilaku yang diinginkan, memperlakukan mereka sebagai agen alih-alih hal-hal pasif dapat membuatnya lebih mudah untuk melakukannya dengan benar tanpa kehilangan apa pun. Jika saya ingin menyalakan TV saya, saya hanya menekan tombol, jika kabel listrik dicabut TV.turnOnakan memeriksa untuk saya. Jadi, tidak ada risiko memutar roda gigi dan lupa untuk memutar roda gigi lain yang menyentuhnya, karena roda gigi itu sendiri (jika diprogram dengan benar) akan menjaga interaksi sekunder yang terjadi sebagai konsekuensi dari yang utama.

Tapi OO benar-benar tentang bagaimana memodelkan sesuatu, dan metode pemodelan itu tampaknya tidak terinspirasi oleh dunia nyata bagi saya.

Saya percaya ini lebih berkaitan dengan cara kita memandang dunia daripada bagaimana dunia sebenarnya. Orang dapat berargumen bahwa semuanya hanya sekelompok atom (atau energi, atau gelombang, apa pun), tetapi itu tidak membantu kita menangani tugas mengatasi masalah yang kita hadapi, dengan memahami lingkungan di sekitar kita dan memprediksi peristiwa di masa depan ( atau menggambarkan yang sebelumnya). Jadi kita membuat "model mental" dunia, dan seringkali model mental itu menemukan korespondensi yang lebih baik dengan OO daripada data + memproses satu - yang bisa dibilang memodelkan "lebih baik" bagaimana dunia nyata benar-benar beroperasi.

Menarik juga untuk dicatat bahwa kebanyakan orang menganggap OOP sebagai sinonim dengan "OOP klasik", di mana kami secara taksonomis membuat set dan himpunan bagian dari hal-hal, dan secara jelas menempatkan objek dalam set yang sangat spesifik. Itu sangat berguna untuk membuat tipe baru yang dapat digunakan kembali , tetapi tidak begitu bagus ketika entitas yang Anda modelkan cukup mandiri, dan sementara itu memulai interaksi dengan objek lain, jarang, jika pernah, adalah target interaksi. Atau lebih buruk, ketika ada sedikit (mungkin hanya satu) instance dari entiy itu, atau instans sangat bervariasi dalam komposisi, perilaku atau keduanya.

Namun, ada juga "prototipe OOP", di mana objek dijelaskan dengan memilih yang serupa dan menyebutkan aspek-aspek di mana mereka berbeda. Saya menyarankan esai ini untuk penjelasan yang baik dan tidak terlalu teknis dari proses pemikiran (seluruh pos terlalu besar, bahkan untuk standar Steve Yegge, jadi saya menunjuk ke bagian yang relevan: P). Sekali lagi, ini adalah pasangan yang cocok untuk model mental kita ketika membayangkan contoh yang tidak diketahui dengan membandingkannya dengan yang diketahui, tetapi tidak harus untuk bagaimana dunia nyata "bekerja" ... (dua ekor sapi benar-benar sepenuhnya entitas entitas, bahkan jika kita melihatnya sebagai "sama" dalam banyak hal)

mgibsonbr
sumber
1

Saya pikir "Apakah" adalah bagian penting dari pertanyaan ini. Saya pikir pemrograman Berorientasi Objek tentu bisa memodelkan "objek" dunia nyata, tapi ini pemrograman . Tidak ada metodologi yang tidak dapat disalahgunakan, jadi saya tidak berpikir itu adil untuk mengatakan "OOP tidak membuat model dunia nyata" hanya karena Anda dapat melakukan hal-hal bodoh dengan Objects. Itu tidak adil daripada mengatakan bahwa Pointer tidak aman karena Anda dapat melakukan hal-hal bodoh dengan pointer.

Artikel Wikipedia tentang masalah ini merangkumnya dengan baik:

Pemodelan dan hubungan dunia nyata
OOP dapat digunakan untuk mengaitkan objek dan proses di dunia nyata dengan mitra digital. Namun, tidak semua orang setuju bahwa OOP memfasilitasi pemetaan dunia nyata langsung (lihat bagian Kritik Negatif) atau bahwa pemetaan dunia nyata bahkan merupakan tujuan yang layak; Bertrand Meyer berpendapat dalam Object-Oriented Software Construction [21] bahwa program bukan model dunia tetapi model beberapa bagian dunia; "Realitas adalah sepupu dua kali dihapus".

Masalahnya adalah kecuali jika program Anda adalah simulasi alam semesta, Anda hanya peduli pada bagian dari dunia nyata - maka "model". Untuk itulah model dibuat, mereka memberi Anda struktur dan fungsionalitas yang perlu Anda tampilkan.

Di dunia nyata kita memiliki hal-hal (Objek) dan hal-hal dapat melakukan tindakan (metode). Kita dapat mengukur aspek-aspek hal (Properti). OOP memiliki setiap potensi untuk memodelkan hal-hal dunia nyata ketika digunakan dengan cara reduksionis; setiap hal yang kompleks memiliki subkelas yang lebih kecil atau lebih spesifik dan semua hal ini memiliki interaksi alami melalui metode.

OOP adalah metode abstraksi, sehingga hal praktis adalah apakah OOP benar-benar logis model objek di Dunia Nyata, itu kurang penting bahwa Anda tidak pemodelan setiap satu kemungkinan hal segala sesuatu yang bisa lakukan . Jika Anda perlu melakukan setiap hal yang mungkin, Anda tidak benar-benar menjadi model .

Ben Brocka
sumber
1

Untuk berpikir tentang orientasi objek dalam konteks yang tepat, mari kita naik satu tingkat abstraksi dan berbicara tentang pemrograman secara umum, oke?

Terlepas dari apakah Anda mengambil OO atau pendekatan fungsional, program Anda harus melakukan sesuatu, bukan? Inti dari program ini adalah untuk menunjukkan perilaku tertentu yang diberikan serangkaian rangsangan tertentu. Jadi alasan mengapa program itu ada adalah karena mereka melakukan sesuatu. Kata kuncinya di sini adalah perilaku .

Selain mempertimbangkan perilaku apa yang harus diterapkan oleh suatu program, program Anda umumnya perlu menunjukkan kualitas tertentu. Misalnya, tidak cukup bagi program pemantau jantung untuk memiliki perilaku yang diperlukan - biasanya juga perlu berkinerja cukup cepat untuk beroperasi dalam waktu yang hampir bersamaan. "Kualitas" lain yang mungkin perlu ditunjukkan oleh suatu program adalah: keamanan, fleksibilitas, modularitas, ekstensibilitas, keterbacaan, dan sebagainya. Kami menyebutnya Atribut Kualitas Arsitektur ini . Jadi kita dapat mengatakan bahwa program kita perlu memenuhi tujuan perilaku (fungsional) tertentu serta menunjukkan kualitas tertentu (non-fungsional).

Sejauh ini, tidak ada yang berbicara tentang OO, bukan? Ayo lakukan sekarang.

Setelah seorang insinyur memahami persyaratan (perilaku, AQA, kendala, dll), muncul pertanyaan: bagaimana saya harus mengatur kode saya sehingga melakukan semua hal yang perlu dilakukan sementara juga menunjukkan kualitas yang diperlukan untuk menjadi program yang bermanfaat? Pemrograman berorientasi objek adalah strategi untuk mengatur fungsionalitas program Anda ke dalam modul kohesif objek kerja sama. Pemrograman fungsional hanyalah strategi lain untuk mengatur fungsionalitas program Anda, dan melakukannya dengan cara yang berbeda. Kedua strategi memiliki kekuatan dan kelemahan mereka.

Kami telah menyaksikan kebangkitan baru-baru ini dalam konsep-konsep fungsional karena memiliki kekuatan yang sangat menarik untuk pemrosesan yang sangat didistribusikan, di antara alasan-alasan lainnya.

Tetapi kembali ke OO, Anda dapat melihat sekarang bahwa itu tidak harus memodelkan "dunia nyata"; apa yang dilakukannya adalah mengatur perilaku program Anda sehingga program Anda dapat menunjukkan kualitas yang diperlukan untuk memenuhi sejumlah tujuan bisnis. Teknik seperti TDD, DDD, dan BDD adalah cara kami menemukan cara terbaik untuk mengatur objek kami. Buku-buku seperti Prinsip, Pola, dan Praktek , Tumbuh Perangkat Lunak Berorientasi Objek Dipandu oleh Tes , Spesifikasi dengan Contoh , dan Desain Berbasis Domain menjabarkan teori dan praktik orientasi objek dengan fokus pada desain yang didorong perilaku.

Ketika Anda membaca tentang hal-hal seperti "pengamat, manajer, pabrik, dll", Anda menerapkan pola OO yang membantu program Anda menunjukkan kualitas tertentu yang mungkin diperlukan agar berguna. Mereka adalah "penerima terbukti" yang "cenderung bekerja", mengingat bahwa kebutuhan Anda cocok dengan masalah yang dipecahkan oleh pola tersebut.

Saya harap ini membantu Anda memahami tentang OO tanpa terlihat terlalu bias antara OO dan paradigma fungsional.

John Ruiz
sumber
1

OOP menciptakan model yang bagus dari sudut pandang pemrograman, tidak mencerminkan dunia nyata.

Namun, ada perkiraan yang jauh lebih baik dari dunia nyata, yang dikenal dengan istilah bahasa spesifik domain ( DSL ). Misalnya Boo memberi Anda kemampuan untuk menulis kode yang dapat dibaca manusia dalam bahasa Inggris yang hampir polos (sampel dari artikel ).

apply_discount_of 5.percent:
         when order.Total > 1000 and customer.IsPreferred
         when order.Total > 10000

suggest_registered_to_preferred:
         when order.Total  > 100 and not customer.IsPreferred

Contoh lain adalah kerangka pengujian penerimaan pengguna otomatis berdasarkan bahasa Gherkin .

Feature: Some terse yet descriptive text of what is desired
    In order to realize a named business value
    As an explicit system actor
    I want to gain some beneficial outcome which furthers the goal

Scenario: Some determinable business situation
    Given some precondition
        And some other precondition
    When some action by the actor
        And some other action
        And yet another action
    Then some testable outcome is achieved
        And something else we can check happens too
oleksii
sumber
0

Terserah Anda, akhirnya. Tetapi OOP adalah cara yang tepat untuk melakukannya daripada metodologi lain seperti pemrograman Terstruktur atau berorientasi prosedur. Kebijakan prosedural mungkin bisa menyelesaikan masalah Anda, tetapi dengan mengikuti OOP dapat membuat hidup Anda lebih mudah.

Vishal
sumber