草庐IT

读编程与类型系统笔记04_类型安全

躺柒 2023-03-28 原文

1. 避免基本类型偏执

1.1. 把值声明为基本类型,并对其意义做一些隐含的假定时

1.1.1. 例如:使用number表示邮编

1.1.2. 例如:使用string表示电话号码

1.2. 定义类型来显式捕捉值的含义,从而避免错误解释值

1.2.1. 新类型只是简单地封装了一个数字或字符串

1.2.2. 消除由于不兼容的假定而导致的众多问题

1.2.3. 使代码的可读性变得更好

2. 实施约束

2.1. 通过构造函数实现

2.1.1. readonly,可以保证在构造之后,值会始终有效

2.1.2. 声明为private,并通过一个getter来访问,这样就只能获取该值,不能设置该值

2.1.3. 强制使值有效

2.1.4. 构造函数不返回值

2.1.4.1. 要么完成初始化

2.1.4.2. 要么抛出异常

2.1.5. 应该仅初始化对象的成员

2.2. 通过工厂实现

2.2.1. 场景

2.2.1.1. 不想抛出异常

2.2.1.2. 想返回表示失败的值

2.2.1.3. 构造函数做不到

2.2.1.4. 构造和验证对象的逻辑很复杂

2.2.1.4.1. 构造函数不应该做太繁重的工作

2.3. 基本类型不允许我们直接施加某些限制

2.3.1. 创建新的类型

2.3.1.1. 封装额外的约束

2.3.1.2. 保证不会包含无效的值

3. 添加类型信息

3.1. 类型转换

3.1.1. 一个表达式的类型转换为另一个类型

3.1.2. 有些必须使用额外的代码来完成

3.1.2.1. 显式类型转换

3.1.3. 有些能够由编译器自动完成

3.1.3.1. 隐式类型转换

3.2. 在类型系统之外跟踪类型

3.2.1. Eithe类型

3.2.1.1. 在赋值后,类型检查器不再知道实际的value被存储为TLeft还是TRight

3.2.1.2. 检查this.isLeft()是否为true

3.2.1.3. getLeft()实现执行必要的检查

3.2.1.4. 并按照需要处理无效调用

3.2.1.5. 把值强制转换为对应的类型

3.2.1.5.1. 类型检查器忘记了我们在赋值时提供的类型
3.2.1.5.2. 正确使用时,强制转换是一种很强大的技术,允许我们改进值的类型

3.3. 常见类型转换

3.3.1. 向上转换

3.3.1.1. 将派生类解释为基类

3.3.2. 向下转换

3.3.2.1. 从父类转换到派生类

3.3.2.2. 大多数强类型语言不会自动完成

3.3.2.3. 不是安全的

3.3.3. 拓宽转换

3.3.3.1. 从固定位数的整数类型转换为另外一个更多位数的整数类型

3.3.3.1.1. 如:8位无符号整数转为16位无符号整数

3.3.3.2. 安全的

3.3.4. 缩窄转换

3.3.4.1. 将位数更多的整数转换为位数更少的整数

3.3.4.2. 具有危险性

3.4. 在运行时存储额外的类型信息

3.4.1. 包含一个is操作符

3.4.1.1. 检查某个值是否是特定类型的实例

3.4.2. 其代价是为每个对象实例在内存中存储额外的数据

3.5. 隐藏和恢复类型信息

3.5.1. 同构集合

3.5.1.1. 包含相同类型的项的集合

3.5.1.2. 不需要隐藏类型信息

3.5.2. 异构集合

3.5.2.1. 包含不同类型的项的集合

3.5.2.2. 需要隐藏一些类型信息

有关读编程与类型系统笔记04_类型安全的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  3. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  7. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  8. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  9. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐