1

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

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

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

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

Person 具有您期望的所有常见变量....

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 concatToString(){}”,或者进行连接的代码是否应该在 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?

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

谢谢!

4

1 回答 1

1

您的帖子中发生了很多事情。对于问答网站来说,这是一个巨大的话题。无论如何,我会回答一些具体的问题。

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

toString()在您的类中实现Person,以某种方式格式化 Person 。调用的东西toString()可能不在Person课堂上。没有更多的上下文,我不能肯定地说。

按身高排序,然后按体重排序,然后放入列表中。

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

我最后的建议是不要出汗太多,以最简单/最快的方式去做。原因是这些决定中的许多都是武断的,在事情的计划中并不重要。

我会避免Person.PersonComparatorPerson. 原因是,如果发生变化并且您决定比较器应该PersonPerson. 现在,当您想重新组织Person时,必须更改一堆代码。多么痛苦!

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

于 2013-10-27T14:45:33.617 回答