Rumah  >  Artikel  >  Java  >  Lagipun, apakah definisi Orientasi Objek?

Lagipun, apakah definisi Orientasi Objek?

王林
王林asal
2024-09-06 06:46:01674semak imbas

Afinal de contas, qual a definição de Orientação a Objetos?

pengenalan

Paradigma orientasi objek sememangnya salah satu topik yang paling relevan dalam pengaturcaraan, ditemui dalam beberapa amalan terbaik industri seperti SOLID, Corak Reka Bentuk GoF atau Object Calhistenics, malah dalam bahasa yang sangat popular seperti Java , C# , Ruby, PHP, JavaScript, dsb. Dan memandangkan perkaitan sedemikian, ia juga menjadi subjek beberapa perdebatan dalam perbincangan dalam talian dan juga dalam akademik itu sendiri.

Salah satu kontroversi utama yang menyelubungi paradigma itu ialah: apakah sebenarnya orientasi objek? Memandangkan tiada siapa yang bersetuju dengan maksudnya, inilah pokok isu dalam pelbagai jenis pergaduhan internet, seperti apabila seseorang mendakwa bahawa bahasa mereka benar-benar berorientasikan objek manakala yang lain tidak, atau bahasa tertentu tidak benar-benar objek- berorientasikan, dsb.

Yang mungkin kelihatan bodoh pada pandangan pertama, tetapi terdapat masalah tersembunyi di sebalik ini, iaitu hakikat bahawa sebenarnya tidak ada definisi formal untuk orientasi objek. Oleh itu, apabila mengkritik sesuatu yang berkaitan dengan paradigma kita tidak dapat benar-benar pasti sama ada ia adil atau tidak kerana hakikat bahawa tiada siapa yang tahu tentang kebenaran sebenarnya, kerana ini hanya akan membawa kepada perdebatan di mana kedua-dua pihak boleh menuduh yang lain. menyerang seorang lelaki jerami kerana mereka tidak bersetuju dengan definisi perkara yang mereka perdebatkan, yang menyebabkan mereka bercakap tentang perkara yang berbeza sambil berfikir tentang perkara yang sama.

Ini berlaku kerana ia tidak timbul daripada asas formal yang boleh dikenal pasti sebagai sumber utama perbincangan seperti paradigma berstruktur/prosedur - yang timbul daripada teorem Boehm-Jacopini dan artikel Go-to statement yang dianggap berbahaya - atau daripada fungsi yang lahir daripada kalkulus lambda, sebaliknya, secara teknikal, ia mempunyai dua asal usul yang berbeza, yang menjadikan sesuatu sangat sukar, lagipun, sukar untuk mengatakan yang mana bahasa berorientasikan objek pertama, sama ada ia Simula atau Smalltalk.

Jika anda tidak mempunyai hubungan terlebih dahulu dengan topik tersebut, anda mungkin mendapati semua yang saya huraikan di sini agak pelik, lagipun, kita semua belajar tentang orientasi objek, kita menggunakan perkataan untuk berkomunikasi setiap hari, dan segala-galanya nampaknya berjalan seperti biasa , tanpa bising dalam komunikasi kan?

Anda mungkin berfikir bahawa ia sangat mudah kerana walaupun kita melihat sumber yang berbeza seperti tutorial generik di internet, Wikipedia, atau walaupun kita melalui pendidikan formal (seperti kursus teknikal atau kolej), kita akan menemui takrifan yang hampir sama dengan sesuatu yang saya panggil: 4 tiang orientasi objek:

  • Abstraksi;
  • Encapsulation;
  • Warisan;
  • Polimorfisme.

Tetapi ini sebenarnya hanya menceritakan sebahagian daripada cerita, kerana seperti yang saya nyatakan sebelum ini, sebenarnya terdapat dua aliran pemikiran berorientasikan objek yang berbeza, satu yang berkembang daripada tradisi yang dicipta dalam Simula, dan dibangunkan dan dipopularkan oleh C++, dan satu lagi yang berkembang dalam tradisi yang dicipta oleh Smalltalk.

Walaupun kita boleh menerima sisi kemenangan dalam sejarah dalam tradisi C++ (memandangkan sebahagian besar bahasa yang dianggap OO kini lebih mengikuti ideanya berbanding Smalltalk), iaitu, warisan Simula yang berkembang dalam 4 rukun itu, tidak ada kata sepakat sama ada ia betul-betul 4 ini atau betul-betul sepatutnya 4. Contohnya:

  • Pencipta bahasa C++ sendiri menganggap definisi yang hanya mempunyai 3 tiang (abstraksi, pewarisan dan polimorfisme);
  • Bahasa Eiffel mempertimbangkan satu lagi set 6 prinsip (kelas, penegasan, generik, pewarisan, polimorfisme dan pengikatan dinamik);
  • Pencipta bahasa Smalltalk mengatakan bahawa apa yang dia maksudkan apabila dia mencipta istilah itu tidak seperti apa yang kami gunakan pada masa ini, dan menerangkan bahawa ia sebenarnya berpunca daripada 3 prinsip (Mesej Lulus, Enkapsulasi, dan Pengikatan Terlambat Terlalu untuk semua perkara);
  • Bahasa Ada mentakrifkan hanya 3 prinsip (enkapsulasi, pewarisan dan polimorfisme);
  • Bahasa Diri adalah berdasarkan 3 idea (prototaip, slot dan tingkah laku) yang walaupun mempunyai nama lain, adalah bersamaan dengan istilah yang digunakan dalam definisi lain (warisan, medan dan pertukaran mesej);
  • Bahasa Java mentakrifkan 5 konsep (enkapsulasi, medan, pewarisan, kaedah dan objek);
  • Bahasa C# mengikut 4 tiang;
  • Pencipta bahasa Simula mengakui bahawa tiada definisi konkrit, tetapi memetik beberapa konsep yang dia percaya adalah biasa untuk bahasa yang dianggap berorientasikan objek (objek, kelas, warisan, polimorfisme);
  • Bahasa Python memetik 4 konsep sebagai berorientasikan objek (kelas, objek, warisan dan polimorfisme);
  • Bahasa Ruby mendakwa mengikuti definisi Smalltalk, dengan penekanan yang besar pada idea bahawa segala-galanya harus menjadi objek, dan pertukaran mesej;
  • Bahasa PHP tidak mempunyai definisi rasmi orientasi objek, tetapi kita boleh memperolehi bahawa ia mengikuti sesuatu seperti 4 tiang berdasarkan ciri yang dipersembahkan sebagai berorientasikan objek;
  • Bahasa Objective-C tidak mempunyai definisi rasmi orientasi objek, tetapi manualnya mencadangkan gabungan konsep berikut (semuanya ialah objek, kelas, penghantaran mesej, enkapsulasi, pewarisan dan polimorfisme);
  • Tapak web MDN, dalam bahagiannya tentang bahasa JavaScript, mempertimbangkan 3 konsep (kelas dan objek, warisan dan enkapsulasi);
  • Grady Booch, pengarang buku Analisis Berorientasikan Objek dan Reka Bentuk Dengan Aplikasi, mentakrifkan 7 prinsip (abstraksi, enkapsulasi, modulariti, hierarki, menaip, konkurensi dan kegigihan);
  • GoF (Gang of Four: Erich Gamma, Richard Helm, Ralph Johnson, dan John Vlissides), dalam buku mereka Design Patterns: Elements of Reusable Object-Oriented Software memetik enkapsulasi, pewarisan dan polimorfisme sebagai "corak reka bentuk" dalam prosedur. bahasa;
  • Peter Van Roy, dalam bukunya Concepts, Techiniques, and Models of Computer Programming, menerangkan OO dalam 4 item (objek seperti mekanisme abstraksi, keadaan eksplisit, polimorfisme dan warisan);
  • ISO/IEC 2382 item 2122503, yang paling hampir dengan definisi formal, mengambil kira 6 prinsip (abstraksi, enkapsulasi, pewarisan, polimorfisme, pertukaran mesej dan pengikatan dinamik );
  • Yegor Bugayenko, mentakrifkannya melalui model formal yang dicipta olehnya dipanggil phi-calculus, dilaksanakan dalam bahasa EOLANGnya;
  • dan lain-lain...

Menentukan Perspektif

Dengan cara ini, sama seperti Bjarne Stroustrup (pencipta C++) berhujah dalam definisi orientasi objeknya:

Sebarang takrifan "orientasi objek" seharusnya boleh diterima dari segi sejarah. Perkataan hanya berguna untuk komunikasi, ia hanya bermakna jika kita bersetuju dengan makna untuknya.

~ Bjarne Stroustrup, diadaptasi daripada bahasa Inggeris dalam terjemahan percuma

Itulah sebabnya saya ingin menggunakan pendekatan holistik (menganalisis keseluruhan dan bukannya bunyi bahagian) untuk menganalisis perkara yang perlu dipertimbangkan untuk definisi saya. Dalam ini saya akan menilai mengikut 4 kriteria mengikut kepentingan:

  1. Penjajaran konsep dengan perspektif yang ditentukan;
  2. Perkaitan sejarah;
  3. Pelaksanaan dalam amalan (yang juga akan dianggap sebagai persepsi akal);
  4. Keeksklusifan untuk OO (sejauh mana konsep itu boleh dikenal pasti sebagai sesuatu yang berorientasikan objek, bukannya sesuatu daripada paradigma X atau Y, atau konsep yang lebih umum);

Mari kita mulakan dengan menentukan titik permulaan kita dalam sejarah, mula-mula kita akan memutuskan pihak mana yang akan kita pilih sebagai sumber utama, dan kemudian ikuti dengan niat apakah orientasi objek yang sepatutnya dimaksudkan oleh pengarangnya sebagai asas untuk definisi kita, dalam selain menggunakannya sebagai parameter perbandingan untuk menilai set prinsip mana yang masuk akal untuk dimasukkan ke dalamnya.

在这个问题上,我喜欢 Alan Kay 发明了“面向对象”而不是“对象”的观点,所以我们的基础将是他对面向对象的看法,我们可以用几句话来总结:

只是一个温和的提醒,我在上一次 OOPSLA 中努力提醒大家,Smalltalk 不仅仅是它的语法或类库,也不是关于类的。我很遗憾很久以前为这个主题创造了“对象”这个术语,因为它导致很多人关注更小的想法。

最重要的想法是“消息传递” - 这就是 Smalltalk/Squeak 的核心所在......

~ Alan Kay,改编自英文意译

我想到了像生物细胞和/或网络上的个体计算机这样的对象,它们只能通过消息进行通信(因此消息很早就出现了 - 我们花了一段时间才明白如何足够有效地用编程语言发送消息有用)。

我想删除数据。 B5000 几乎通过其令人难以置信的硬件架构做到了这一点。我意识到整个细胞/计算机的隐喻会消除数据,而“

我的数学背景让我意识到每个对象都可能有多个与之相关的代数,并且可能存在这些代数族,并且这些代数将非常有用。 “多态性”这个术语是后来才强加的(我认为是 Peter Wegner 提出的),而且不是很有效,因为它实际上来自函数的命名法,而我想要的不仅仅是函数。我发明了一个术语“通用性”来以近乎代数的方式处理通用行为。

我不喜欢 Simula I 或 Simula 67 继承的方式(尽管我认为 Nygaard 和 Dahl 只是伟大的思想家和设计师)。因此,我决定放弃继承作为内置功能,直到我更好地理解它。

~ Alan Kay,改编自英文意译

POO 对我来说只是意味着消息交换、本地数据保留以及状态保护和隐藏,以及所有事物的极端后期绑定

~ Alan Kay,改编自英文意译

由此我们可以得出结论,使用 Kay 的定义来看待面向对象程序的视角如下:

程序被视为通过消息交换进行通信的对象网络,其目的是通过避免数据、专注于交互来进行编程,以便一条消息可以承载多种含义。

说到视角,这是 Simula 的创建者在他们的《BETA 编程语言中的面向对象编程》一书中使用的部分来描述框架的概念框架,即描述我们如何看待框架的结构以某种范式编写的程序,例如在过程编程的情况下,他们将其描述为:

程序的执行被视为操作变量的(部分有序)过程调用序列。

~ 尼加德 (Nygaard),改编自英文意译

功能性情况下:

程序被认为是一个数学函数,它描述了输入和输出之间的关系。

~ 尼加德 (Nygaard),改编自英文意译

面向对象:

程序的执行被视为物理模型,模拟世界真实或想象部分的行为。

~ 尼加德 (Nygaard),改编自英文意译

因此,即使我们的重点是 Alan Kay 的定义,考虑到 Krysten Nygaard 和 Ole-Johan Dahl(Simula 的创建者)在面向对象语言中的功能方面做出的巨大贡献,以及他的观点已经过时了时间,考虑到几乎每个现代教程仍然遵循这个故事,即对象代表现实世界的概念,甚至被形式化为抽象定义的一部分,我认为将他的观点纳入我们的最终定义是合适的

因此,如果可以提出将两种传统调和为统一定义的论据,从而尊重我们的整体分析方法,我会尝试。

因此,由于它不一定是我们当前的定义所独有的,我们可以通过以下方式增加它:

程序被视为对象网络,这些对象是领域概念的表示,通过消息交换进行通信,其目的是编程避免数据,专注于交互,以便消息可以承载多种含义。它的总体结构类似于对世界真实或想象部分的行为的模拟。

可以考虑的一个因素是,这可能会引导人们关注“较小的想法”,但正如我们之前承认的那样,有必要认识到想法如何随着时间的推移而演变,因为一个词只有在人们理解它时才有价值它想传达什么,因此我相信这个观点在维持艾伦·凯的最初目标和融入尼加德和达尔的对象系统的价值观之间找到了足够的平衡。

定义概念

对于目前的定义文本,我已经可以满意了,这是我对本文提出的问题的回答,但我相信范式的完整定义应该包括它所代表的内容的“视角”程序的执行,以及与之相关的一组原则。

因此,我们可以说我们已经完成了一半,现在我们可以回到我之前给出的广泛定义列表,寻找哪些原则适合我们的观点,同时又不违背我们的基本愿景(专注于交换信息) .

为此,我们再次回到我们的主要来源,Smalltalk 的 OO 原则:

  • 交换消息;
  • 本地数据保留,以及状态保护和隐藏;
  • 极端后期绑定

如果我们再次使用历史相关性标准,可能有人会说,由于这些术语如今已不再使用(消息传递除外),我们应该考虑使用 4 个支柱,并且我再次相信,使用这里的和解方法将是两全其美且不矛盾的:

  • 交换消息;
  • 多态性;
  • 封装;
  • 抽象;
  • 继承;

有选择这5个原则的解释:

消息交换

消息交换在OO的原始语境中是不可协商的事情,毕竟Alan Kay声称是范式的大思想,它最重要的概念,这就是为什么所有其他概念必须有一些东西处理它。

它在实践中的采用是相当可观的,因为具有历史相关性的语言,如 Self、Objective-C 和 Ruby 与这个概念保持着紧密的联系,并且 Ruby 本身被认为是当今的主流语言,构建了出色的应用程序除了拥有非常活跃的社区之外,它就像 github 本身一样。

我想说,除了继承和封装之外,它是最具有 OO 特性的概念之一,因为使用该术语的其他两个实例(有目的的笑话)将在 Actor 模型中,其中是一个数学模型形式逻辑,基本上与 Alan Kay 的思想几乎相同,但完全基于并发(像 OO 这样的东西对于你们 JS 开发人员来说是 100% 异步的)。

多态性

这是一个满足我们分析的所有标准的概念,因为正如 Nygaard 和 Dahl 所指出的,它几乎存在于实现该范式的所有语言中,即使是隐式的(如果它支持继承,支持也隐式支持多态性)。

它也与交换消息的想法非常一致,因为这是使用它的自然好处。此外,它出现在 Alan Kay 的定义中(尽管他说他更喜欢通用性这个术语),毕竟后期绑定是语言中存在的进程的名称
编程允许他们不将调用与特定代码关联起来,而是根据上下文执行它(在面向对象的情况下是接收消息的对象),这正是多态性的定义.

就公众认知而言,这将是所列出的 5 个概念中最重要的概念,甚至被 Bob 叔叔定义为 OO 的本质,而且,即使在不打算完全以面向对象编程的情况下,这被认为是构建某些想法(例如六边形架构或干净架构)的基本块的原则。

然而,这个概念并不是面向对象所独有的,它是一个更通用的概念,存在于多个范式中,通常具有同一语言中不同类型的实现。尽管如此,可以说特定的子类型多态性是 OO 所独有的,因为它是一种依赖于语言执行继承能力的类型。

封装

如果您阅读过我们关于该主题的文章(是的,我们喜欢在这里讨论定义),您就会知道“本地数据保留,以及状态保护和隐藏”基本上是完整的定义封装,所以概念对齐方面,和之前的一样,这里100%遵循这个原则。

虽然有些语言没有提到封装作为原则,但这个概念在它们中甚至有一半存在,即拥有对象的事实(或者像Java和Self的情况一样,强调对象中字段的概念)表明它们有一种机制可以使数据及其函数(对象本身)仅在本地上下文中进行操作,另一方面,C++ 和 Eiffel 等语言提供了保护和隐藏表单中状态的机制访问修饰符 (C++) 或断言、前置条件、后置条件和不变量 (Eiffel)。在 Java 中,我们甚至有一篇关于面向对象的最著名的文章,其中详细讨论了封装的应用:为什么 getter 和 setter 是邪恶的。

所以我想说,这是一个经过时间考验已经非常成熟的原则,尽管它仍然会受到与多态性相同的批评,因为它不是一个专门与 OO 相关的概念,因为它可以使用模块(类似于单例对象)或闭包来实现它,因为它们可以充当穷人的对象,但是,就像多态性一样,该概念在面向对象中“具有独特的风味”应用,因为本地数据保留机制是对象,并且信息隐藏是通过访问修饰符发生的,这是一种与范式广泛相关的功能。

抽象

它不像其他 4 个支柱那样出现得那么多,但是,与封装类似,仍然可以隐式而不是显式地感受到它的存在,因为除了 Self 之外,所有提到的语言都有一种机制以类的形式进行数据抽象。

谈到自我的问题,他非常强调对象本身和信息的交换,我们可以利用这些来分析概念对齐的问题,在这种情况下,我会说编程通过消息交换,用更现代的话来说(尽管概念并不完全相同)将与“接口编程”相同,即仅使用抽象进行编程,而不用担心最终的实现实际上是什么就像 Alec Sharp 所著的《Smalltalk by Example: The Developer's Guide》一书中很好地描述的方法一样,它是“面向对象的编程方式”。

抽象与多态相结合的思想允许每个消息交换隐喻发挥作用,因为这个思想是没有办法仅通过查看消息来知道执行代码的结果是什么,之后它们都是抽象(就像在现代面向对象中读取接口的方法时你无法知道事物将如何执行一样),并且结果取决于在对象本身中找到的具体实现,因此执行可能会有所不同,具体取决于哪个对象响应该消息。

在所有原则中,我想说抽象是排他性标准中最弱的,因为数据抽象是一个通用原则,高于 Peter Van Roy 在他的《傻瓜编程范式》一文中所述的范式概念,尽管如此再次,我们处于与其他原则类似的情况,其中它使用类形式的极其特有的机制,这些机制被广泛认为是面向对象的功能,因此认识到许多人认为该范式仅限于使用类(甚至忘记了对象,更糟糕的是,忘记了过程中的消息)。

遗产

她来这里的目的与交换消息的目的相反,如果交换消息的公众感知得分较低,但概念对齐度最高,则继承对所选概念的概念对齐度最低(可以通过引用 Alan Kay 只是为 Smalltalk 添加了遗产,因为他并不真正知道它会被用来做什么,但认为它可能有用),但除了非常高的历史贡献之外,它还拥有最大的公众认知度。

首先,它是Simula的主要特性之一,在后Smalltalk时代,它被认为是OO的精髓,尽管在Smalltalk发表组合代替继承的思想后,这一点被完全扭转了。 GoF。

尽管如此,它是唯一与 OO 相关的概念,在许多情况下,它的存在足以将一种语言区分为面向对象的语言。唯一可能反对这一点的论据是 Hoare 的记录的想法,但正是它引发了 Simula 中的继承和产品类型,但这与继承是一个非常不同的主题,并且如果你们也面临着同样的问题和争议。

结论

终于有了视角和原则,所以我们最终的定义是:

面向对象的程序被视为对象的网络,这些对象是领域概念的表示,通过消息交换进行通信,其目的是编程避免数据,专注于交互,以便消息可以携带几个意思。其原则是消息交换、多态、封装、抽象和继承。其总体结构类似于对世界真实或想象部分的行为的模拟。

无论如何,这是我对文章标题中提出的问题的最终答案,整个研究花费了大量的工作,所以我希望本文至少可以教会你一些新的东西,或者引发一些思考。

如果你同意或不同意我的定义,别忘了在评论中分享你的观点,我们下次再见!

您可能感兴趣的链接

  • 关于编程范式的维基百科;
  • 关于多态性的维基百科;
  • C2 Wiki - 没有人就 OO 是什么达成一致;
  • C2 Wiki - 面向对象编程;
  • Stackoverflow - “面向对象”术语的含义;
  • EOLANG 和 Phi 微积分;
  • 计算机编程的概念、技术和模型;
  • 傻瓜编程范式;
  • Smalltalk 示例;
  • BETA 编程语言中的面向对象编程;
  • 为什么 C++ 不仅仅是一种面向对象的编程语言;
  • Alan Kay 博士谈“面向对象编程”的意义;
  • 面向对象的诞生:模拟语言;
  • 面向对象编程的两大流派;
  • ISO/IEC 2382:2015;
  • SelfObjectModel;
  • 自我手册;
  • 自我:简单的力量;
  • 动态对比静态调度;
  • (错误)OOP 的解释;
  • 新兴对象用闭包构建一个简单的对象系统;
  • MOPping 构建一个简单的元对象协议;
  • 调度接口;
  • Alan Kay 和 OO 编程;
  • 艾伦·凯没有发明物体;
  • 原型与类是:Re: Sun's HotSpot;
  • 论计算机程序规范和组织的未来;
  • 无数据编程;
  • Smalltalk 的早期故事;
  • Go-to 语句被认为是有害的;
  • 伯姆-雅可比尼定理;
  • 埃菲尔关于 OO;
  • Devmedia 优于 OO;
  • 关于 lambda 演算的维基百科;
  • 艾达关于面向对象;
  • Java 规范第三版;
  • C# 优于 OO;
  • Python 优于 OO;
  • PHP 优于 OO;
  • Ruby 文档;
  • MDN 优于 OO;
  • 面向对象的分析和设计及其应用;
  • 设计模式书;
  • 为什么 getter 和 setter 是邪恶的;
  • Clean Coder 博客 - FP 与 FP哦;
  • 关于演员模型的维基百科;
  • 关于 Actor 模型的 Akka(编程语言);
  • 庄严地谈论演员模型;

屁股:累了支持

Atas ialah kandungan terperinci Lagipun, apakah definisi Orientasi Objek?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn