偶然今天看到了《松本行弘的程序世界》一书,作者对静态类型和动态类型的优缺点做了详细的解释:
静态类型的优点:
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,没了继承,唯一要做的就是检查对象是否有该方法(还可已在运行时为对象增加行为),避免了令人费解的继承问题。程序也拥有了更好的扩展性。
就这么多了。。。
分享到:
相关推荐
网站伪静态的实现方法----内含说明与jar包网站伪静态的实现方法----内含说明与jar包网站伪静态的实现方法----内含说明与jar包网站伪静态的实现方法----内含说明与jar包网站伪静态的实现方法----内含说明与jar包网站...
python 学习中关于动态类型静态类型强类型弱类型的问题
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
动态网站与静态网站的优缺点,讲解的非常详细,以便于初开发网站的人员的选择。
vue3-real-admin纯静态后台模板vue3-real-admin纯静态后台模板vue3-real-admin纯静态后台模板vue3-real-admin纯静态后台模板vue3-real-admin纯静态后台模板vue3-real-admin纯静态后台模板vue3-real-admin纯静态后台...
“西方哲学中国化”历史与逻辑的静态分层与动态更迭--
Linux静态库和动态库 - feisky - 博客园.mht
30 演示:防火墙建立动态及静态的黑名单、IP-MAC的绑定.exe
ffmpeg linux 下 arm64 环境使用的动态库和静态库打包, 内含三个压缩包: 《ffmpeg-4.3-arm64-动态库.zip》 《ffmpeg-4.3-arm64-含静态库-动态库.zip》 《ffmpeg-4.3-arm64-含静态库-动态库-带调试信息.zip》
webservice的动态调用和静态调用。静态调用是指添加web引用的方式调用。动态调用是指通过反射等方式在代码中加载。
qt调用opencv的RGB活体识别程序人脸识别-静态RGB单目活体检测-不用动作配合 视频演示网址 https://v.youku.com/v_show/id_XNDU4NDU0NTE4OA==.html
附件为Centos6.6环境下静态编译的ffmpeg-3.3.3版本linux可执行程序和SDK库,其中包含基本的x264、aac编解码库;还增加字幕渲染(drawtext参数)、水印叠加等功能;configure配置参数为: ./configure --target-os=...
使用简单的程序展示了C++调用动态库和静态库的方法。 文件结构: exe:笔者部署可运行文件,因开发环境版本不同,可能存在无法直接使用的情况,两个部署文件(copy_ldd.sh及useLib1.sh)可以结合文章分享的(ubuntu下...
静态时序分析与逻辑设计-华为,静态时序分析和动态时序分析源码.zip
静态时序分析与逻辑设计-华为,静态时序分析和动态时序分析源码.rar
奔梦向前:学编程其实很简单,html、css、JavaScript、html5、css3、vue、Canvas实现网页特效页面、新手入门学习、了解网页动画的制作、代码实现网页动态画面-奔梦向前-静态网页设计_网页制作-2020-04-24-3。
静态路由设置---静态路由设置
把动态的网站主页转化成静态网站主页。 用户必须得有动态网站主页! 比如,用户有一个网站: http://www.400seo.net 这个网站的默认主页为:index.aspx 现在要用软件转成静态主页,那么得在软件里进行如下设置: 1、...
静态化-图解静态化-图解静态化-图解静态化-图解静态化-图解静态化-图解静态化-图解静态化-图解静态化-图解