写点什么

程序原本(六):继承与混合,略谈系统的构建方式

  • 2020 年 2 月 15 日
  • 本文字数:1354 字

    阅读完需:约 4 分钟

程序原本(六):继承与混合,略谈系统的构建方式

编者按:本文节选自周爱民著《程序原本》一书中的部分章节。


继承与混合,略谈系统的构建方式

节选自博客文章“继承与混合,略谈系统的构建方式”(2010 年 12 月),文章讨论了对“基于对象系统进行系统构建”的认识与实现。


面向对象系统有三种对象的继承方式,即原型、类和元类。这三种方式都可以构建大型对象系统。在后续讨论之前,我们先在名词概念上做一些强调。所谓“对象系统”,是指由“一组对象构成的系统”,这些对象之间存在或不存在某种联系,但通过一些规则组织起来。所谓“面向对象系统”,是指以上述“对象系统”为基础延伸演化的系统,新系统满足前对象系统的组织规则。


所谓“对象系统的三个要素”——继承、封装与多态,即是上述组织规则的要件。孟岩同学从 C/C++出发1,从另一个侧面谈论对象系统,所持的观点我相当认可。他指出,“对象范式的基本观念中不包括继承、封装与多态”,这一观点有其确切的背景与思考方法,值得一谈。


1 参见孟岩的博客文章“function/bind 的救赎”:http://blog.csdn.net/myan/article/details/5928531


我们在这里要讨论的是“对象系统”,即对象是如何组织起来的问题。在这个问题上,组织规则之一就是“继承”。JavaScript 中基本的继承模型是原型继承,其特点是“新对象实例的特性,复制自一个原型对象实例”。Qomo 以及其他一些项目,通过语言扩展的方式,在 JavaScript 上添加了类继承的模型,其特点是“对象构建自类,类是其父类的一个派生”,这里的“派生”与“特性复制”有潜在的关系,即子类的特性也复制自父类。正是由于“派生”其实是“特性复制”的一种形式,所以事实上 Qomo 中的类继承是通过原型继承来实现的,因为原型继承本质上也就是“特性复制”。


无论是原型继承、类继承还是这里没有进一步讨论的元类继承,继承的最终目的都是构建一个“对象系统”,而不是“系统”。这一个措辞上小小的区别,有着本质上的深刻意义,这也是我提及孟岩的那一篇文章的原因。通常由“继承”入手理解的“对象系统”其实是静态的,以至于我们在面向对象系统开发的最后一步,仍然需要框架来驱动它。例如TApplication.Run(),或者类似的new Application()等。继承所带来的,主要仍然是指对象系统的组织性,而非其运行过程中的动态特性。


于是我们通过更多类或其他对象系统,来将一个系统的动态特性静态化。例如将对象之间的交互关系抽取出来,变成控制类。我们做这些事情的目的,仅仅是因为我们约定了对象系统的组织规则,要面向这个对象系统开发,也必然满足(或契合)这一组织规则。组织规则限定了我们构建系统的方式——继承、封装与多态,这在一定程度上说是“对象系统构建”的一个方案,并非“系统构建”的方案。而孟岩在文章中所讨论的,正是“系统构建”的问题。所以孟岩提出两点:


  • 程序是由对象组成的;

  • 对象之间互相发送消息,协作完成任务。


其中第一条,是对象系统的基本特性,是谓系统成员;第二条,是对象系统如何演进为系统的特性,是谓系统通信。一个系统的约束,既包括其成员(以及成员的组织规则),也包括成员间的通信。


图书简介https://www.ituring.com.cn/book/2429



相关阅读


程序原本(一):应用开发基础


程序原本(二):应用开发技术


程序原本(三):开发视角下的工程问题


程序原本(四):系统的基础部件


程序原本(五):海量数据运算中公开的秘术


2020 年 2 月 15 日 14:001742

评论

发布
暂无评论
发现更多内容

苏宁精准测试方案探索和实践

薛飞

精准测试

kubernetes增加Node详细步骤

消失的子弹

Kubernetes 云原生 k8s kubeadm

Spark 源码阅读 02:从 Spark-Submit 到 Driver 启动

程序员赤小豆

spark 技术 Spark 源码

技术调研,IDEA 插件怎么开发「脚手架、低代码可视化编排、接口生成测试」?

小傅哥

Java 小傅哥 低代码 IDEA 脚手架

面向多场景而设计的 Erda Pipeline

尔达Erda

开源 微服务 云原生 企业数字化转型 Go 语言

书单 | 8月新书榜单TOP10,快来看看都有谁吧~~

博文视点Broadview

如何找到靠谱的工长?

escray

生活记录 8月日更 装修记

拆分电商系统为微服务

木云先森

架构实战营

从头配置阿里云服务器

阿Q说代码

SSL证书 8月日更 阿里云服务器 域名备案

挑战倒计时!“互联网+”大赛华为命题加速高阶能力提升

华为云开发者社区

华为云 鲲鹏 大赛 “互联网+” 昇腾AI

云小课|ModelArts Pro 视觉套件 零代码构建视觉AI应用

华为云开发者社区

AI ModelArts Pro EI智能体 视觉套件

电商系统微服务拆分-模块6

小牧ah

架构实战营

架构训练营模块六作业

喻高咏        

架构实战营

Rust从0到1-高级特性-类型进阶

rust 高级特性 类型 Types

详解可观测性监控系统中的“金三角”

尔达Erda

开源 微服务 运维 云原生 APM

索引下推,这个点你肯定不知道!

艾小仙

MySQL MySQL 高可用

Python实现批量压缩文件/文件夹——zipfile

Python研究者

8月日更

创业增长黑客 – 如何低成本获取种子用户|冷启动实战案例 – 挖掘用户需求背后的真实动机

蒋川

用户增长 需求落地 产品经历 业务增长 数据思维

带你掌握JS防抖与节流

华为云开发者社区

面试 定时器 节流 JS防抖 触发

java毕设开发经典选题

清风

毕业设计

Spark 源码阅读 01:环境搭建

程序员赤小豆

spark 技术 Spark 源码

用户体验再升级!Erda 1.2 版本正式发布

尔达Erda

云计算 开源 开发者 云原生 Go 语言

快速生成好看实用的接口文档

与风逐梦

后端 接口文档

AI应用说-生产制造专场开课啦!

百度大脑

人工智能

Regan Yue带你一起学习微软AZ-900认证的有关知识「 第V章」

Regan Yue

微软 8月日更 AZ-900

Vue进阶(八十四):Computed 和 Watch 使用与区别

No Silver Bullet

Vue 8月日更

情窦初开,原来喜欢这么可爱的

4ye

Python 后端 8月日更 词云

云原生时代的 APM

尔达Erda

微服务 运维 云原生 APM 应用性能管理

接口测试参数化(环境变量使用)----apipost

Proud lion

大前端 后端 Postman 开发工具 接口文档

微信自研生产级paxos类库PhxPaxos实现原理介绍

OpenIM

IM

拆分电商系统为微服务

面向对象的猫

程序原本(六):继承与混合,略谈系统的构建方式-InfoQ