Skip to content

1.5 使用主客体理解软件开发

面向对象是应用软件设计比较好的方式,可以指导用计算机解决现实中的业务问题,因此是软件开发中的一种主流方式。

不过,用好面向对象则比较困难,即使有数年经验的软件工程师也难说能很好驾驭。大多数人往往是照猫画虎,没有理解软件开发的 "骨相"。

背后的原因在于面向对象是对现实业务的抽象,需要使用者对现实有深入的理解,于是面向对象带有一定的哲学认识论的色彩。

实际上,现代英语、现代法律、面向对象编程都和近代哲学有关,而近代哲学被称为"主体性哲学","主体" 概念和主客体关系是非常重要的内容。

现代英语、现代法律、面向对象编程看似三个无关的领域,背后的逻辑却惊人的一致。

在现代英语(古代英语除外)的主要语法是:主语 + 谓语 + 宾语 + 修饰语。想象一下你在一家餐厅吃饭,你点了一份三明治,用一般现在时就是:I order a large sandwich。在这套逻辑关系中,主体就是你自己,客体是三明治,行为是点餐,其他的内容都是修饰成分。

假定你和餐厅出现了纠纷,餐厅忘记给你上了餐,却说已经上了。你发起了诉讼,让餐厅赔给你三明治。在诉讼的逻辑关系中,这是一起民事纠纷,你是民事主体,民事客体就是三明治,诉讼内容是赔偿行为。

而如果软件工程师需要编写一个软件用来处理订单,实现一个收银机功能。可能他会写一个 OrderService 来实现。伪代码如:

这段代码可能会被认为不符合面向对象,因为某些书中,Order 是需要自己来完成业务的。实际上,在这段代码中,当我们认识到主客体关系时,一切豁然开朗。OrderService 是我们的业务主体,Order、User、Product 不过都是业务客体。和民事行为一样,业务逻辑也应该发生在业务主体中,这样就容易理解了。

既然主体、客体思维可以让面向对象更容易理解,我们来严肃的说下这些概念。哲学可能会有一些无聊,不过值得去了解它们。

主体、客体在哲学中的定义是什么呢?按照主流的哲学教科书,可以看到类似下面的描述:

  • 主体是有认识能力和实践能力的人,或者,是在社会实践中认识世界、改造世界的人。 主体是有认识能力和实践能力的人,或者,是在社会实践中认识世界、改造世界的人。

  • 客体是实践和认识活动所指向的对象,是存在于主体之外的客观事物。 客体是实践和认识活动所指向的对象,是存在于主体之外的客观事物。

这里需要修正下,随着科学技术的发展,主体可以不只是普通的 "人" 了,可以是一个具有集体意识的团体、网络虚拟世界的一个形象,比如 xxx 公司、初音未来也可以是主体。与之相对的普通人是 "自然人"。

主体、客体思维从笛卡尔时期就开始出现,在康德时期又进一步发展。在主体、客体英文分别是 Subject、Object,它们都是实体,主体是具有行为、感知和思想的一类。

需要注意的是,主体、客体是相对的、动态的。比如用户,在做出一些操作的时候它是主体,当被管理员或者系统操作的时候,它又是客体,这点尤为重要。

关于更详细的主体、客体的知识,我们会在后面大量被用到,在具体使用的场景中再深入探讨,比如业务分析、领域建模、架构设计和团队管理等方面。

当我们理解到主体和客体的思维后,就可以用它分析和指导我们的实践,也就是面向对象的编程了。

Released under the MIT License.