动态类型+面向对象 = shit

动态类型+面向对象 = shit

1.动态类型 

动态类型语言,属于看起来方便,用后麻烦的东西,我不喜欢它们。除非不需要考虑软件工程场合——如作为脚本语言。

动态类型+高阶函数,使得Scheme定义的op非常强大,如同酒驾的司机,非常狂野。

 

(define (op a b how-op)
( how-op a b) )

 

op可以对两个参数a,b进行“某种”how-op操作后返回一个值。然而,如果不看op的实现,应用程序员就不可能知道how-op应该是什么样的函数,也不知道op将返回什么结果。在当前实现下,应用程序员仅仅知道how-op有两个参数,how-op的返回值即op的返回值。

如果op实现如下

(define (op a b how-op)
  (and (how-op a) (how-op b) )  )

那么,应用程序员仅仅知道,how-op有一个参数,返回值为布尔值,op的返回值也为布尔值。可以应用如下:

(op 1 3 (lambda(x)(> x 0))) ;;
(op #t #t (lambda(x) x)) ;;;

Scheme定义的函数,应用程序员无法脱离实现而仅仅了解其接口,或者说,Scheme程序不可能遵循接口与实现分离。【也就是说,用户看到一个函数,理论上,需要了解函数的实现。这是讨厌的事情。

类似的Python语言,不可能出现针对接口进行抽象的、类似Java抽象方法或C++的纯虚函数的概念,也就不会有抽象类型。【因此,动态类型语言,在理论上就不支持抽象函数——你无法脱离实现定义接口。】

如果一门面向对象的语言,不支持抽象类型,除了称之为shit,没有其他的描述。

鸭子类型(duck typing)

“如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭子。”

动态类型语言不支持接口与实现分离,对于这种动态类型的面向对象语言,它很容易实现所谓的鸭子类型——因为该语言的参数不管类型。

 

function( duck ){
	1+ duck.quack() ;
}

按照设计者的原意,function( duck )的参数是Duck类型,但是不管什么类型,周黑鸭也好,只要——按照上面的实现——某东西有quack(),并且返回值能够与1相加,就可以作为实参。

 

如果那一天Duck类型将duck.quack()修改了——反正Duck类型的quack()返回值类型也是不定的,也就是说仅仅修改了function( duck ):

 

function( duck ){
	duck.quack() and true ;
}

 

或者duck.quack()改成了duck.jiao()

周黑鸭就需要修改其quack()的返回值类型或函数名。你不要怪Duck类型的设计者的重构,别人凭什么通知你个死鸭子。

常言道:动态类型一时爽,代码重构火葬场

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值