【问题标题】:Java project structure at the granular level粒度级别的 Java 项目结构
【发布时间】:2013-11-06 06:54:09
【问题描述】:

我对 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 中...例如:

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?

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

谢谢!

【问题讨论】:

    标签: java class oop package


    【解决方案1】:

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

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

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

    按身高、体重排序,然后放入一个列表。

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

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

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

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

    【讨论】:

    • 感谢您的回复!。因此,如果我将比较器放在 Person.java 中;我可能应该将 Person 放在一个单独的包中,以限制仅对 person 的访问,对吗?另外,您对包含 main() 的类有任何见解吗? main 应该是它唯一的方法吗?它应该在包结构中的什么位置。
    • 我会将与这个项目相关的所有文件放入同一个包中。我从不使用包级安全性。一切都是公开的或私人的。为非常不同的设施使用子包。例如,对于与项目报告相关的类,我可以看到 com.dax.myprogram 用于 Personcom.dax.myprogram.reports 等主要类。如果您决定添加 Web 服务,则该代码可以在 com.gax.myprogram.ws 中。但是,如果有一份报告和一项网络服务,您可能会将其全部转储到com.dax.myproject
    • 关于“主要”问题,我会把它作为一个单独的类。
    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多