生成集成库方法_集成块:代码生成器的革新

生成集成库方法

☠代码生成器的死亡☠

尽管Manifold提供了大量高级功能,但其主要重点是消除将源代码与元数据分开的空白。 几十年来,代码生成器一直在弥合这一鸿沟,但并非并非没有有时会削弱缺陷。 如果您开发的项目涉及一个或多个代码生成器,也许您知道我的意思。 请继续阅读,以获得更高效的选择。

元数据断开

我们的现代生活充满了结构化信息或元数据。 它无处不在 ,几乎所有东西都是通过电源线生产的。 结果,软件行业变得不再以代码为中心,而以信息为中心。 尽管进行了这种转换,但半个世纪以来,我们的软件使用元数据的方式实际上并未发生变化。 无论是JSON,XSD / XML,WSDL,CSV,DDL,SQL,JavaScript,XLS,还是多种其他元数据源中的任何一种,大多数现代语言(包括Java)都几乎无法将它们与您的代码连接:

../abc/Person.json

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Person",
  "type": "object",
  "properties": {
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "age": {
      "type": "integer",
      "minimum": 0
    }
  },
  "required": ["firstName", "lastName"]
}

作为Java开发人员,我们希望以类型安全的方式使用元数据-我们希望将Person JSON模式文件用作Person Java类:

class Foo {
  private abc.Person person; // ERROR: Cannot resolve symbol 'abc.Person'
}
还请参见:

当然,Java编译器不知道该如何处理abc.Person ,因此我们诉诸于在单独的构建步骤中运行代码生成器以预先生成所有 JSON类,以便编译器可以轻松使用它们。 此构建步骤对开发生命周期的影响范围从轻度刺激到完全毁灭,具体取决于元数据更改的速度,元数据文件的数量和大小,项目中的使用密度,开发人员数量等。问题包括:

  • 过时的生成类
  • 建造时间长
  • 代码膨胀特别是 具有较大的元数据域
  • 对结构化数据的更改不会使生成的代码无效
  • 不支持增量编译,全部或全部不支持
  • 无法从代码引用导航到结构化数据中的相应元素
  • 无法从结构化数据中找到元素的代码用法
  • 无法重构/重命名结构化数据元素
  • 复杂的自定义类加载器问题,将生成的类加载到单独的加载器中
  • 共享线程上下文加载器的并发问题
  • 生成的代码经常被缓存和共享,从而导致过时的缓存问题
  • 客户经常需要更改元数据,这需要访问代码生成器

歧管框架

流形框架表示对代码生成器的重新思考。 通过通过javac插件机制直接与Java编译器集成,它完全避免了通常涉及的许多缺点。

Type Manifold API的实现者(称为类型流形)与Java编译器建立类型供应商关系-Manifold框架挂接到编译器中,以便在编译器遇到类型名称时,类型流形有助于解析它们,并根据需要在内存中生成代码。 因此,您的应用程序代码可以按名称直接引用元数据源作为Java类型,从而有效地使前面的示例起作用:

class Foo {
  private abc.Person person; // OK <img draggable="false" class="emoji" alt="&#x1f642;" src="https://s.w.org/images/core/emoji/2.3/svg/1f642.svg">
}

可以将类型流形视为编译器要访问的新类型域。 因此,Manifold框架充当javac和类型流形之间的网关,有效地扩展了Java的类型系统,使其包括全新的类型域。 多种类型的歧管可以协同工作; 他们也可以合作,这样一个人贡献的类型就可以馈入下一个,依此类推,形成了一个类型建立管道。

流形

如图所示,类型流形有助于在其域中定义类型。 例如, JSON类型歧管产生在JSON文件中定义的类型。 类型歧管可以以不同的方式对类型做出贡献。 最常见的是类型歧管注册为primary贡献者-它提供了该类型的主体。 JSON类型流形是主要的贡献者,因为它根据JSON模式文件或JSON示例文件提供完整的类型定义。

还请参见:

替代地,类型歧管可以是partialsupplementary贡献者。 例如, 扩展类型歧管是一个辅助贡献者,因为它通过方法,接口和其他功能增强了现有类型。 因此,JSON和扩展类型流形都可以贡献同一个类型,其中JSON流形提供了该类型的主体,而扩展类型流形则贡献了扩展类提供的方法和其他功能。 (我将在以后的文章中介绍扩展。)

总的来说,这种策略消除了困扰常规代码生成和元数据访问的许多问题。 本质上,Type Manifold API重新定义了成为代码生成器的含义。 好处包括:

  • 零周转 –实时,类型安全地访问元数据; 立即做出,发现和使用更改
  • 轻量级 –直接与标准Java集成,不需要特殊的编译器,注释处理器,类加载器或运行时代理
  • 高效,动态 –流形仅生成编译器所需的类型
  • 简单,开放的API –您可以构建自己的类型流形
  • 没有代码生成构建步骤 –从开发构建过程中消除了代码生成器
  • IntelliJ IDEA –全面的IDE支持:代码完成,导航,用法搜索,重构,调试等。

此外,Type Manifold API通过为编写代码生成器的开发人员提供急需的结构和一致性来统一代码生成体系结构。 这终结了只有一名开发人员才能完全理解的“孤狼”代码生成器项目。 而且,您不必投资一次性的IDE集成项目; IntelliJManifold插件可以为您处理所有事情,从增量编译到用法搜索到重构。 最后,即使您已经投资了现有的代码生成器,您仍然可以将其作为包装的类型歧管进行回收-包装器可以将源生产委托给您的现有框架。 在此处了解有关实现类型歧管的更多信息。

协同作用

使用歧管可能最令人耳目一新的好处是它的存在带来的协同作用。 使用Manifold,开发人员可以定义和使用最适合项目需求的元数据,而不必担心构建问题或IDE集成。 他可以创建元数据文件,直接将其用作类型,对其进行修改,并立即在其代码中访问更改。 无需编译,无需调用任何构建步骤。 借助全面的IDE支持,他可以轻松地在元数据元素之间来回导航,从元数据中找到用法,进行重构等。最后,元数据在Java开发生命周期中具有一流的表现! 实际查看它

使用歧管

建立

在Java项目中使用Manifold很容易:

  • 将歧管罐添加到您的类路径(如果使用的是Java 8,则添加到tools.jar)
  • -Xplugin:Manifold添加为java c的参数(仅用于编译)

就这样。

歧管完全支持Java 8Java 9Java 10

歧管也可以与Maven和Gradle一起使用。 在此处了解有关将Manifold添加到项目中的更多信息。

使用IntelliJ

集成块是使用IntelliJ IDEA的最佳经验。

安装

通过以下方式直接从IntelliJ获取IntelliJ IDEA的Manifold插件

Settings | Plugins | Browse Repositories | Manifold

流形

在Manifold支持下创建新项目也非常容易。 有可用的演示视频在这里 。 另外,也可以将歧管添加到现有项目的模块中:

流形

任何想尝试Manifold的人都应该在这里查看示例项目。

还请参见:

新项目

在Manifold支持下创建新项目很容易。 检查一下

将歧管添加到现有模块

您也可以将歧管添加到现有项目的模块中。 检查一下

样例项目

试用歧管样本项目

还请参见:

结论

作为Java的长期开发人员,我亲自参与了多个涉及大量代码生成的项目。 我已经看到了它的使用有时会带来毁灭性的影响:在客户站点以小时为单位衡量的构建时间,开发人员生命周期的士气低落,代码生成器的开发和维护消耗了宝贵的时间等。这是一个更好的解决方案,我认为Manifold取得了良好的进展实现这个目标。 Type Manifolds提供诱人且富有成效的开发经验。 没有要调用的代码生成器,也没有要集成的单独构建步骤,因此元数据就可以正常工作。

还有更多内容需要介绍,我仅使用Type Manifold API进行了介绍。 本系列的后续文章将涵盖:

作为阅读到目前为止的奖励,我将介绍Manifold的最新功能之一…

使用String模板 ,您可以使用$字符将Java表达式直接嵌入到String中。 您可以使用$嵌入一​​个简单变量:

int hour = 8;
String time = "It is $hour o'clock";  // prints "It is 8 o'clock"

或者,您可以在花括号中嵌入任何复杂程度的表达式:

LocalTime localTime = LocalTime.now();
String ltime = "It is ${localTime.getHour()}:${localTime.getMinute()}"; // prints "It is 8:39"

在这里了解更多。

翻译自: https://jaxenter.com/manifold-code-generators-150738.html

生成集成库方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值