java - Java中的激进模块化

标签 java

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

7年前关闭。




Improve this question




我所在的开发团队编写并仍然维护着一个纯 Java 意大利面条代码的代码库。其中大部分是在我加入这个团队之前实现的。

我的背景是 Python/Django 开发,Django 社区非常强调“可插拔性”——Django“应用程序”(模块)的一个特性,主要意味着“一件事和一件事好”、可重用性、松散耦合和干净、有意识的 API。一旦我曾经工作过的 Django 团队开始“得到它”,我们就几乎可以零问题地处理凌乱、紧密耦合的大量单体代码。

我们的实践涉及在我们打算在其中使用该应用程序的 Django 项目之外开发 Django 应用程序(根据我收集的资料,这是 Django 开发人员的常见做法)每个人甚至都生活在与整个 Django 项目分开的 Git 存储库中。

现在,我们有机会重构大部分意大利面条代码,在我看来,我从 Django 社区学到的一些东西应该在这里应用。简而言之,我希望看到我们的新代码库开发为一系列“可插拔”模块,每个模块都是在假设它无法访问其他模块(除了它应该合理依赖的模块之外)的情况下编写的。我相信这应该很好地将正确的软件设计的基本原则推广到整个团队。

所以,我提倡的是在我们的新(Spring)项目中为每个我们想要的“功能”拥有一个单独的存储库。每个都有自己独立的构建过程,结果将是一个 .jar 。我们还有一个项目级事物(JSP、静态文件等)的存储库,它的构建过程会产生一个 .war 。 .jar 不会放在 .war 中,而是被视为 Gradle 依赖项(与第三方依赖项相同。)

现在我必须把它卖给老板。他被要求提供该计划的先例示例。显而易见的地方是开源项目,但如果一个项目被拆分为多个存储库,它很可能是多个项目。所以,也许我正在寻找某种套件。作为一个例子,Spring 本身看起来很有希望,但我找不到很多其他的。

我的问题是(对于冗长的背景故事感到抱歉):

  • 有没有这样的先例?
  • 有哪些例子?
  • 是否有任何文档(即使只是一篇博客文章也会有所帮助)提倡这样的事情?
  • 有什么建议可以实现吗?
  • 这甚至是个好主意吗?

  • 提前致谢!

    编辑:是否重构是没有问题的。我们已经决定对我们的大部分代码进行一些大刀阔斧的修改——事实上,主要不是为了“让它更干净”。我的问题是关于我们计划的项目结构是否合理以及如何向决策者证明它的合理性。

    最佳答案

    以下问题比将代码放在磁盘或工件中的哪个位置更重要:
    如果你不明白这一点,你就已经失败了。
    您所描述的不是重构,而是使用更可口的名称进行重写:
    除非你已经在单元测试中覆盖了 100% 的代码;当(而不是如果)这种努力失败时,有人会因此而被解雇,可能是多次失败!
    即使有很棒的单元测试,也有人会错过一些东西,当它最终在生产中被发现时,通常会在数月的默默破坏数据之后,有人会摔倒。
    语义很重要:
    移除 Struts 并用 Spring 替换不是 重构 重写 根据定义。重构将从 Struts 1.1 转移到 2.0,替换 Struts 意味着用其他东西替换所有 Struts 代码,定义为 重写 不重构。
    工作软件有多种伪装:
    企业总是认为他们所拥有的东西是有效的。
    错过最后期限,无论多么小都引入错误,无论多么小都会失去一个功能,误解一个未记录的流程,无论多么小甚至更好地改变一些东西。他们只是在寻找任何问题弱点或潜在的麻烦来传播 FUD,并确保您的努力是失败的,至少在大多数情况下是这样。
    所有这些事情都会让你和你的团队付出政治资本,有人会为这些事情而堕落,无论感知到的失败是多么无辜或毫无值(value)!
    预计结果:
    最有可能的是您和/或其他“非 Java”开发人员,而不是创建这个工作系统的核心 Java 人员,您“非 Java”人员重构(在这种情况下为重写的代码字)并按时交付损坏和不完整或没有按时交货或根本没有交货。

    关于java - Java中的激进模块化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23413746/

    相关文章:

    java - 从 long 到 int 的可能有损转换,JAVA

    java - 如果找不到文件尝试结束程序

    java - JPA 查询返回空值 - 具有空列的复合键

    java - NoClassDefFoundError : org/apache/juli/logging/LogFactory

    java - 在 Java 中将动态 JSON 解析为对象

    java - 分层 Pane 一次后就不起作用

    java - Java 中的继承和方法

    java - 具有高空间一致性的 3D 整数坐标的哈希码

    java - 如何在客户端和服务器之间建立多个 IO 流?

    Java解析.txt文件