`
ruilin215
  • 浏览: 1143183 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

鸭子类型:一切都是为了复用

阅读更多

当同志说出“科技是第一生产力”的时候,中国的发展无不是围绕此展开的。软件工程亦是如此。虽然同志的话只是一个总结。但必须承认,这个总结非常有见地。

软件发展,你可能已经被各种各样的名次搞晕了头。一堆类似OP、OO、SOA等等概念,如果你半年不关心IT,很可能你就发觉被世界遗忘了。

可是推开这些概念的表面迷雾,你会看到,所有这的一切,都是我们在努力提高生产力的结果。而提高生产力的最有效方法就是复用!

从汇编语言的出现,后来高级语言C的出现,面向对象的C++出现,面向类型的动态语言(如Python,Ruby)出现(这是我个人的看法,我若认为动态语言主要是从类型入手进行复用,欢迎指正),个个都是围绕不同层次的复用,复用二进制指令、复用逻辑、复用对象、复用类型。

这里我特意说一下动态语言中的Duck Type(走起来像鸭子那就是鸭子 it walks like a duck so it must be a duck)。如果说这是一种类型的话,我更愿意称之为“鸭子理论”。因为不为理论,不足以说明其在思想上的先进性。

defSum(aasduck,basduck):
returna+b

上面是一段简单的语法。如果从实现上讲,duck也许只是让编译器识别的一个关键字而已。代码执行的时候,会根据duck进行类型推定。但是我们这里讲的不是实现,而是藏在duck后面的思想。

那么,为什么要有鸭子出现?回答这个问题很难。因为我们都已经被静态类型的语言影响很久,甚至可以说毒害不浅,这会让我们非常难以接受新的思想。

静态类型中最最关键的一点是面向契约编程,即双方定下调用契约,然后你实现,我调用。这解决了很大问题。可是,你有没有发现就是因为这点,我可能不能复用很多我原本可以复用的。

谈到这里,我先说一下多重继承。C++语言中一直被人骂的鸡肋多重继承,大家有没有去想想他出现的根本?原因还在于复用。因为,人们不满足于只能仅仅复用简单的个体,很希望能够吸取多种对象的功能。这和现实是很相近的。一个业务实体往往能够兼备多种实体的功能。

尽管后来其他语言都是采用接口的机制取代多重继承,来实现业务实体的多个功能面的契约定义。可是,接口只是解决的契约的定义。另外,对于契约,其实有时候是很不公平的事。这让我想起一个微软的认证。

微软的认证是有阶梯约束的。过了初级才能考中级,而不管你是否已经拥有了初级的能力。一句话,你得听我的!这种契约式的预定,制约了很多已经拥有了能力,但是没有交钱考试的人!对于他们,这是多么不公平的事?而且,如果有一项任务,必须拥有某种资格认证的人才能做,你是看资质证书呢?还是看能力表现?

这是个非常有意思的问题。如果是你,你会选择哪个呢?静态语言选择了前者,动态语言选择了后者。

鸭子理论这个时候,就是充分想利用这些没有获得契约的资源。在不改变这些对象的前提下,使用这些资源,就是非常大的复用。

所以说,万变不离其宗!抓住“复用”这点,就能很容易理解很多新技术的背后思想。

我最近在学习动态语言的时候,一直在思考其中的思想。一些感悟,写出来和大家一起分享。

分享到:
评论

相关推荐

    设计模式之策略模式 鸭子问题

    设计模式之策略模式 鸭子问题 策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和实现。策略模式的主要思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。...

    详细介绍Python的鸭子类型

    鸭子类型基本定义 首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。 以下是维基百科中对鸭子类型得论述: 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种...

    python 多态 协议 鸭子类型(csdn)————程序.pdf

    Python 多态、协议和鸭子类型 Python 中的多态是指一个类在继承和派生时,保证使用“家谱”中任一类的实例的某一属性时的正确调用。多态的作用是为了在继承和派生时,确保正确地调用类的方法。 协议(Interface)...

    设计模式解读之一: 策略模式——鸭子游戏.doc

    设计模式解读之一:策略模式...这在鸭子游戏中非常有用,因为我们可以根据不同的鸭子类型选择不同的飞行动作。 策略模式是解决鸭子游戏中问题的一种非常好的方法。它使我们可以灵活地更换算法,而不需要修改原始代码。

    射击鸭子射击鸭子射击鸭子射击鸭子

    射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子射击鸭子...

    以下是一个简单的Python程序,用于计算不同类型的鸭子数量并输出总数:

    以下是一个简单的Python程序,用于计算不同类型的鸭子数量并输出总数:这个程序定义了六种不同类型的鸭子数量,并将它们相加得到总数。然后,使用print语句输出计算出的鸭子总数。你可以根据需要修改这些数值。这个...

    Python动态语言与鸭子类型详解

    今天来说说编程语言中的动态类型语言与鸭子类型。 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他...

    实验一:鸭子游戏-策略模式.rar

    在"鸭子游戏"这个例子中,可能有不同类型的鸭子,每种鸭子的叫声、游泳和移动方式可能不同,这就是策略模式的应用场景。我们可以创建一个"鸭子"的抽象类或接口,然后定义如"叫声"、"游泳"和"移动"等行为作为方法。...

    Flash 射击游戏 打鸭子

    《Flash射击游戏——打鸭子》是一款经典的在线娱乐游戏,其核心是利用Flash技术实现的。Flash是一款由Adobe公司开发的交互式多媒体创作工具,它以其便捷的动画制作能力和丰富的互动性,在20世纪末至21世纪初的网页...

    通过案例解析python鸭子类型相关原理

    Python中的鸭子类型是一种独特的编程范式,它体现了动态类型语言的核心理念。在Python中,类型不是基于继承或实现特定接口来确定的,而是通过对象的行为来定义。换句话说,如果一个对象具有某个方法或者属性,并且能...

    【为一只小鸭子痛哭阅读附答案】为一只小鸭子痛哭.docx

    这篇文章讲述了儿子与一只名为黄小贝的小鸭子之间的故事,展现了孩子与动物间纯真的感情,以及生活中的悲欢离合带给孩子的深刻感悟。通过儿子对小鸭子的悉心照顾,我们可以看到他对生命的尊重和爱护,而在小鸭子意外...

    关于鸭子的问题 策略模式(Strategy Model)编程 重要 思想 理念

    所有鸭子都继承自一个抽象的鸭子类,其中包含`Display()`方法,这个方法在各个子类中被具体实现以展示不同鸭子的外观。然而,当需要添加飞行行为时,问题出现了。若简单地在鸭子基类中添加`fly()`方法,会导致所有...

    经典android游戏源码打鸭子

    《经典Android游戏源码——打鸭子》 在Android平台上,打鸭子是一款深受玩家喜爱的经典游戏,它基于Eclipse开发环境构建,展现了Android游戏开发的魅力。本文将深入解析这款游戏的源码,揭示其背后的编程技术和设计...

    软件设计模式鸭子问题代码Java

    首先,我们有一个抽象的`鸭子`接口或抽象类,它定义了所有鸭子都应具备的行为,如`quack()`(嘎嘎叫)和`fly()`(飞行)。这样的设计使得我们可以为不同的鸭子类型(例如:红头鸭、野鸭)提供统一的接口,而无需关心...

    射击类游戏打鸭子源文件Flashas3

    射击类游戏《打鸭子》是一款深受玩家喜爱的经典游戏,基于Adobe Flash AS3技术开发。在AS3(ActionScript 3)中,游戏的编程逻辑得以实现,为玩家提供了丰富的互动体验。源文件包含了游戏的所有核心组成部分,让我们...

    这是一个简单的Java程序,用于计算不同类型的鸭子数量并输出总数

    这是一个Java程序,用于计算不同类型的鸭子数量并输出总数。下面是对该程序的详细解释: 定义了一个名为CountDucks的公共类。 在该类中定义了一个名为main的公共静态方法,它是Java程序的入口点。这意味着,当程序...

    打鸭子flash小游戏源代码

    在《打鸭子》游戏中,鸭子飞过的动画、枪射击的动画都是通过补间动画实现的。 5. 布尔逻辑:游戏中的条件判断广泛使用布尔变量,如鸭子是否被击中、游戏是否结束等。 6. 数组应用:鸭子可能有多只,它们的信息可以...

    Matlab鸭子渡河建模函数

    本案例中,我们关注的是"Matlab鸭子渡河建模函数",这是一个通过编程来解决特定问题的实例。 首先,我们来看三个关键的函数文件: 1. rivemathmode.m:这个文件很可能是实现鸭子渡河问题的解析解。解析解是指通过...

    java设计模式基础_小鸭子游戏

    为了实现不同鸭子有不同的叫声,我们可以定义一个`QuackBehavior`接口,包含`quack()`方法。然后,为每种鸭子创建一个具体的`Quack`策略类,如`MuteQuack`(无声的叫声)、`SqueakQuack`(吱吱声)等。鸭子对象在...

    Flash打鸭子游戏

    1. **鸭子对象**:每个鸭子都是一个独立的AS3类实例,包含了鸭子的位置、速度、方向等属性,以及移动和碰撞检测的方法。 2. **子弹对象**:同理,子弹也有自己的类,负责处理发射、移动和消失的逻辑,同时与鸭子...

Global site tag (gtag.js) - Google Analytics