【问题标题】:How to properly structure a multi module project?如何正确构建多模块项目?
【发布时间】:2020-11-25 21:26:52
【问题描述】:

这是我在开始新项目时一直在努力解决的问题。所以我决定在这里问一下,看看你认为构建这个项目的最佳方式是什么,希望我能从中学到一些东西。

这是项目的基本描述(我正在使用 Gradle btw 并用 Java 编写)。

我需要制作一个可以在多个平台上运行的插件,例如 Spigot、Bungeecord 和 Velocity,这三个插件都有自己的 API,我需要使用这些 API 来使插件在每个平台上运行。 该项目是一个播音员插件,允许用户设置可配置的播音员,向连接到这些服务器的玩家发送消息。

我的总体思路是:

  1. 通用模块:大部分逻辑可以应用到其他模块 将存储三个模块。
  2. spigot 模块:使用逻辑形式的通用模块并对其进行整形 spigot 可以理解。
  3. bungeecord 模块:使用逻辑形式的通用模块并对其进行整形 bungeecord 可以理解。
  4. 速度模块:使用逻辑形式通用模块并对其进行整形 速度可以理解。

项目应该具备的一些东西是:

  • 具有逻辑加载和启用插件的插件主类(每个 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();
    }
}

需要放置什么而不是 ? 才能获得正确的服务器实例(我无法编辑 ProxiedServerBukkit 类)?

【问题讨论】:

  • 编号项目听起来像是模块的良好开端,其中 2 到 4 是垂直切片。我不确定 complete mess 是什么意思,但适配器模式可能会有所帮助。应该没有重复的代码。
  • 我的意思是我的方法把Object作为参数,然后根据插件运行的平台将其转换为所需的对象,所以结果是很多转换。我不太喜欢这种方法,我不确定是否应该这样做。生病检查适配器模式感谢您的建议。
  • 这就是适配器模式可以提供帮助的地方。公共类由平台特定类包装。平台类知道如何与其平台交互,但使用公共类来获取数据。

标签: java gradle structure project multi-module


【解决方案1】:

这是几个月前的,但为了档案和未来的搜索者的利益,我想提供这个: 是的,你可以像这样返回一个通用类型:

@Overrride
public <T> getServer() {
    return plugin.getInstance();
}

供参考:https://stackoverflow.com/a/31239655/10793514

更多关于泛型的信息:https://www.baeldung.com/java-generics#generic-methods

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 2017-12-26
    • 2021-03-23
    • 1970-01-01
    • 2020-10-02
    • 2011-01-16
    • 1970-01-01
    • 2012-08-09
    • 2020-11-01
    相关资源
    最近更新 更多