粒度级别的Java项目结构

时间:2013-10-27 14:03:06

标签: java class oop package

我很好奇java项目结构,以及关于类,接口等的最佳实践。

如果有人知道一个良好的开源项目遵循良好的最佳实践,我将不胜感激;似乎每个人都略有不同,有一些与该主题的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()数组),将它们连接到一个String并将其添加到一个新的数组中。

  • 按身高,然后按重量对人进行排序,并将其放入清单。

所以第一件事;应该Person类有一个方法"字符串concatToString(){}",或者执行conctanetion的代码应该在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和comparator?创建另一个包含比较器的PersonPQueue类?

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

谢谢!

1 个答案:

答案 0 :(得分:1)

您的帖子中有很多内容。对于Q&amp; A网站来说,这是一个很大的话题。无论如何,我会回答一些具体问题。

  

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

toString()类中实施Person,以某种方式格式化Person。调用toString()的东西可能不在Person类中。没有更多的背景,我不能肯定地说。

  

按身高,然后按重量对人进行排序,并将其放入清单。

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

我最后的建议是不要过多地冒汗,并以最简单/最快捷的方式做到这一点。原因是这些决定中的许多是任意的,并且在事物计划中并不重要。

我会避免在Person之外公开Person课程。原因是,如果某些内容发生变化并且您认为比较器应该在Person之外,那么您最终可能会在那里引用Person的内部应用程序。现在,当您想要重新组织Person时,必须更改一堆代码。太痛苦了!

您需要做的是了解未来的业务及其需求。如果他们不确定如何对{{1}}进行排序,那么可能会进行防御性编程,并将比较器放在其外。或者实现接口或Facade设计模式,以进一步隔离代码与用户的浮躁。对于定义明确的项目,做最简单的事情。这样可以为测试提供更多时间,减少无用的抽象,并增加项目成功的机会。