会员
周边
众包
新闻
博问
闪存
赞助商
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
躺柒
博客园
首页
新随笔
联系
订阅
管理
随笔 - 788
文章 - 0
评论 - 17
阅读 -
49126
读编程与类型系统笔记03_组合
合集 - 读编程与类型系统(12)
1.
编程与类型系统读后总结与感想
2023-01-25
2.
读编程与类型系统笔记01_类型简介
2023-01-08
3.
读编程与类型系统笔记02_基本类型
2023-01-09
4.
读编程与类型系统笔记03_组合
2023-01-10
5.
读编程与类型系统笔记04_类型安全
2023-01-11
6.
读编程与类型系统笔记05_函数类型
2023-01-12
7.
读编程与类型系统笔记06_函数类型的高级应用
2023-01-13
8.
读编程与类型系统笔记07_子类型
2023-01-14
9.
读编程与类型系统笔记08_面向对象变成的元素
2023-01-15
10.
读编程与类型系统笔记09_泛型数据结构
2023-01-17
11.
读编程与类型系统笔记10_泛型算法和迭代器
2023-01-18
12.
读编程与类型系统笔记11_高级类型及其他
2023-01-19
1.
复合类型
1.1.
乘积类型
1.2.
组合一个或多个类型将得到一个新类型,其值为组成类型的全部可能的组合
1.3.
元组
1.3.1.
一组类型构成,通过它们在元组中的位置可以访问这些组成类型
1.3.2.
一种特殊的分组数据的方式,允许我们将不同类型的多个值作为一个值进行传递
1.3.3.
使用out参数,也就是由函数来更新实参,但这会让代码更难理解
1.3.4.
按照分量值的位置来访问值
1.3.5.
可以内联声明它们
1.3.6.
自制元组
1.4.
记录类型
1.4.1.
记录或者结构
1.4.2.
与元组类型相似,可将其他类型组合在一起
1.4.3.
为分量设置名称,并通过名称来访问值
1.4.3.1.
发生歧义的可能性较低
1.4.4.
最好定义带命名分量的记录,而不是传递元组
1.4.5.
提供一个单独的定义
1.4.5.1.
为变量提供了额外的意义
1.5.
不变量
1.5.1.
确保值的格式正确的规则
1.5.2.
一组规则规定了什么样的记录是格式正确的记录,则应该使用私有变量,并使用方法来更新这些变量,以确保规则得到实施
1.5.3.
使成员不可变
1.5.3.1.
初始化时能够确保记录是格式正确的,然后可以允许外部代码直接访问成员,因为外部代码不能修改它们
1.5.3.2.
不需要使用函数让它们保证不变量
1.5.3.3.
成员只有在构造时才会设置一次
1.5.3.4.
在不同的线程中并发访问这些数据是安全的,因为数据不会改变
1.5.3.5.
缺点:每当需要一个新值时,就需要创建一个新实例
1.5.4.
成员声明为私有,使所有访问都通过方法进行
1.5.5.
使成员不可变,并在构造函数中应用验证
2.
多选一
2.1.
结果类型的值是一个或多个成员类型的值集合中的某一个
2.2.
枚举
2.2.1.
示例:一周中的第一天
2.2.1.1.
周日
2.2.1.1.1.
美国
2.2.1.1.2.
加拿大
2.2.1.1.3.
日本
2.2.1.2.
周一
2.2.1.2.1.
ISO 8601标准
2.2.1.2.2.
大多数欧洲国家
2.2.1.3.
声明一组常量值来代表一周中的各天
2.2.1.3.1.
不知道在某个模块中定义了这些常量
2.2.1.3.2.
可能自行解释这个数字
2.2.1.3.3.
采用枚举
2.3.
可选类型
2.3.1.
和类型
2.3.2.
另一个类型T的可选值
2.3.2.1.
类型T的一个值(任意值)
2.3.2.1.1.
其基本类型的值
2.3.2.2.
一个特殊值来指出不存在类型T的值
2.3.2.2.1.
不包含值
2.3.2.3.
可选类型与其基本类型不兼容
2.3.3.
自制可选类型
2.3.3.1.
封装了作为泛型实参提供的另一个类型
2.3.3.2.
hasValue()方法告诉我们是否有一个实际值
2.3.3.3.
getValue()返回该值
2.3.4.
用处
2.3.4.1.
大部分语言中,允许引用类型为null,来编码“没有可用值”的情形
2.3.4.1.1.
使用null容易出错
2.3.4.1.2.
很难判断一个变量什么时候可以为空
2.3.4.1.3.
什么时候不可以为空
2.3.4.1.4.
不要让null(即没有值)自身成为某个类型的一个有效的值
2.3.4.2.
将null与允许值的范围拆分开
2.3.4.3.
看到一个可选类型,就会知道它可以不包含值
2.3.4.4.
该变量不会为null
2.4.
结果或错误
2.4.1.
不用结果和错误
2.4.2.
反模式
2.4.2.1.
同时返回DayOfWeek和一个错误码
2.4.3.
自制Either类型
2.4.3.1.
和类型
2.4.3.2.
TLeft
2.4.3.2.1.
存储错误类型
2.4.3.3.
TRight
2.4.3.3.1.
存储有效值类型
2.4.3.4.
没有类型操作符|的语言
2.4.3.4.1.
JAVA
2.4.3.4.2.
C#
2.4.3.4.3.
自制
2.4.3.4.3.1.
使该值成为一个公有类型
2.4.3.4.3.2.
getLeft()和getRight()方法负责转换回TLeft和TRight类型
2.4.3.5.
不能使用异常
2.4.3.5.1.
优先选择使用Either类型
2.4.4.
异常
2.4.4.1.
不能使用异常情况
2.4.4.1.1.
不能或者不希望抛出异常
2.4.4.1.2.
在进程间或线程间传播错误时
2.4.4.1.3.
当错误本身算不上异常时
2.4.4.1.3.1.
通常发生在处理用户输入的时候
2.4.4.1.4.
当调用操作系统的API,而这些API使用错误码时
2.4.4.1.5.
优先选择使用Either类型
2.5.
变体类型
2.5.1.
标签联合类型
2.5.2.
包含任意数量的基本类型的值
2.5.2.1.
使我们能够表示一个闭合类型集合的值
2.5.3.
标签指的是即使基本类型有重合的值,我们仍然能够准确说明该值来自哪个类型
2.5.4.
不要求这些类型之间存在任何关系
2.5.4.1.
不需要公共接口或基础类型
2.5.5.
自制变体
3.
代数数据类型
3.1.
Algebraic Data Type,ADT
3.2.
乘积类型
3.2.1.
几乎所有编程语言都提供了定义记录类型的方式
3.2.2.
例子
3.2.2.1.
元组类型
3.2.2.2.
记录类型
3.3.
和类型
3.3.1.
相对少的主流语言为和类型提供了语法支持
3.3.2.
多个其他类型组合成为一个新类型,它存储任何一个构成类型的值
3.3.3.
允许我们在一个变量中存储来自不相关类型的值
3.3.4.
例子
3.3.4.1.
可选类型
3.3.4.1.1.
Optional
3.3.4.2.
变体类型
3.3.4.2.1.
Variant
3.3.4.3.
Either
4.
访问者模式
4.1.
在一个对象结构的元素上执行的操作
4.2.
允许在定义新操作时,不改变其操作的元素的类
4.3.
双分派机制
4.3.1.
给定IDocumentItem,调用正确的accept()方法
4.3.2.
给定IVisitor实参,执行正确的操作
4.3.3.
经典实现
4.3.4.
把职责(如屏幕渲染和阅读)拆分到单独的组件(访问者)
4.3.5.
并把职责从文档项中抽象出来
4.4.
面向对象实现需要使用一个公共基类或接口
4.4.1.
扩展性不太好
4.4.2.
不同地方混搭不同的类型
4.4.2.1.
会有大量无法重用的接口或基类
4.5.
正确函数应用到变体的访问者函数
4.5.1.
更好地进行职责划分的一种访问者模式实现
4.5.2.
变体和访问者是泛型类型,可以在不同的问题域中重用
4.5.3.
访问者只负责处理
4.5.4.
文档项只负责存储域数据
4.5.5.
类型之间并没有关系
4.5.6.
不是经典的OOP实现
4.5.6.1.
优势:域对象与访问者完全分离开
4.5.7.
和类型
4.5.7.1.
提供了一种简单、干净的方式
4.6.
将易错代码封装到一个可重用的组件中
4.6.1.
这是降低风险的一种好方法
合集:
读编程与类型系统
好文要顶
关注我
收藏该文
微信分享
躺柒
粉丝 -
50
关注 -
0
+加关注
0
0
升级成为会员
«
上一篇:
读编程与类型系统笔记02_基本类型
»
下一篇:
读编程与类型系统笔记04_类型安全
posted @
2023-01-10 08:02
躺柒
阅读(
42
) 评论(
0
)
编辑
收藏
举报
刷新页面
返回顶部
登录后才能查看或发表评论,立即
登录
或者
逛逛
博客园首页
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
相关博文:
·
读编程与类型系统笔记08_面向对象变成的元素
·
读编程与类型系统笔记02_基本类型
·
第4章 复合类型
·
05 - 面向对象编程(基础部分一)
·
第3章 创建类型
阅读排行:
·
【.NET】调用本地 Deepseek 模型
·
CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
·
DeepSeek “源神”启动!「GitHub 热点速览」
·
我与微信审核的“相爱相杀”看个人小程序副业
·
Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
公告
昵称:
躺柒
园龄:
2年1个月
粉丝:
50
关注:
0
+加关注
<
2025年2月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
合集
学信息系统项目管理师第4版(35)
学系统集成项目管理工程师(中项)(43)
读高性能MySQL(第4版)(21)
读发布!设计与部署稳定的分布式系统(第2版)(34)
随笔及总结(26)
读改变未来的九大算法(10)
读数据压缩入门(11)
读C#代码整洁之道(8)
读编程与类型系统(12)
读函数式编程思维(6)
读Java8函数式编程(9)
读Java实战(第二版)(20)
读Java性能权威指南(第2版)(31)
读SQL进阶教程(17)
选读SQL经典实例(23)
读SQL学习指南(第3版)(13)
读图数据库实战(11)
读程序员的制胜技(15)
读像火箭科学家一样思考(16)
读程序员的README(19)
读算法霸权(13)
读元宇宙改变一切(14)
读AI3.0(10)
读千脑智能(13)
读十堂极简人工智能课(9)
读人工不智能:计算机如何误解世界(10)
读算法的陷阱:超级平台、算法垄断与场景欺骗(20)
读所罗门的密码(21)
读天才与算法:人脑与AI的数学思维(26)
读人工智能时代与人类未来(19)
读AI未来进行式(12)
读AI新生:破解人机共存密码(18)
读人工智能全传(16)
读写给大家的AI极简史(7)
读零信任网络:在不可信网络中构建安全系统(21)
读软件开发安全之道:概念、设计与实施(17)
读软件设计的要素(7)
读构建可扩展分布式系统:方法与实践(16)
读数据湖仓(9)
读数据工程之道:设计和构建健壮的数据系统(34)
读数据质量管理:数据可靠性与数据质量问题解决之道(20)
读数据保护:工作负载的可恢复性(31)
读量子霸权(18)
读算法简史:从美索不达米亚到人工智能时代(15)
读当我点击时,算法在想什么?(7)
读DAMA数据管理知识体系指南(4)
更多
随笔档案
2025年2月(25)
2025年1月(31)
2024年12月(31)
2024年11月(30)
2024年10月(31)
2024年9月(30)
2024年8月(31)
2024年7月(31)
2024年6月(30)
2024年5月(31)
2024年4月(30)
2024年3月(31)
2024年2月(29)
2024年1月(31)
2023年12月(31)
2023年11月(30)
2023年10月(31)
2023年9月(30)
2023年8月(31)
2023年7月(31)
2023年6月(30)
2023年5月(31)
2023年4月(31)
2023年3月(36)
2023年2月(28)
2023年1月(26)
阅读排行榜
1. C#代码整洁之道读后总结与感想(599)
2. 选读SQL经典实例笔记01_检索和排序(369)
3. 读C#代码整洁之道笔记01_C#的编码标准和原则(311)
4. 读C#代码整洁之道笔记04_重构C#代码识别代码坏味道(309)
5. 学信息系统项目管理师第4版系列02_法律法规(268)
评论排行榜
1. 2023年1月随笔(11)
2. 2023年10月随笔之婚宴趣事多(2)
3. 读高性能MySQL(第4版)笔记12_查询性能优化(下)(2)
4. 读Java性能权威指南(第2版)笔记18_垃圾回收E(2)
推荐排行榜
1. 读高性能MySQL(第4版)笔记01_MySQL架构(上)(2)
2. 选读SQL经典实例笔记01_检索和排序(2)
3. 读软件设计的要素01概念(1)
4. 读AI未来进行式笔记01深度学习(1)
5. 读所罗门的密码笔记01_当人类遇见机器(1)
最新评论
1. Re:2023年10月随笔之婚宴趣事多
@gz4621 wondershare mindmaster...
--躺柒
2. Re:2023年10月随笔之婚宴趣事多
大神 思维导图用的什么软件制作的?
--gz4621
3. Re:读高性能MySQL(第4版)笔记12_查询性能优化(下)
@东围居士 建议读新版。...
--躺柒
4. Re:读高性能MySQL(第4版)笔记12_查询性能优化(下)
第4版相比第3版好像缩减了好多内容?楼主推荐第3版还是第4版
--东围居士
5. Re:读Java性能权威指南(第2版)笔记18_垃圾回收E
@屠炉 没有用第三方工具,手动的。 有几个平台直接支持markdown导入,只是要调整一下图片上传即可。...
--躺柒
点击右上角即可分享
支持DeepSeek的编程助手
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库