组织小型实用程序function

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

我有很多这些function的集合。 我想知道你们是如何组织他们的? 你有什么建议吗?

我就是这样做的。 我把它放在一个单独的项目(一个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) { ... } ... } 

因此,当我需要包括所有function时,虽然它没有被使用。

有一个更好的方法吗?

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

我像处理我开发的软件外部的其他组件一样对待这样的实用程序类:

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

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

这是有效的,但因为utils集合越来越大,有点奇怪的是,utils比项目代码更大(对于小项目)。 要在Jar中运送它,你必须手动选择它们(或包括它们)。 有没有更好的办法?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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