2

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

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

我就是这样做的。我把它放在一个单独的项目(一个 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,但如果你有其他工具的技术,我可以自由分享。

4

6 回答 6

1

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

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

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

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

于 2009-10-24T20:02:05.653 回答
1

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

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

因为我不同意该结构成为某些潜在类/JAR 输出的奴隶: 如果您担心类和/或 JAR 中的“方法膨胀”,请使用自动化工具来解决这个问题。ProGuards 只是一个例子,虽然它可以进行混淆,但它在“消除死代码”方面同样可以很好地工作。

于 2009-10-24T20:13:00.077 回答
1

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

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

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

于 2009-10-24T20:26:25.560 回答
1

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

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

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

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

于 2009-10-24T20:44:39.530 回答
1

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

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

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

于 2009-10-24T23:20:31.167 回答
0

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

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

于 2009-10-24T20:05:15.163 回答