scratch拼图编程_使用模块化和项目拼图进行编程。 使用最新的抢先体验版的教程

本文深入探讨了使用模块化方法在Scratch编程中的应用,讲解了模块的命名、依赖性和可读性,以及如何创建和拆分模块。通过Java的例子解释了模块在运行时的角色,强调了模块化的重要性,包括对可靠配置和封装的提升,有助于避免传统的JAR地狱问题。文章还讨论了隐含可读性、服务和迁移策略,为逐步迁移到模块化系统提供了指导。
摘要由CSDN通过智能技术生成

scratch拼图编程

可以将软件视为交互部分的系统,在Java中,通常将每个部分打包在其自己的JAR中。 从概念上讲,一部分包括三个属性:名称,供世界其他地方使用的公共API以及对其他部分的依赖关系。 这种类似于图形的模型可帮助开发人员和工具剖析,分析软件系统并与之协同工作。

但是,这些属性都不存在于Java运行时中,该运行时使用类路径访问一堆JAR,并将它们全部卷成一个大泥巴。 JAR之间的任何区别都将完全消失,仅保留一套扁平的程序包,而无法进行进一步的验证。 诸如“是否所有这些必需的JAR?”,“这些甚至是正确的JAR?”,“是否存在冲突?”或“仅使用公共API?”等重要问题。 运行的JVM无法回答。

因此,一方面存在一个结构良好的模型,该模型说明了系统如何模块化以及各部分之间如何相互依赖。 另一方面,存在一个几乎完全非结构化名称空间的运行时现实。 这种不匹配是被亲切地称为JAR hell和背后对内部API的依赖的驱动力。 它还会导致不良的启动性能并削弱安全性

拼图项目将增强编译器和运行时,使其更接近结构化模型。 它的主要目标是可靠的配置 (通过声明依赖项)和强大的封装 (通过隐藏内部结构),而这两者的代理是模块的概念。

介绍模块

Oracle首席架构师马克·雷因霍尔德(Mark Reinhold)从强烈推荐的设计概述中引用模块系统状态

一个模块是代码和数据的命名,自描述的集合。 它的代码被组织为一组包含类型(即Java类和接口)的软件包。 其数据包括资源和其他种类的静态信息。

为了控制其代码如何引用其他模块中的类型,模块声明其需要哪些其他模块 才能进行编译和运行。 为了控制其他模块中的代码如何引用其包中的类型,模块声明要导出的包中的哪个

因此,与JAR相比,模块具有JVM可以识别的名称,声明其依赖于其他模块,并定义哪些包是其公共API的一部分。

名称

模块名称可以是任意的,但不能冲突。 为此,建议使用标准的反向域名程序包。 尽管这不是必须的,但这通常意味着模块名称是它包含的软件包的前缀。

依赖性和可读性

一个模块列出了要编译和运行的其他模块。 再次从“模块系统状态”:

当一个模块直接依赖于另一个模块时,第一个模块中的代码将能够引用第二个模块中的类型。 因此,我们说第一模块读取第二 模块 ,或者等效地,第二模块被第一 模块读取

[…]

模块系统确保每个依赖关系都由另一个模块精确地满足,没有两个模块可以互相读取,每个模块最多只能读取一个定义给定程序包的模块,并且定义同名程序包的模块不会互相干扰。

这种可读性的概念是可靠配置的基础:当违反任何条件时,模块系统将拒绝编译或启动代码; 对脆性类路径模型的巨大改进。

出口和可达性

一个模块列出了它导出的软件包。 在以下情况下,一个模块中的类型只能由另一模块中的代码访问

  • 公开类型
  • 包含的包由第一个模块导出
  • 第二个模块读取第一个

这意味着公众不再是真正的公众。 非导出包中的公共类型与导出包中的非公共类型一样,对外界隐藏。 因此,“公共”比当今的包私有类型更加隐蔽,因为模块系统甚至 不允许通过反射进行访问,因为当前已实现了Jigsaw,命令行标志是解决此问题的唯一方法。

因此,可访问性建立在可读性和export子句的基础之上,从而创建了强大的封装基础,模块作者可以在其中清楚地表达模块API的哪些部分是公开的和受支持的。

示例:创建我们的第一个模块

假设我们有一个监视网络中运行的微服务的应用程序。 它会定期与他们联系并使用他们的响应来更新数据库表以及漂亮的JavaFX UI。 目前,让我们假设应用程序是作为一个没有任何依赖项的项目开发的。

现在,让我们使用Jigsaw切换到Java 9! (早期访问版本在java.net可用 -本文中提供的代码示例和命令是从12月22日开始为版本96创建的。)尽管Java依赖分析器jdeps已经存在于JDK 8中,我们需要使用JDK 9版本,以便它了解模块。

首先要注意的是,我们可以选择忽略模块。 除非代码依赖于内部API或某些其他JDK实现细节(在这种情况下事情会中断 ), 否则可以像使用Java 8一样完全编译和执行应用程序。只需将工件(及其依赖项,如果有)添加到classpath并调用main 。 瞧,它运行了!

要将代码移入模块,我们必须为其创建模块描述符 。 这是源目录根目录中名为module-info.java的源代码文件:

module com.infoq.monitor {
    // add modules our application requires
	// add packages our application exports
}

我们的应用程序现在是名为com.infoq.monitor的模块。 为了确定它所依赖的模块,我们可以使用jdeps

jdeps -module ServiceMonitor.jar

这将列出我们的应用程序使用的软件包,更重要的是, java.logging, java.sql, javafx.base, javafx.controls, javafx.graphics.它们来自哪些模块: java.basejava.logging, java.sql, javafx.base, javafx.controls, javafx.graphics.

覆盖了依赖性之后,我们现在可以考虑可以导出哪些软件包。 由于我们在谈论独立应用程序,因此我们不会导出任何内容。

module com.infoq.monitor {
    requires java.base; // see more about that below
    requires java.logging;
    requires java.sql;
    requires javafx.base;
    requires javafx.controls;
    requires javafx.graphics;
    // no packages to export
}

编译与不使用Jigsaw相同,只是我们必须在源文件列表中包括module-info.java

javac -d classes/com.infoq.monitor ${source files}

现在,所有类都被编译为classes/com.infoq.monitor ,我们可以从它们创建一个JAR:

jar -c \
    --file=mods/com.infoq.monitor.jar \
    --main-class=com.info
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值