[译]柏拉图与面向对象编程

他们(哲学家)的职业就是什么事也不做,但是要观察每一件事情;因此,他们常常能把相距遥远和极不相同的事物的力量连结在一起。 -- 亚当·斯密《国富论》

前言

原文见Plato and Object Oriented Programming

译文

面向对象编程代表了一种范式转变,转变自传统的模块化编程方法。今天的计算机科学家无疑是聪明的人,但面向对象编程的基础概念已存在近2500年,它们来自柏拉图的'对话'。

柏拉图和软件架构师的思维方式似乎存在显着的相关性,即便他们年代相隔数千年。

古希腊哲学

柏拉图出生在古希腊的雅典城,受教于苏格拉底(苏格拉底被认为是西方哲学之父)。柏拉图是古希腊哲学家中(也许是所有哲学家中)最著名的一位。他通过丰富的著作遗产对现代哲学产生了深远的影响,这些著作包括35篇对话和13份书简。

柏拉图的著作涵盖众多哲学主题。在这些主题中,我们将他激进的形而上学概念,与面向对象编程做个比较。从根本上说,柏拉图的形式(Forms)论与面向对象编程OOP的基础概念相近。

形式论

纵观他的形而上学,柏拉图把形式(Forms)看作一种抽象表示,它是真实世界的物体/特征的模板(templates/patterns)。

举例来说,为了解释形式的概念,柏拉图讨论了的概念。一朵花是的,一幅画也可以说是的,但它们并不是本身。柏拉图认为,真正的的形式独立于拥有它的物体而存在,因此我们可能有一个完美的的概念,但永远无法亲身体验它。

按照柏拉图的说法,一朵花被称为分享的形式。它是美丽的,但我们从未见过真正的。这种花被认为是一个美的实例,从众多形式(其中一个就是)中继承特质。

形式是不变的,而一朵花可能在一段时间内拥有,但最终在它枯萎死亡时会失去它。作为抽象,形式独立于继承其品质的现实世界对象(或者实例)。

计算机编程

传统方法

计算机程序在本质上是有序的指令列表: 完成A,然后完成B等。这有点像跟着烹饪菜谱一步一步操作。

随着计算机越来越先进,相关软件程序也变得更加冗长和复杂。通常,计算机需要一次又一次地运行相同的代码。因此,不应每次需要时都重写这段代码,而是将函数(functions)或过程(procedures)写成半隔离的代码片段,需要时就调用它们。这有助于软件以模块化的方式开发,各个模块负责某些计算过程。

面向对象编程(OOP)

面向对象编程将模块带入了下个阶段,模块成为自包含的代码片段,它们被称作(classes).

一个(Class)是一堆程序代码,用做创建对象(object)的模版, 正如柏拉图的形式(Forms)是真实事物的抽象哲学模板(templates)。这段代码或不是对象(object)本身,而像柏拉图式的形式(Forms),只是描述对象实际是怎样的以及具有什么属性的模板(templates)。与柏拉图完全相同概念,转换到一个不同的学科,中间相隔了2500年!

与柏拉图的形式的分层系统相似,类或模板也可以被增强。通过创建扩展类,继承父类的所有属性,同时又可以添加它自己的额外属性。(译者注: 我认为柏拉图似乎没有想清楚不同形式之间的关系问题,他也没有阐述分层系统,对话中巴门尼德指出柏拉图形式的一些问题,柏拉图似乎没有重视。这点罗素在《西方哲学史》里有指出)

 1: // Our template or perfect form of a chair
 2: class Chair
 3: {
 4: // bits of code to define the chair goes in here
 5: }
 6:
 7:
 8: // New template for a type of chair inheriting properties from the perfect chair form
 9: class OfficeChair extends Chair
 10: {
 11:     // bits of EXTRA code for the office chair goes in here 
 12: }
 13:
 14:
 15: // Create an actual object, or particular of the office chair
 16: $objMyOfficeChair = new OfficeChair();
 17:
 18: // Create an another object, or particular of the office chair
 19: $objMyOtherOfficeChair = new OfficeChair();

这是一个极其简化的例子,从中可以看到类之于对象 与 柏拉图形式之于实例的类比。

太阳底下无新事物

虽然我们可能认为自己是行走在这个星球上最聪明的一代,但我们可能得谦卑一些,通常我们只是在用新瓶装旧酒。

圣经 传道书1:9-10 里说:

已有的事, 后必再有, 已行的事, 后必再行, 日光之下并无新事。

艾萨克·牛顿向前人的灵感致敬道:

如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。

寻求灵感

如果你正在努力思考问题的答案,或想找到一种新的做事方式,不如试着从经典中寻求灵感。

通过研究历史,即使是不同学科中的历史,也可能让你遇到一些想法,这些想法可以迁移到你目前的专业领域,并带着你前往梦寐以求的地方。这个过程甚至被赋予了名字 -- 思想的交叉施肥。

下次你遇到问题时,会转向哪儿寻找灵感?柏拉图?亚里士多德?

译者注

在此列出巴门尼德指出的形式/理念所存在的问题,这些问题可能会以其他形式出现在面向对象编程中.

(1)个体是分享全部的理念呢,还仅仅是分享其一部分呢?无论是哪一种观点,都可以有反驳的理由。如果是前者,那么一个事物就必须同时存在于许多地方;如果是后者,则理念既然是不可分割的,那么一个具有“小”的一部分的事物就要比“绝对的小”更加小,而这是荒谬的。(2)当一个个体分享一个理念的时候,个体和理念就是同样的;所以就必须另有一个既包含这个个体又包含原来的理念的理念。于是就必须再有一个理念包括这个个体和这两个理念,如此类推从至无穷。这样,每一个理念就不止是一个,而会变成为理念的一个无穷系列。(这和亚里士多德关于“第三个人”的论证是同样的。)(3)苏格拉底提示说,理念也许仅仅是思想;但是巴门尼德指出,思想必须是关于某种事物的。(4)由于以上第(2)条所举的理由,所以理念便不能与分享它们的个体相似。(5)如果有任何理念存在的话,它也一定不能被我们所认识,因为我们的知识不是绝对的。(6)如果神的知识是绝对的,他就不能认识我们,因此也就不能统治我们。 --《西方哲学史》 第十五章 理念论




Fork me on GitHub