组织小型实用程序功能

时间:2009-10-24 19:48:46

标签: java code-organization

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

我有很多这些功能的集合。我想知道你们是如何组织他们的?你有什么提示吗?

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

6 个答案:

答案 0 :(得分:1)

  

这很有效但是因为utils集合越来越大,所以utils比项目代码(对于小项目)更大是有点奇怪的。要在Jar中运送它,你必须手动选择它们(或者全部包含它们)。还有更好的方法吗?

对于我的项目,我使用javac从我的util库中选择所有类。为此,我将项目中的所有类编译为空输出目录。 javac会自动解析对util库的依赖,因为我将util库pathes添加为源pathes。现在我可以创建一个jar,它包含我项目的所有类,只包含util库所需的类。

  

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

我也是这样做的。但是我尝试了很多小的util类而不是几个大的类,所以我不需要在我的罐子里加入大量不需要的方法。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

每个项目都需要知道哪个版本的utils模块正在使用。在我看来,添加到你的一个'nonutils'项目的二进制文件/源代码中的一些松散耦合的util类是不可接受的。

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

总结一下 - 创建一个utils库是一件很难的事情,而且很有责任感。因此,代码质量方面的要求非常高。我希望我的建议能有所帮助。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

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

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