粒度级别的 Java 项目结构

标签 java class oop package

我对java项目结构以及类、接口(interface)等方面的最佳实践感到好奇。

如果有人知道一个遵循良好最佳实践的优秀开源项目,我将不胜感激;似乎每个都略有不同,其中一些与该主题的 Oracle 文档完全矛盾。如果有人能给我一个分割(或者对我的理论项目结构的批评),我将不胜感激。我相信我对/src、bin、lib、doc 等以及 com.* 结构相当了解。我的问题正是每个类、每个文件等中应该包含什么内容。

我最大的问题是如何准确地分解类之间的功能。例如;我有两门课:

Person.java Runner.java(这是入口点;入口点有命名约定吗?似乎带有 main()、run() 等的类是不同的“层”....如何决定入口点应该在哪里?是否应该创建一个只有 main() 的类(以及实际执行必要的计算?)

人拥有您所期望的所有常见变量......

int height, weight;
String ethnicity;
boolean gender; etc.etc.
Person(int h, int w.....) {this.height=h....}
public getters/setters for all variables

现在我正在寻找一个可以做两件事的程序:

  • 获取每个 Person 的所有属性(假设我们已经实例化了一个 Person() 数组),将它们连接到一个字符串并将其添加到一个新数组中。

  • 按高度、体重排序,然后放入列表中。

首先; Person 类应该有一个方法“String concatToString(){}”,或者执行连接的代码应该在 Runner 中...例如:

Runner.java:

public class Runner {

String getPersonString(Person p) {
   StringBuffer Sb = new StringBuffer();
   Sb.append(p.get(height));
   etc.
   return Sb.toString();
}

main() {
   for(int i=0; i<arr.len; i++) {
       getPersonString(arr[i]);
   }

   //more code that we will be further executing etc...; mostly just function calls in
   class Runner
}
}

现在对于第二个问题我应该如何解决这个问题...创建一个新类;在runner.java中创建一个priorityQueue和比较器?创建另一个包含比较器的类 PersonPQueue?

这些问题在我的代码中不断出现,我永远不确定如何正确拆分我的代码。任何伟大而清晰的例子将不胜感激。我检查了一些开源项目,其中许多项目对于我来说太大了,无法在合理的时间内完成设计决策,或者有相互矛盾的设计选择。

谢谢!

最佳答案

您的帖子中发生了很多事情。对于问答网站来说,这是一个很大的话题。不管怎样,我会回答一些具体的问题。

Take all the attributes of every Person (Say we have instantiated an array of Person()), concatanate them to a String and add that to a new Array.

Person 类中实现 toString(),以某种方式格式化 Person。调用 toString() 的东西可能不在 Person 类中。如果没有更多背景,我无法确定。

Order the people by height, then weight, and put into a List.

如果这是对 Person 进行排序的唯一方法,我会将排序列表的 getter 设为 Person 中的一个方法,并将 Comparator 类添加到 Person 类的底部。如果应用程序变得更加复杂,可以使用多种类型,我会考虑将 Comparator 移动到它们自己的类文件中。

我最后的建议是不要太费力,并以最简单/最快的方式做到这一点。原因是其中许多决定都是任意的,并且在计划中并不重要。

我会避免将 Person.PersonComparator 类在 Person 之外公开。原因是,如果发生变化并且您决定比较器应该位于 Person 之外,您最终可能会拥有引用 Person 内部的应用程序。现在,当您想要重新组织 Person 时,必须更改一堆代码。好痛苦啊!

您要做的就是了解业务及其 future 的需求。如果他们不确定如何对 Person 进行排序,那么也许可以进行防御性编程,并将比较器放在它之外。或者实现接口(interface)或外观设计模式,以进一步使您的代码免受用户变化无常的影响。对于定义明确的项目,做最简单的事情。这可以提供更多的测试时间,减少无用的不必要的抽象,并增加项目成功的机会。

关于粒度级别的 Java 项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19618910/

相关文章:

java - Android编程中的继承树

python - 成分 : Should I access the "inner object' s"methods directly?

java - javax.validation 的正确位置在哪里

java - 创建可查询的字符串

java - JOOQ 表情符号 (utf8mb4) 支持

iphone - Storyboard和 xib 在同一个项目中使用

c# - 创建指向自定义类的指针(由我自己创建)

php - 如何使用 php、pdo 和 oop 创建加载更多按钮

java - 合并排序抛出 StackOverflowError

java - 连接 JDBC SQL 错误