quartus状态机生成

这个想法是几周前在设计“生成器”类时想到的,该类必须将输入发送给封装的Writer 。 实际上,它是Builder模式。 但是,规则有些复杂,用户必须以某种方式调用add...()方法,才能正确生成输出。

不用说,我不喜欢只有一个BuilderImpl类可以在内部设置和验证各种标志,以便知道什么以及什么时候可以做的选择。 解决方案是构建一个有限状态机 ,因为构建者的界面很流畅。 像往常一样,在这篇文章中,我将通过一个例子来说明。

汤姆和杰瑞(Tom&Jerry)–《老鼠麻烦》,威廉·汉纳(William Hanna)和约瑟夫·巴贝拉(Joseph Barbera)

假设我们要实现一个DateBuilder ,它将以经典的dd.mm.yyyy格式(可能还带有其他类型的分隔符,不仅是. )生成一个String 。 为了简单起见,我们将仅关注格式,而忽略诸如一个月中的天数,leap年之类的情况。首先是界面:

public interface DateBuilder {DateBuilder addDay(final Integer day);DateBuilder addMonth(final Integer month);DateBuilder addYear(final Integer year);DateBuilder addSeparator(final String sep);String build();}

上面的接口将有五个实现: StringDateBuilder (公共入口点), ExpectSeparatorExpectMonthExpectYearExpectBuild (这四个是受程序包保护的,对用户不可见)。 StringDataBuilder看起来像这样:

public final class StringDateBuilder implements DateBuilder {private final StringBuilder date = new StringBuilder();@Overridepublic DateBuilder addDay(final Integer day) {this.date.append(String.valueOf(day));return new ExpectSeparator(this.date);}@Overridepublic DateBuilder addMonth(final Integer month) {throw new UnsupportedOperationException("A day is expected first! Use #addDay!");}@Overridepublic DateBuilder addYear(final Integer year) {throw new UnsupportedOperationException("A day is expected first! Use #addDay!");      }@Overridepublic DateBuilder addSeparator(final String sep) {throw new UnsupportedOperationException("A day is expected first! Use #addDay!");}@Overridepublic String build() {throw new UnsupportedOperationException("Nothing to build yet! Use #addDay!");}}

我相信您已经明白了:其他四个实现将处理它们自己的情况。 例如, ExpectSeparator将从addSeparator(...)之外的所有方法中引发异常,在该方法中,它将分隔符附加到StringBuilder并返回ExpectMonth的实例。 最后,这台机器的最后一个节点将是ExpectBuild (在添加年份之后由ExpectYear返回),它将抛出除了build()之外所有方法的异常。

这种设计帮助我将代码对象保持较小,没有标志和if/else分支。 与往常一样,上面的每个类都易于测试,并且通过切换返回的实现,可以轻松更改构建器的行为。

当然,我不是唯一想到这些的人。 尼古拉斯·弗兰克(NicolasFränkel)就在上个月在这里写下了这个想法。 但是,我觉得有必要带走我的两分钱,因为我不完全喜欢他的例子:他为构建器的节点使用了不同的接口,以保持构建器的安全性和防白痴性(例如,甚至不允许用户查看addMonthbuild方法(如果他们不应该使用的话)。 我不同意这一点,因为这意味着我需要管理更多的代码,此外,客户端将与构建者的逻辑相结合。 我宁愿只强制用户到学习如何使用生成器(它不应该是他们的一个大的努力,因为他们应该搭上一个最简单的单元测试任何异常,对不对? 吧... )

我也找到了这篇文章 ,它提供了更广泛,更理论上的解释,并不一定与Builder模式相关联–如果您考虑一下,这种方法可以用于任何必须根据其内部状态更改其行为的对象。

翻译自: https://www.javacodegeeks.com/2018/12/builder-fail-fast-state-machine.html

quartus状态机生成

quartus状态机生成_生成器作为(快速失败)状态机相关推荐

  1. VHDL学习:利用Quartus自带库3步快速完成状态机

    Quartus自带库里面有各种编程语言的模板,供开发者参考. 初学者利用VHDL实现状态机比较生疏的情况下,可以调出该模板,适当修改即可. 本文将描述如何利用Quartus自带库调出状态机模板,并适当 ...

  2. 有数字要生成条形码生成器_如何制作自己的“意外”数字生成器

    有数字要生成条形码生成器 有时让人们感到惊讶的是,随机数生成是计算机科学中一个经典的著名问题,因为它看起来应该很容易. 只需选择一个数字. 但是,很难使计算机随机化. 许多Linux用户对/dev/r ...

  3. java 登陆验证失败_使用Java 8流进行快速失败的验证

    java 登陆验证失败 我已经失去了看过使用快速失败验证代码状态的代码的次数,方法如下: public class PersonValidator {public boolean validate(P ...

  4. 远程过程调用失败_快速失败机制amp;失败安全机制

    这是why技术的第29篇原创文章 之前在写<这道Java基础题真的有坑!我求求你,认真思考后再回答.>这篇文章时,我在8.1小节提到了快速失败和失败安全机制. 但是我发现当我搜索" ...

  5. Spring Cloud Alibaba 2.2.6发布:新增Nacos注册快速失败的配置

    7月12日消息,Spring Cloud Alibaba新版本2.2.6发布,该版本适配Spring Cloud Hoxton.SR9. 下面一起来看看该版本内容: 特性增强 Nacos 支持服务注册 ...

  6. Java - Java集合中的快速失败Fail Fast 机制

    文章目录 什么是 fail-fast 源码解读 Itr 为什么对集合的结构进行修改会发生并发修改异常-源码分析 修改方法之 remove 修改方法之 add 案例分享 [案例一] [案例二] [案例三 ...

  7. ConcurrentModificationException 及 快速失败(fail-fast)

    详解: 快速失败:Java中Iterator(迭代器)实现原理 - wss96 - 博客园 迭代器使用:JAVA集合:迭代器实现原理_开始写bug~~~-CSDN博客_java迭代器原理 综合:Jav ...

  8. verdi显示状态机名字_如何写好状态机(三)

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  9. 咱们来聊聊快速失败和安全失败

    一:快速失败(fail-fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除.修改),则会抛出Concurrent Modification Exceptio ...

最新文章

  1. 太阳能正在崛起 光伏养老蔚然成风
  2. 深度学习和浅层学习 Deep Learning and Shallow Learning
  3. 基于JAVA+Servlet+JSP+MYSQL的会议管理系统
  4. spark自定义函数
  5. Android 代码混淆、Android Proguard(混淆)
  6. 刚刚!中科院主导的国产编程语言木兰负责人回应了!承认32位机器上,是基于Python二次开发!...
  7. python等比例压缩图片_Python批量按比例缩小图片脚本分享
  8. 股票历史数据下载工具_免费在线批量下载股票历史数据工具
  9. 图论1:哥尼斯堡七桥问题的证明
  10. delphi BMP与jpg互转
  11. Win2016 安装及配置 + 存储卷管理
  12. 【设计模式】七大原则之“依赖倒转原则”
  13. isis宣告网络_ISIS是一个分级的链接状态路由协议
  14. 【Rust日报】 2019-04-04
  15. 金马公关为什么选择使用活字格来搭建《会议邀约系统》
  16. 2020年全球EDA软件行业市场竞争格局分析 三巨头三足鼎立
  17. OpenGL入门(一)
  18. Docker容器实时日志查看器Dozzle
  19. 智能卡 安全体系 读权限 写权限 密钥后续权限
  20. 【答读者问46】一场由夏普率引发的乱斗(backtrader,pyfolio和聚宽都是怎么计算夏普率的?)

热门文章

  1. 牛客题霸 [数组中未出现的最小正整数] C++题解/答案
  2. 【正睿2021寒假省选第二轮集训 day 1】令牌生成 (组合数+二分)
  3. Loj#2769-「ROI 2017 Day 1」前往大都会【最短路树,斜率优化】
  4. YbtOJ#943-平方约数【莫比乌斯反演,平衡规划】
  5. P4197-Peaks【Kruskal重构树,主席树】
  6. P4564-[CTSC2018]假面【期望dp】
  7. P3889-[GDOI2014]吃【线段树】
  8. jzoj3853-帮助Bsny【dp】
  9. jzoj1610(初中)-导弹【最大匹配,最短路,二分答案】
  10. ssl初一组周六模拟赛【2018.4.7】