Home >Java >javaTutorial >After all, what is the definition of Object Orientation?
The object orientation paradigm is certainly one of the most relevant topics in programming, being found in several of the industry's best practices such as SOLID, GoF Design Patterns, or Object Calhistenics, and even in extremely popular languages such as Java, C# , Ruby, PHP, JavaScript, etc. And given such relevance, it is also the subject of several debates both in online discussions and even in academia itself.
One of the main controversies surrounding the paradigm would be: what would object orientation actually be? Since no one agrees on what it means, this is the crux of the issue in various types of internet fights, such as when someone claims that their language is truly object-oriented while others are not, or that certain language is not really object-oriented, etc.
Which may seem silly at first glance, but there is a hidden problem behind this, which is the fact that there really is no formal definition for what object orientation would be. Therefore, when criticizing something related to the paradigm we cannot really be sure whether it is fair or not due to the fact that no one knows what the truth is actually about, as this will only lead to a debate where both parties can accusing the other of attacking a straw man since they do not agree with the definition of what they are debating, which leads them to talk about different things while thinking about talking about the same thing.
This happens because it does not arise from a formal basis that can be identified as the primary source of discussions such as the structured/procedural paradigm - which arises from the Boehm-Jacopini theorem and the article Go-to statement considered harmful - or from the functional which is born from lambda calculus, on the contrary, technically, it has two different origins, which makes things very difficult, after all, it is difficult to even say which was the first object-oriented language, whether it was Simula or Smalltalk.
If you have no prior contact with the topic, you may find everything I'm describing here a little strange, after all, we all learn about object orientation, we use words to communicate daily, and everything seems to go on normally , no noise in communication, right?
You may even be thinking that it is very easy since even if we look at different sources such as a generic tutorial on the internet, Wikipedia, or even if we go through formal education (such as a technical course or college), we will find very similar definitions to something I call: the 4 pillars of object orientation:
But this actually only tells part of the story, because as I pointed out earlier, there are actually two different schools of object-oriented thinking, one that grew out of the tradition created in Simula, and developed and popularized by C++, and another that grew in the tradition created by Smalltalk.
Even if we can accept the winning side of history in the tradition of C++ (since the vast majority of languages considered OO currently follow its ideas more than those of Smalltalk), that is, the legacy of Simula that evolved in the 4 pillars, there is no consensus on whether they are exactly these 4 or whether they really should be 4. For example:
In this way, just as Bjarne Stroustrup (creator of C++) argues in his definition of object orientation:
Any definition of "object orientation" should be historically acceptable. Words are only useful for communication, they only mean something if we agree on a meaning for them.
~ Bjarne Stroustrup, adapted from English in free translation
That's why I would like to adopt a holistic approach (analyzing the whole instead of the sound of the parts) to analyze what should be considered for my definition. In this I will evaluate according to 4 criteria in order of importance:
Let's start by defining our starting point in history, first we will decide which side we will choose as the primary source, and then follow with the intentions of what object orientation should mean by its authors as the basis for our definition, in addition to use it as a comparison parameter to judge which set of principles makes sense to be included within it.
Mengenai soalan ini, saya suka pandangan bahawa Alan Kay mencipta "orientasi objek" tetapi bukan "objek", jadi asas kita ialah pandangannya tentang orientasi objek yang sepatutnya, yang boleh kita rumuskan dalam beberapa petikan:
Sekadar peringatan yang lembut bahawa saya telah bekerja keras pada OOPSLA lepas untuk mencuba dan mengingatkan semua orang bahawa Smalltalk bukan sahaja sintaks atau perpustakaan kelasnya, dan juga bukan tentang kelas. Saya menyesal telah mencipta istilah "objek" lama dahulu untuk topik ini kerana ia menyebabkan ramai orang menumpukan pada idea yang lebih kecil.
Idea besarnya ialah "mesej" - itulah inti dari Smalltalk/Squeak...
~ Alan Kay, diadaptasi daripada bahasa Inggeris dalam terjemahan percuma
Saya memikirkan objek seperti sel biologi dan/atau komputer individu pada rangkaian, yang hanya mampu berkomunikasi melalui mesej (jadi mesej datang awal - mengambil sedikit masa untuk melihat cara menghantar mesej dalam bahasa pengaturcaraan dengan cukup cekap untuk menjadi berguna).
Saya mahu membuang data. B5000 hampir melakukan ini melalui seni bina HW yang hampir sukar dipercayai. Saya menyedari bahawa seluruh metafora sel/komputer akan menghapuskan data, dan bahawa "<-" hanyalah satu lagi tanda mesej (saya mengambil sedikit masa untuk memikirkan perkara ini kerana saya sebenarnya menganggap semua simbol ini sebagai nama untuk fungsi dan prosedur .
Latar belakang saya dalam matematik menyedarkan saya bahawa setiap objek boleh mempunyai beberapa algebra yang dikaitkan dengannya, dan mungkin terdapat keluarga ini, dan ini akan sangat berguna. Istilah "polimorfisme" telah dikenakan lebih lama kemudian (saya fikir oleh Peter Wegner) dan tidak begitu sah, kerana ia sebenarnya berasal dari tatanama fungsi, dan saya mahukan lebih sedikit daripada fungsi. Saya mencipta istilah "genericity" untuk menangani gelagat generik dalam cara yang hampir algebra.
Saya tidak suka cara Simula I atau Simula 67 melakukan pewarisan (walaupun saya fikir Nygaard dan Dahl hanyalah pemikir dan pereka yang hebat). Jadi saya memutuskan untuk meninggalkan warisan sebagai ciri terbina dalam sehingga saya memahaminya dengan lebih baik.
~ Alan Kay, diadaptasi daripada bahasa Inggeris dalam terjemahan percuma
POO bagi saya hanya bermaksud pertukaran mesej, pengekalan data setempat dan perlindungan serta penyembunyian negeri, dan pengikatan lewat yang melampau dalam semua perkara.
~ Alan Kay, diadaptasi daripada bahasa Inggeris dalam terjemahan percuma
Dengan ini kita boleh membuat kesimpulan bahawa perspektif dari mana kita melihat program berorientasikan objek menggunakan takrifan Kay adalah seperti berikut:
Sesuatu program dilihat sebagai rangkaian objek yang berkomunikasi melalui pertukaran mesej, di mana tujuannya adalah untuk memprogram dengan mengelakkan data, memfokuskan pada interaksi, supaya mesej boleh membawa beberapa makna.
Bercakap tentang perspektif, ini adalah bahagian yang digunakan oleh pencipta Simula dalam buku mereka Pengaturcaraan Berorientasikan Objek dalam Bahasa Pengaturcaraan BETA untuk menerangkan rangka kerja konsep kerangka, iaitu penerangan tentang bagaimana kita melihat struktur program yang ditulis dalam paradigma tertentu, contohnya dalam kes pengaturcaraan prosedural, mereka menerangkannya sebagai:
Pelaksanaan program dianggap sebagai urutan panggilan prosedur (separa tertib) yang memanipulasi pembolehubah.
~ Nygaard sama sekali, diadaptasi daripada bahasa Inggeris dalam terjemahan percuma
Dalam kes berfungsi:
Sesuatu atur cara dianggap sebagai fungsi matematik, yang menerangkan hubungan antara input dan output.
~ Nygaard sama sekali, diadaptasi daripada bahasa Inggeris dalam terjemahan percuma
Dan untuk orientasi objek:
Pelaksanaan program dianggap sebagai model fizikal, meniru gelagat bahagian sebenar atau khayalan dunia.
~ Nygaard sama sekali, diadaptasi daripada bahasa Inggeris dalam terjemahan percuma
Jadi, walaupun tumpuan kami adalah pada definisi Alan Kay, memandangkan sumbangan hebat Krysten Nygaard dan Ole-Johan Dahl (pencipta Simula) berkenaan kefungsian yang terdapat dalam bahasa berorientasikan objek, dan sejauh mana perspektifnya telah meningkat. masa, memandangkan hampir setiap tutorial moden masih mengikuti cerita ini yang objek mewakili konsep dunia sebenar, walaupun diformalkan sebagai sebahagian daripada definisi abstraksi, saya akan mengatakan adalah sesuai untuk memasukkan pandangannya ke dalam definisi akhir kami
Jadi, apabila hujah boleh dibuat untuk mendamaikan kedua-dua tradisi menjadi satu definisi yang bersatu, dengan itu menghormati pendekatan kami terhadap analisis holistik, saya akan cuba.Oleh itu, kerana ia tidak semestinya eksklusif untuk definisi semasa kami, kami boleh meningkatkannya dengan yang berikut:
Sesuatu program dilihat sebagai rangkaian objek, ini merupakan perwakilan konsep domain, berkomunikasi melalui pertukaran mesej, di mana tujuannya adalah untuk memprogramkan mengelakkan data, memfokuskan pada interaksi, supaya mesej boleh membawa beberapa makna. Struktur amnya adalah sesuatu yang serupa dengan simulasi kelakuan bahagian sebenar atau khayalan dunia.
Satu pertimbangan yang boleh dibuat ialah ini mungkin mengarahkan orang ramai untuk menumpukan perhatian kepada "idea yang lebih kecil", tetapi seperti yang kita akui sebelum ini adalah perlu untuk mengenali bagaimana idea berkembang dari semasa ke semasa sebagai perkataan hanya mempunyai nilai jika orang memahaminya apa yang ingin disampaikan, oleh itu saya percaya bahawa perspektif ini mendapati keseimbangan yang cukup antara mengekalkan objektif awal Alan Kay dan menggabungkan nilai sistem objek Nygaard dan Dahl.
Dengan teks definisi semasa, saya sudah boleh berpuas hati, ini merupakan jawapan saya kepada soalan yang dibentangkan dalam artikel ini, tetapi saya percaya bahawa definisi lengkap paradigma harus merangkumi kedua-dua "perspektif"nya tentang perkara yang diwakilinya pelaksanaan program, serta set prinsip yang berkaitan dengannya.
Oleh itu, kita boleh katakan bahawa kita sudah separuh jalan ke sana, dan kini kita boleh kembali ke senarai definisi yang luas yang saya berikan sebelum ini untuk mencari prinsip yang sesuai dengan perspektif kita sambil tidak mengkhianati visi asas kita ( fokus pada pertukaran mesej) .
Untuk ini, sekali lagi, mari kembali ke sumber utama kami, prinsip OO Smalltalk:
Jika kita menggunakan kriteria perkaitan sejarah sekali lagi, boleh dikatakan bahawa kerana istilah ini tidak lagi digunakan hari ini (dengan pengecualian pertukaran mesej), kita harus mempertimbangkan untuk menggunakan 4 tiang itu, dan sekali lagi, saya percaya bahawa menggunakan pendekatan berdamai di sini akan menjadi yang terbaik dari kedua-dua dunia tanpa percanggahan:
Terdapat penjelasan untuk memilih 5 prinsip ini:
Pertukaran mesej adalah sesuatu yang tidak boleh dirundingkan dalam konteks asal OO, selepas semua Alan Kay mendakwa sebagai idea besar paradigma, konsep yang paling penting, itulah sebabnya semua konsep lain mesti mempunyai sesuatu untuk lakukan dengannya.
Penggunaannya dalam amalan agak besar, kerana bahasa yang mempunyai kaitan sejarah seperti Self, Objective-C, dan Ruby mengekalkan hubungan yang kuat dengan konsep ini, dan Ruby sendiri dianggap sebagai bahasa arus perdana pada masa kini, dengan aplikasi hebat dibina padanya seperti github sendiri, selain mempunyai komuniti yang sangat aktif.
Dan saya akan mengatakan bahawa bersama-sama dengan warisan dan enkapsulasi, ia adalah salah satu konsep yang paling membawa identiti OO, kerana dua contoh lain (lawak bertujuan) di mana istilah itu digunakan adalah dalam Model Pelakon, yang ialah logik formal model matematik yang pada asasnya mempunyai idea yang hampir sama seperti Alan Kay, tetapi berdasarkan sepenuhnya pada konkurensi (sesuatu seperti OO adalah 100% tidak segerak untuk anda fahami oleh JS devs).
Ini adalah konsep yang memenuhi semua kriteria analisis kami, kerana, seperti yang dinyatakan oleh Nygaard dan Dahl, ia hadir dalam hampir semua bahasa yang melaksanakan paradigma, walaupun secara tersirat (jika ia menyokong warisan , sokongan untuk polimorfisme juga disokong secara tersirat).
Ia juga sangat sejajar dengan idea bertukar-tukar mesej, kerana ia merupakan faedah semula jadi daripada penggunaannya. Selain itu, ia terdapat dalam definisi Alan Kay (walaupun dia mengatakan dia lebih suka istilah generik) lagipun pengikatan lewat ialah nama proses yang terdapat dalam bahasa
pengaturcaraan yang membolehkan mereka tidak mengaitkan panggilan kepada fungsi dengan kod tertentu, tetapi melaksanakannya berdasarkan konteks (yang dalam kes OO ialah objek yang menerima mesej), yang merupakan definisi polimorfisme. .
Dari segi persepsi awam, ia akan menjadi konsep yang paling penting daripada 5 yang disenaraikan, malah ditakrifkan sebagai intipati OO oleh Uncle Bob, lebih-lebih lagi, walaupun dalam situasi di mana seseorang tidak merancang untuk memprogramkan dengan tepat dalam orientasi objek, ini dianggap prinsip sebagai blok asas untuk pembinaan beberapa idea seperti seni bina heksagon atau seni bina bersih.
Walau bagaimanapun, konsep ini bukan unik untuk OO, kerana konsep yang lebih umum terdapat dalam beberapa paradigma, selalunya dengan pelaksanaan pelbagai jenis dalam bahasa yang sama. Walaupun begitu, boleh dikatakan bahawa polimorfisme subjenis secara khusus adalah unik kepada OO, kerana ia adalah jenis yang bergantung pada keupayaan bahasa untuk melaksanakan pewarisan.
Jika anda telah membaca artikel kami tentang subjek tersebut (ya, kami suka bercakap tentang definisi di sekitar sini), anda akan tahu bahawa mengatakan "Pengekalan data tempatan, bersama-sama dengan perlindungan negeri dan penyembunyian" pada asasnya adalah takrifan lengkap bagi enkapsulasi , jadi bahagian penjajaran konsep, seperti yang sebelumnya, adalah 100% pada prinsip ini di sini.
Walaupun beberapa bahasa tidak menyebut enkapsulasi sebagai prinsip, konsep itu ada di dalamnya walaupun separuh, hakikat mempunyai objek (atau seperti dalam kes Java dan Diri, menekankan konsep medan dalam objek) menunjukkan bahawa mereka mempunyai mekanisme untuk memastikan data hanya dikendalikan dalam konteks tempatan bersama-sama dengan fungsinya (objek itu sendiri), sebaliknya, bahasa seperti C++ dan Eiffel menyediakan mekanisme untuk melindungi dan menyembunyikan keadaan dalam bentuk pengubah suai akses (C++) atau penegasan, prasyarat, pascasyarat dan invarian (Eiffel). Di Jawa, kami juga mempunyai salah satu artikel paling terkenal tentang orientasi objek yang membincangkan dengan tepat aplikasi enkapsulasi: Mengapa getter dan setter adalah jahat.
Jadi, saya akan mengatakan bahawa ia adalah prinsip yang telah matang dengan baik dalam ujian masa, walaupun ia masih boleh mengalami kritikan yang sama seperti polimorfisme kerana ia bukan konsep yang dikaitkan secara eksklusif dengan OO, kerana ia adalah mungkin untuk merealisasikannya dengan modul (yang akan serupa dengan mempunyai objek tunggal), atau penutupan, kerana ia boleh bertindak sebagai objek lelaki miskin, bagaimanapun, sama seperti dalam kes polimorfisme, konsep itu digunakan "dengan rasa yang unik" dalam OO , memandangkan mekanisme pengekalan data setempat ialah objek, dan penyembunyian maklumat berlaku melalui pengubah suai akses, fungsi yang dikaitkan secara meluas dengan paradigma.
Ia tidak kelihatan seperti 4 tiang yang lain, namun, sama seperti enkapsulasi, kehadirannya masih dapat dirasai secara tersirat dan bukannya secara eksplisit, kerana, kecuali Diri, semua bahasa yang disebut mempunyai mekanisme abstraksi data dalam bentuk kelas.
Melangkah ke dalam isu Diri, dia memberi penekanan yang besar pada objek itu sendiri dan pada pertukaran mesej, yang boleh kita manfaatkan untuk menganalisis isu penjajaran konsep, yang dalam kes ini, saya akan mengatakan bahawa pengaturcaraan dengan pertukaran mesej, dalam kata-kata yang lebih moden (walaupun konsepnya tidak betul-betul sama) akan sama dengan "pengaturcaraan untuk antara muka", iaitu, pengaturcaraan hanya dengan abstraksi, tanpa perlu risau tentang pelaksanaan akhir sebenarnya. jadilah, kaedah yang sangat baik diterangkan dalam buku Smalltalk melalui Contoh: Panduan Pembangun, oleh Alec Sharp, sebagai "cara berorientasikan objek untuk memprogramkan".
Idea abstraksi bersama dengan polimorfisme yang membolehkan setiap metafora pertukaran mesej berfungsi, kerana ideanya ialah tidak ada cara untuk mengetahui hasil pelaksanaan kod hanya dengan melihat mesej, selepas semuanya adalah abstraksi (dalam erti kata yang sama bahawa anda tidak dapat mengetahui bagaimana perkara akan dilaksanakan apabila membaca kaedah antara muka dalam OO moden), dan hasilnya bergantung pada pelaksanaan konkrit mereka yang terdapat dalam objek itu sendiri, jadi pelaksanaan mungkin berbeza-beza bergantung pada objek yang bertindak balas kepada mesej itu.
Dari semua prinsip, saya akan mengatakan bahawa abstraksi adalah yang paling lemah dalam kriteria eksklusif, kerana abstraksi data adalah prinsip umum, di atas konsep paradigma seperti yang dinyatakan oleh Peter Van Roy dalam artikelnya Programming Paradigms for Dummies, Walaupun ini , sekali lagi, kita berada dalam situasi yang sama dengan prinsip lain di mana ia menggunakan mekanisme yang sangat berciri dalam bentuk kelas, yang diiktiraf secara meluas sebagai fungsi OO, begitu diiktiraf sehingga ramai orang berfikir bahawa paradigma itu terhad kepada pengaturcaraan dengan kelas (malah melupakan objek, dan lebih teruk lagi, mesej dalam proses).
Dia berada di sini atas sebab yang bertentangan untuk bertukar-tukar mesej, jika pertukaran mesej mempunyai skor persepsi awam yang rendah, tetapi yang tertinggi dalam penjajaran konseptual, warisan mempunyai penjajaran konsep yang paling rendah bagi konsep yang dipilih (yang boleh disahkan dengan petikan bahawa Alan Kay hanya menambah warisan kepada Smalltalk kerana dia tidak benar-benar tahu untuk apa ia akan digunakan, tetapi fikir ia mungkin berguna), tetapi ia mempunyai persepsi awam yang paling hebat, di samping sumbangan sejarah yang sangat tinggi.
Sebagai permulaan, ia adalah salah satu ciri utama Simula, ia dianggap sebagai intipati OO, dalam era pasca-Smalltalk, walaupun ini telah diterbalikkan sepenuhnya selepas idea gubahan dan bukannya warisan diterbitkan oleh GoF.
Walaupun begitu, ia adalah satu-satunya konsep yang dikaitkan secara eksklusif dengan OO, sebagai fungsi yang kehadirannya cukup untuk membezakan bahasa sebagai berorientasikan objek dalam banyak kes. Satu-satunya hujah yang boleh bertentangan dengan ini ialah idea Hoare tentang rekod, tetapi itulah yang menimbulkan warisan dalam Simula, dan jenis produk, tetapi ini adalah subjek yang sangat berbeza daripada warisan, dan tidak juga jika anda mengalami masalah dan kontroversi yang sama.
Akhirnya kami mempunyai kedua-dua perspektif dan prinsip, jadi definisi akhir kami ialah:
Program berorientasikan objek dilihat sebagai rangkaian objek, ini merupakan perwakilan konsep domain, berkomunikasi melalui pertukaran mesej, di mana tujuannya adalah untuk memprogramkan mengelakkan data, memfokuskan pada interaksi, supaya mesej boleh membawa beberapa makna. Prinsip-prinsipnya ialah pertukaran mesej, polimorfisme, enkapsulasi, abstraksi, dan pewarisan. Mempunyai struktur umum sesuatu yang serupa dengan simulasi kelakuan bahagian sebenar atau khayalan dunia.
Apa pun, ini adalah jawapan terakhir saya kepada soalan yang dibentangkan dalam tajuk artikel, keseluruhan penyelidikan ini mengambil banyak usaha, jadi saya harap teks itu sekurang-kurangnya telah mengajar anda sesuatu yang baru, atau membawa kepada beberapa refleksi.
Jika anda bersetuju atau tidak bersetuju dengan definisi saya, jangan lupa untuk berkongsi pendapat anda dalam komen, dan jumpa lagi pada masa akan datang!
Pantai: Sokongan Letih
The above is the detailed content of After all, what is the definition of Object Orientation?. For more information, please follow other related articles on the PHP Chinese website!