`
小鸡啄米
  • 浏览: 38617 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

动态类型静态类型的优缺点--《松本行弘的程序世界》

    博客分类:
  • Ruby
阅读更多

 

偶然今天看到了《松本行弘的程序世界》一书,作者对静态类型和动态类型的优缺点做了详细的解释:

静态类型的优点:

        1, IDE聪明的提示,因为静态类型的语言的类型是确定的,所以编辑器可以知道当前的变量有哪些属性和方法。

        2, 编译的时候能够发现类型不匹配的错误,而动态语言至多只能发现语法错误。

        3, 我们在开发过程中明确了某些变量在程序中扮演了什么角色,这是开发可靠性高的程序所必须的。

静态类型的确定:

        1, 因为要定义数据类型,程序的规模也变得很大,编程应该考虑程序的本质,而不是把精力集中于一个个数据类型的定义。

        2,  缺乏灵活性,因为一个变量,只能赋值某种类型的对象。明显当程序需要扩展的时候,这会成为枷锁,当然可以通过继承和接口实现,这会陷入另一个深渊,你总会去纠结复杂的继承关系。

 

动态类型的优点:

        1, 相反于静态类型,编程完全集中于程序的设计的本质,代码的简洁度也会提高,开发效率可能会数倍的提高。

        2, 因为程序的规模降低, 程序的可理解性也会提高。(静态类型的拥护者可能会认为,少了类型信息,程序变的不可读了。我是觉得读程序应该集中在程序的本质上)

动态类型的缺点:

        1, 程序执行速度慢,因为动态类型的语言,类型检查是在运行期做的。(随着计算机性能的提高,执行速度不是什么严重的问题了,关键是生产力提高了)

        2, 不执行就检测不出错误。(这是我说的动态类型的安全问题)

 

这是松本大师对于类型的理解。

类型安全问题: 

 

public class Hello {
   public static void main(String[] args) {
     String a = "1";
     test(1);
   }
   static int test(String s) {
	return 1;
   }
}
 

这段java代码在编译时肯定不能通过的。而在python中:

a = lambda x: x.startswith("abc")

a(1)

这段代码只有在运行时候才能报错。这应该就是类型安全问题吧!

作者基于动态类型的灵活性举了一种编程方式的示例:duck typing,就是说编程的时候,不要关心一个对象属于什么类型,而要关心这个对象有什么行为。

看一个示例:

 

#!/usr/bin/env ruby
module Duck
  def bark
    puts "bark"
  end
  def run
    puts "run"
  end
end
class ADuck
  include Duck #ruby的混入,可以用来实现多重继承,类似于java利用接口实现多重继承功能 
end
class BDuck
  include Duck
end
def duckrun(d)
  d.run
end
a = ADuck.new
b = BDuck.new
duckrun(a)
duckrun(b)
 

这种编程方式是不是也可以称为面向接口编程,当然可以利用java的抽象类或者接口实现。

我们再看一个示例:

 

class ADuck
  def run
    puts "run a"
  end
end
class BDuck
  def run
    puts "run b"
  end
end
class CDuck
end
def duckrun(d)
  if not d.respond_to?("run")
    raise TypeError, "not a duck"
  end
  d.run
end
a = ADuck.new
b = BDuck.new
c = CDuck.new
duckrun(a)
duckrun(b)
duckrun(c)
 

这次没了module,没了继承,唯一要做的就是检查对象是否有该方法(还可已在运行时为对象增加行为),避免了令人费解的继承问题。程序也拥有了更好的扩展性。

就这么多了。。。


分享到:
评论

相关推荐

    python 学习中关于动态类型静态类型强类型弱类型的问题.docx

    ### Python学习中关于动态类型、静态类型、强类型与弱类型的问题 #### 动态类型与静态类型 在计算机编程领域,动态类型和静态类型是两种重要的类型系统分类方式。 **动态类型**(Dynamic Typing)指的是在程序...

    linux静态库和动态库

    ### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...

    OpenSSL-1-1-1-stable静态库,OpenSSL-1-1-1-stable

    然而,静态链接也有一些缺点,比如程序体积会增大,更新库时需要重新编译所有使用该库的程序,以及可能导致许可证问题,因为静态链接可能违反某些开源许可证的要求。 总的来说,OpenSSL-1-1-1-stable 是一个广泛...

    Linux静态库和动态库 - feisky - 博客园.mht

    Linux静态库和动态库 - feisky - 博客园.mht

    ffmpeg-4.3-arm64含静态库-动态库-调试信息-(内含三个压缩包).zip

    ffmpeg linux 下 arm64 环境使用的动态库和静态库打包, 内含三个压缩包: 《ffmpeg-4.3-arm64-动态库.zip》 《ffmpeg-4.3-arm64-含静态库-动态库.zip》 《ffmpeg-4.3-arm64-含静态库-动态库-带调试信息.zip》

    Qt5.15.12静态库-已编译版本-Windows32位-VS2019编译

    静态库的优缺点** 优点:无需担心运行环境的库依赖问题,程序更独立;减少因库版本不匹配导致的运行问题。 缺点:生成的可执行文件体积大,可能增加内存占用;更新库时需要重新编译整个项目。 **6. 使用和部署** ...

    qt调用opencv的RGB活体识别程序人脸识别-静态RGB单目活体检测-不用动作配合

    qt调用opencv的RGB活体识别程序人脸识别-静态RGB单目活体检测-不用动作配合 视频演示网址 https://v.youku.com/v_show/id_XNDU4NDU0NTE4OA==.html

    动态库静态库测试依赖问题的demo

    在编程世界中,库是代码复用的重要工具,它们封装了特定的功能,使得开发者可以便捷地调用。本文将深入探讨动态库(Dynamic ...在开发和测试过程中,理解这两种库的工作原理和优缺点,能帮助你做出更明智的决策。

    librdkafka 动态库 静态库

    2. **配置步骤**:包括下载librdkafka源码,配置CMake以指定编译类型(动态库或静态库),然后使用VS2015生成解决方案并编译。 3. **使用示例**:编写C++代码调用librdkafka API进行消息生产和消费,如创建Producer...

    Linux下动态和静态链接库的使用

    在Linux系统中,链接库是实现程序功能复用的关键组件,分为静态链接库和动态链接库两种类型。本文主要探讨这两种库的创建、使用及其特点。 1. 静态函数库 静态库通常以`.a`为后缀,如`libxxx.a`。在编译过程中,...

    gmp-6.2.1 静态库和动态库(32位,64位)

    在标题中提到的"gmp-6.2.1 静态库和动态库(32位,64位)",这意味着这个压缩包包含了GMP库的不同版本,用于不同的操作系统架构,包括32位和64位系统,并且提供了静态库和动态库两种形式。 静态库(.a或.lib)是将...

    有关C++静态调用数据库连接以及动态调用数据库连接

    静态调用和动态调用数据库连接是两种不同的方法,它们各自具有独特的优缺点和适用场景。让我们深入探讨这两种方法。 一、静态调用数据库连接(Static Linking) 1. 定义:静态调用是指在编译时将数据库连接库(如...

    动态页面转静态页面

    两者各有优缺点:动态页面能够提供更加个性化的用户体验和服务,但可能消耗更多的服务器资源;而静态页面虽然功能相对简单,但加载速度快、对服务器压力小。因此,在某些情况下,开发者可能会选择将动态页面转换为...

    boost库1.68版本Linux下编译的动态库和静态库

    7. **动态库与静态库的区别**:动态库在运行时由操作系统加载,减少了应用程序的大小,但依赖于系统的环境。静态库则将库代码直接编译进应用程序,无需运行时依赖,但可能导致应用程序体积增大。 Boost库包含的组件...

    GCC编译动态和静态链接库.pdf

    静态库的优点是程序运行时不再需要该库文件,但是缺点是程序的体积较大。静态库的创建过程包括以下步骤: 1. 编辑源程序,并将其编译成 .o 文件。 2. 使用 ar 命令将 .o 文件创建静态库文件。 例如,我们可以使用...

    动态库、静态库的创建与连接

    在这篇文章中,我们将详细介绍动态库和静态库的创建、连接方法及其优缺点。 一、静态库 静态库是一种链接库,它在编译时期将目标文件与库文件打包到可执行文件中。静态库的特点是: * 静态库对函数库的链接是放在...

    Objective-C-2.0程序设计-第9章-多态、动态类型和动态绑定PPT课件.ppt

    在Objective-C 2.0程序设计中,多态(Polymorphism)、动态类型(Dynamic Typing)和动态绑定(Dynamic Binding)是面向对象编程的重要概念,它们为代码提供了灵活性和可扩展性。本章主要围绕这三大主题展开,通过一...

    Qt6.22 Mingw64静态编译

    静态编译意味着在编译应用程序时,将所有依赖的库(如Qt库)合并到最终的可执行文件中,这样生成的程序在运行时不再需要外部的动态链接库(DLLs)。这对于那些需要分发或在不可预知环境运行的应用程序来说非常有用,...

    动态及静态添加右键菜单策略

    动态添加的缺点是需要在程序运行时持续处理,资源占用相对较高。 在提供的两个工程中,“右键菜单--动态”很可能是通过编程语言(如C++、C#或Python)实现了动态添加右键菜单的功能,它可能会包含一个主程序和一些...

Global site tag (gtag.js) - Google Analytics