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

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

时间:2023-02-23 06:56:08浏览次数:48  
标签:Java 18 代码 DSL 2.4 2.7 9.2 Lambda

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,代码,DSL,2.4,2.7,9.2,Lambda
From: https://www.cnblogs.com/lying7/p/17126983.html

相关文章

  • JavaBean
    JavaBean实体类JavaBean有特定的写法:必须要有一个无参构造属性必须私有化必须有对应的get/set方法一般用来和数据库的字段做映射ORM:对象关系映射表---->类字......
  • 决战圣地玛丽乔亚Day18----关于mysql死锁+ mysql索引的数据结构相关
    Mysql为什么会产生死锁? 事务A、B分别拿到1,4的独占行锁,然后再去拿4,1的行锁,都会由于另一个事务不释放锁等待,造成了循环等待的局面。(1)同一时刻只能有一个事务持有这......
  • 配置java环境后 Linux报错:bash:ls:command not find 如何解决
    Linux命令行输入命令执行后报“bash:ls:commandnotfound”,这是由于系统PATH设置问题,PATH没有设置正确,系统就无法找到精确命令了。解决办法:1、在命令行中输入:exp......
  • 2月22日javaweb学习之Maven
    Maveb是专门用于管理和构建java项目的工具,它的主要功能有:1.提供一套标准化的项目结构。2.提供一套标准化的构建流程(编译、测试、打包、发布......)3.提供了一套依赖管理......
  • JavaScript中止网络请求
    constcontroller=newAbortController();//1.创建AbortController实例constsignal=controller.signal;//2.创建信号fetch('/some/api',{signal})//3.......
  • #yyds干货盘点#【愚公系列】2023年02月 .NET/C#知识点-LINQ和lambda实现左、右、内链
    前言1.左连接table1居左,故谓之左连接。这种情况下,以table1为主,即table1中的所有记录均会被列出。有一下三种情况:1、对于table1中的每一条记录对应的城市如果在table2中也......
  • Spring IOC官方文档学习笔记(十二)之基于Java的容器配置
    1.@Bean与@Configuration(1)标注于类之上的@Configuration注解与标注于方法之上的@Bean注解是支持基于Java的容器配置的核心,被@Bean注解标注的方法用于实例化bean并将其......
  • Java序列化
    什么是序列化序列化:将对象转化为可传输字节序列的过程为序列化反序列化:把字节序列还原为对象的过程称之为反序列化为什么要序列化序列化的最终目的是为了对象可以跨平......
  • AcWing356/洛谷P4180 次小生成树
    涉及知识点:最小生成树,倍增题意题目链接(洛谷)题目链接(AcWing)题目写的很清楚,给定一张N个点M条边的无向图,求无向图的严格次小生成树。设最小生成树的边权之和为sum,严格次......
  • java之并发编程(上)
    回顾1、线程与进程进程:正在运行的程序,进程包含至少一个或多个线程2、创建线程的方式实现Runable接口继承Thread类(不建议使用,java是单继承,可扩展性差),用start方法通知c......