像这样的线性调用,不出错都好说,如果中间有环节出错了,要怎么处理呢?
有一个基本的原则要遵守,便是不能只返回原始数据。
我们会对返回值做一次包装,比如Java中的Option,通过option.isPresent()来判断是否有值,通过opiton.get()来获取原始数据。
如果你的措辞没有现成的处理办法,你可以自己定义一个构造,它会返回这两种情形:
{:ok, value} 成功+数据
{:error, reason} 失落败+缘故原由
然后不才一个管道中,像这样根据传入的参数不同,来处理成功和失落败的逻辑:
image-20221004113321607思维转换练习这章后面也有一些练习,一起来转换一下思维吧~
一、下面的需求表达为一个顶层的转换吗?也便是说,对付每一个需求,确定输入和输出。
将运费和发卖税加入订单中
根本订单->待发货订单 ,按照传统的编码思路,我们会有一个订单类,然后会实现一个打算运费的方法、一个打算发卖税的方法。但是改变思路,专注于转换的话,就只用考虑输入和输出是什么,详细的转换办法就变成了黑盒的。
你的运用程序从一个文件中加载配置信息
文件路径->配置信息
有人登录到一个网络运用程序
上岸信息(用户名+密码之类的)->会话session
实在就这个练习来说,后面两个还是比较常规的,基本上都会这么去实现,以是,从第一题的觉得会比较明显一点,确实是思考的方向不一样了。
二、你要验证一个字符串是否是18到150之间的整数,如果是,则输出这个整数。
过程大概是这样:
字符串
→ [验证和转换]
→:ok, value}{:error, reason
须要把[验证和转换]的部分明确定义。
字符串→ [将字符串转换成整形] → [检讨值是否 >= 18] → [检讨值是否 <= 150] → {:ok, value} | {:error, reason}这一章实在依旧是解耦的一种手段,让程序像乐高积木一样,用到那块拼那块,用不到了就拆掉,每个转换都是独立模块,可以自由地组合拼接。