【问题标题】:Organize small utilities functions组织小型实用程序功能
【发布时间】:2010-12-09 18:52:52
【问题描述】:

经过多年的编程,我们都有一组用作帮助实用程序的小函数,我们希望它可以内置,这样我们就可以在任何项目中使用它,并得到更多人的关注(测试和优化)。

我收集了很多这些功能。想问问大家是怎么组织的?你有什么建议吗?

这就是我的做法。我把它放在一个单独的项目(一个 Eclipse 项目)中,比如说“MyUtils”,它被其他项目引用。这是可行的,但是因为 utils 集合变得越来越大,所以 utils 比项目代码大(对于小型项目)有点奇怪。并且要在 Jar 中运送它,您必须手动选择它们(或将它们全部包含在内)。有没有更好的办法?

另外,由于 Java 要求所有函数都在一个类中,所以我有大量静态函数(那些不适合 OOP 的函数),例如从文件名读取文本文件的函数。像这样:

 package nawaman.myutil;

public class UText {

    static public String ReadTextFile(String pFileName) {
        ...
    }
    static public String[] ReadLines_fromFile(String pFileName) {
        ...
    }
    static public String ReadLine_fromFile(String pFileName, int pLineNumber) {
        ...
    }
    ...
}

所以当我需要包含所有功能时,尽管它没有被使用。

有没有更好的方法来做到这一点?

如果有特殊技术,我无论如何都会在 Linux 上使用 eclipse,但如果你有其他工具的技术,我可以免费分享。

【问题讨论】:

  • 如果您认为它们可能对其他人有用,为什么不在 GoogleCode(或类似的东西)上发布?
  • 我认为人们会对他的代码有疑问 - 他没有使用 java 约定和类似的东西。

标签: java code-organization


【解决方案1】:

我将此类实用程序类视为我开发的软件外部的其他组件:

  • 我为每个组件创建一个 Eclipse 项目并将其构建到一个 jar 中。
  • 类按逻辑分组在包中,例如[域].util.net、[域].util.text 等。
  • 在一个项目中,我包含了我需要的依赖项。 Maven 可以在这里为您提供帮助。

您写道,实用程序类有很多静态方法。这是我不经常使用的东西。例如,您显示的文本函数可以重构为一个类或一组类,这些类扩展或实现集合框架中的类和接口。这样可以更轻松地将我的代码与其他库集成。

【讨论】:

  • 感谢您的回复。只是为了确保我明白了:D。所以你为一个实用程序包分离一个项目?我是说。 [domain].util.net 是否在一个包中,而 [domain].util.text 是否在另一个包中?
  • 是的,主要是。但有时如果它们的功能相互依赖,几个包会组合在一起。
【解决方案2】:

这是可行的,但是因为 utils 集合变得越来越大,所以 utils 比项目代码大(对于小型项目)有点奇怪。并且要在 Jar 中运送它,您必须手动选择它们(或将它们全部包含在内)。有没有更好的办法?

对于我的项目,我使用javac 从我的实用程序库中选择所有类。为此,我将项目中的所有类编译到一个空的输出目录。 javac 自动解析对 util 库的依赖关系,因为我将 util 库路径添加为源路径。现在我可以创建一个 jar,其中包含我项目的所有类,并且只包含所需的 util 库类。

另外,由于 Java 要求所有函数都在一个类中,所以我有大量静态函数(那些不适合 OOP 的函数),例如从文件名读取文本文件的函数。

我也是这样做的。但是我尝试使用很多小的 util 类而不是一些大的类,这样我就不必在我的 jar 中包含大量不需要的方法。

【讨论】:

  • 不要使用这种方法来“避免罐子中不需要的方法”(我并不是说该方法不好,只是对于该特定目标没有那么功劳)考虑一个可以分析罐子的工具/代码并执行完全删除“不需要的方法”。以 ProGuard proguard.sourceforge.net> 为例。
  • 如果你在你的 util 类中发现了 bug,你会怎么做?您发布了整个项目的新版本?
  • 这当然取决于错误。如果它影响到我项目中的一些重要功能,那么是的,我会发布一个新版本。
【解决方案3】:

我的“实用程序”有自己的包命名空间和 SVN 存储库。它们本质上是我的自己的库:可以拉入、共享、标记的不同项目,更新,随便。

每个“库”中使用的组织取决于所涉及的范围和功能。

因为我不同意该结构是某些潜在类/JAR 输出的奴隶: 如果您担心类和/或 JAR 中的“方法膨胀”,请使用自动化工具来解决这个问题。 ProGuards is just one example,虽然它可以混淆,但它在“消除死代码”方面也同样有效。

【讨论】:

    【解决方案4】:

    将您的 utils 模块拆分为更小的子项目。使用 Maven 或其他构建系统来跟踪所有 util 模块的版本。它们对您的系统至关重要,因为我认为它们几乎用于您的所有项目。使用 FindbugsPMD 等工具来衡量代码的质量。

    每个项目都需要知道使用的是哪个版本的 utils 模块。在我看来,向您的“nonutils”项目之一的二进制文件/源添加一些松散耦合的实用程序类是不可接受的。

    请使用Apache Commons 等其他公共项目修改您的课程。我假设你的很多实用程序代码都是相似的。最好重写你的static metods,因为它们会阻碍测试(我相信 Findbugs 也会抱怨很多)。

    总而言之 - 创建一个 utils 库是一件困难的事情,而且责任重大。所以对代码质量的要求非常高。我希望我的建议会有所帮助。

    【讨论】:

      【解决方案5】:

      在编译后删除类时您应该非常小心 - 您可能会在运行时遇到类未找到的情况。如果你从不使用反射或 Class.forName() 你应该是安全的,但是那些引入了编译器无法帮助你的运行时依赖项(就像它可以使用“new”一样)。

      记住 - 那些未使用的类在运行的程序中不使用内存,只使用磁盘上的字节。

      就我个人而言,我最终说磁盘空间很便宜,并且意外删除使用的类定义导致运行时中断的风险对我来说是不值得的,所以我说 - 所有用于编译的代码都必须交付.

      【讨论】:

        【解决方案6】:

        我不使用 Eclipse,但在 Visual Studio 中,您可以添加对文件的引用,而无需对其进行物理移动或复制。这允许您在源代码管理的根目录中定义一个文件,您的所有项目都可以引用该文件,而无需将其包含在每个项目中或不必处理复制问题。使用这种解决方案,您可以智能地将您的 util 方法拆分为不同的文件,并根据各个项目的需要有选择地包含它们。你也可以去掉多余的 .jar。

        也就是说,我不知道 Eclipse 是否支持这种文件引用,但可能值得一看。

        【讨论】:

        • 确实如此。然而,这种简单的方法本身并没有真正涵盖分发或版本控制。我会考虑使用自动化工具来“删除额外的方法”,而不是尝试手动完成。结构应该适合问题;它不应该成为担心 JAR 优化的奴隶。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多