【发布时间】:2020-11-25 21:26:52
【问题描述】:
这是我在开始新项目时一直在努力解决的问题。所以我决定在这里问一下,看看你认为构建这个项目的最佳方式是什么,希望我能从中学到一些东西。
这是项目的基本描述(我正在使用 Gradle btw 并用 Java 编写)。
我需要制作一个可以在多个平台上运行的插件,例如 Spigot、Bungeecord 和 Velocity,这三个插件都有自己的 API,我需要使用这些 API 来使插件在每个平台上运行。 该项目是一个播音员插件,允许用户设置可配置的播音员,向连接到这些服务器的玩家发送消息。
我的总体思路是:
- 通用模块:大部分逻辑可以应用到其他模块 将存储三个模块。
- spigot 模块:使用逻辑形式的通用模块并对其进行整形 spigot 可以理解。
- bungeecord 模块:使用逻辑形式的通用模块并对其进行整形 bungeecord 可以理解。
- 速度模块:使用逻辑形式通用模块并对其进行整形 速度可以理解。
项目应该具备的一些东西是:
- 具有逻辑加载和启用插件的插件主类(每个 API 都有自己的类,该类扩展用于启动插件的主类)。
- 从 yaml 文件加载配置的文件管理类,例如播音员的消息、常规设置(每个 API 都有自己的用于读取 yaml 文件的类)。
- 播音员构建器和处理类将使用文件管理类读取播音员配置文件,并将播音员构建为对象和处理程序,以将其发送给播放器等(每个 API 都有自己与播放器交互的方式)。
- 具有将由用户和玩家执行的命令逻辑的命令系统(每个 API 都有自己的处理命令的逻辑)。
所以我的问题是,你将如何用最少的可重复代码来构建这个项目,复制基本上做同样事情的类,但每个 API 的功能略有不同,并保持良好的代码可读性?
我现在拥有的是 Spigot 的工作版本,但当我开始添加对 Bungeecord 的支持时,它变得一团糟。
编辑: 我遇到的一个更常见问题的示例:
Spigot API 具有 Bukkit 类,该类具有返回 Server 对象的 getServer() 方法。
Bungeecord API 具有 ProxiedServer 类,该类具有返回 ProxiedServer 对象的 getInstance() 方法。
我有这样的事情:
public interface MyPlugin {
? getServer();
}
//extends JavaPlugin is required by Spigot API.
public class SpigotPlugin extends JavaPlugin implements MyPlugin {
@Overrride
public ? getServer() {
return Bukkit.getServer();
}
}
//extends Plugin is required by Bungeecord API.
public class BungeeCordPlugin extends Plugin implements MyPlugin {
@Overrride
public ? getServer() {
return ProxiedServer.getInstance();
}
}
需要放置什么而不是 ? 才能获得正确的服务器实例(我无法编辑 ProxiedServer 或 Bukkit 类)?
【问题讨论】:
-
编号项目听起来像是模块的良好开端,其中 2 到 4 是垂直切片。我不确定 complete mess 是什么意思,但适配器模式可能会有所帮助。应该没有重复的代码。
-
我的意思是我的方法把
Object作为参数,然后根据插件运行的平台将其转换为所需的对象,所以结果是很多转换。我不太喜欢这种方法,我不确定是否应该这样做。生病检查适配器模式感谢您的建议。 -
这就是适配器模式可以提供帮助的地方。公共类由平台特定类包装。平台类知道如何与其平台交互,但使用公共类来获取数据。
标签: java gradle structure project multi-module