多年前跟 @tertio 聊起程序语言时,我们曾一起发泄过对OOP共同不满,
后来有个帖子还重提这个话题 headsalon.org/archives/4883.html
OOP的根本问题是,它描绘世界的方式,和我们的认识世界的过程是相反的,它先抽象,后具体,先有类,后有对象,而我们的认识恰好相反,
所以,随着我们对世界认识的深入,那个由一棵棵类型树组成的结构框架就不断遭受冲击,要么不断推倒重来,要么修修补补变成一团乱麻,
昨天突然想起来,其实有一个非常简单的方案,可以大幅改进现有OO语言应对这个问题的能力,不需要重起炉灶设计新语言,
就是引入一个摹状类型(descriptive type)的概念,现有OO语言中,类型是基于血统的:对象 o 的类型是 T,是因为它要么(如果T是简单类型)被声明为 T 的,要么它是从 T 或 T 的后裔类创建的,
而在摹状类型范式下,对象的类型是基于属性和行为的,对象 o 的类型是 T,是因为它具有那些由 T 所规定的属性和行为,并且这些 这些属性和行为的值或表现符合 T 之规定(如果T对此有所规定的话),
注意:摹状类型不是有些语言已经支持的鸭子类型,鸭子类型是没有明确定义的,像对待一只鸭子那样去对待一个对象是否成功,是全靠蒙的,相反,摹状类型可以非常明确而严格的定义,而且定义不仅针对目标类型的成员(属性和方法),还可以针对属性的实际值和方法的实际表现(比如特定调用的返回值),还可以针对目标类型本身,比如只接纳某组类型,或排除某组类型,这就最大程度防止了滥用,
因为摹状类型是针对既有类型和对象而定义的,所以就和我们认识世界的方式一致了:先具体后抽象,
举个例子,你有一个割草机的祖类,派生了手动割草机,汽油割草机,电动割草机,四轮割草机等后裔类,同时还有一棵与之无关的剃须刀类型树,剃须刀,折叠式剃须刀,可替换刀片安全剃须刀,一次性安全剃须刀,电动剃须刀……
电动割草机和电动剃须刀有一些共同属性:电流类型,输入电压,功率,
现在你定义一个摹状类:用电设备——只要拥有上述三个属性的对象,都是用电设备,
你还可以定义一个*低压直流用电设备*的摹状类:它是用电设备,并且电流类型=直流,输入电压<=12V,
实际应用中,你可以用一个摹状类去*包装*一个既有对象,或从一个对象列表中过滤出可接纳成员,或用该摹状类的一个方法去处理一个对象集合,等等,
依我看,现有 OO 语言只需要稍做努力便可支持摹状类型,即便语言本身不支持,只要它支持类型自省,也很容易自己动手实现,大概只需要小几百行代码,
发布于 澳大利亚
