草庐IT

读Java实战(第二版)笔记18_基于Lambda的领域特定语言

躺柒 2023-03-28 原文

1. 编程语言

1.1. 仍然是一门语言

1.1.1. 以最清晰、最容易理解的方式传递信息

1.2. 代码的易读性和易理解性在软件中的重要性甚至更胜一筹

2. 领域特定语言DSL

2.1. 为了解决某个特定业务领域问题的一种自定义语言

2.1.1. 一种小型语言

2.1.2. 大多都不通用

2.1.3. 为某个特定领域定制化而生

2.2. 流畅式(fluent style)

2.2.1. 链接(chaining)方法

2.3. 别的底层实现细节都应该被隐藏

2.3.1. 以这种方式设计的DSL才是一个用户友好的DSL

2.4. 产生原因

2.4.1. 沟通为王

2.4.1.1. 代码应该能清晰地表达它的意图

2.4.1.2. 被“非程序员”所理解

2.4.1.3. 领域专家才能及时加入以验证代码是否符合业务需求

2.4.2. 代码只编写一次,但会被阅读很多次

2.4.2.1. 代码的可读性对软件的可维护性非常重要

2.5. 资产

2.5.1. 提升了你代码的抽象层次

2.5.2. 使其能更加专注于业务目标

2.5.3. 具有更好的可读性

2.6. 负担

2.6.1. 独立的代码需要测试和维护

2.7. 优点

2.7.1. 简洁

2.7.1.1. 封装了业务逻辑

2.7.2. 可读性

2.7.3. 可维护性

2.7.4. 高层的抽象性

2.7.5. 专注

2.7.5.1. 专门为表述业务领域规则而设计的语言

2.7.6. 关注点隔离

2.7.6.1. 使用专用的语言描述业务逻辑使得与业务相关的代码可以同应用的基础架构代码相分离

2.8. 缺点

2.8.1. 设计比较困难

2.8.2. 开发代价

2.8.2.1. 一项长期投资

2.8.3. 额外的中间层

2.8.3.1. 避免带来性能问题

2.8.4. 要掌握的语言

2.8.5. 宿主语言的局限性

3. 外部DSL

3.1. 独立DSL(stand-alone DSL)

3.2. 需要付出更大的代价

3.2.1. 从无到有进行创建,其语法与宿主语言几乎完全无关

3.2.2. 设计DSL的语法

3.2.3. 实现解析器和执行器(evaluator)

4. 内部DSL

4.1. 需要暴露恰当的类和方法,以使代码的编写逻辑更流畅

5. “多语言DSL”(polyglot DSL)

5.1. 介于内部DSL与外部DSL之间的解决方案

5.2. 可以在JVM上运行另一种通用编程语言

5.2.1. Scala

5.2.2. Groovy

6. DSL模式

6.1. 方法链接(method chaining)

6.1.1. 需要实现非常冗长的构建器

6.1.2. 为了将顶层构建器与底层构建器相融合,需要使用大量的胶水代码

6.2. 嵌套函数DSL(nested function DSL)

6.3. 使用Lambda表达式的函数序列

6.3.1. 在DSL中使用方法引用

7. Java API中的小型DSL

7.1. 把Stream API当成DSL去操作集合

7.1.1. 可以对集合中的元素进行过滤、排序、转换、归并等操作

7.2. 将Collectors作为DSL汇总数据

8. DSL的实际应用

8.1. SQL是最通用且应用最广泛的DSL

8.2. jOOQ

8.2.1. 一种SQL映射工具

8.3. Cucumber

8.3.1. 行为驱动开发(behavior-driven development, BDD)

8.3.2. 一种基于行为驱动的开发框架

8.4. Spring Integration

8.4.1. 一种实现企业集成模式的Spring扩展库

9. 生成字节码

9.1. 匿名类

9.1.1. 编译器会为每个匿名类生成一个新的.class 文件

9.1.2. 文件名通常以ClassName$1这种形式呈现

9.1.3. 生成大量的类文件是不利的

9.1.3.1. 直接影响应用的启动性能

9.1.4. 每个新的匿名类都会为类或者接口产生一个新的子类型

9.2. Lambda表达式

9.2.1. InvokeDynamic

9.2.1.1. Java7

9.2.1.2. 字节码指令

9.2.1.3. 创建额外的类现在被invokedynamic指令替代了

9.2.1.4. 用于支持运行于JVM上的动态类型语言

9.2.1.5. 将实现Lambda表达式的这部分代码的字节码生成推迟到运行时

9.2.2. 将Lambda表达式的代码体填入到运行时动态创建的静态方法,就完成了Lambda表达式的字节码转换

9.2.2.1. Lambda表达式的代码块到字节码的转换由高层的策略变成了纯粹的实现细节

9.2.2.2. 对无状态非捕获型Lambda,可以创建一个Lambda对象的实例,对其进行缓存,之后对同一对象的访问都返回同样的内容

9.2.2.3. 没有带来额外的开销,没有额外的字段,也不需要进行静态初始化

9.2.2.4. 没有额外的性能开销,因为这些转换都是必须的,并且结果也进行了链接

9.2.2.4.1. 仅在Lambda首次被调用时需要转换,其后所有的调用都能直接跳过这一步,直接调用之前链接的实现

有关读Java实战(第二版)笔记18_基于Lambda的领域特定语言的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

    我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. ruby-on-rails - Ruby on Rails I18n 插值 - 2

    大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!

  9. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐