列出对象 - 最佳实践

时间:2012-01-25 17:40:52

标签: java coding-style

所以有一个新人开始我工作的地方。我自己也是一名初级程序员,但是我已经开发了一段时间了,所以我使用了我的"直觉感觉"指导我们开发项目。盲人领导盲人。

刚出现了一个相对较小的东西,我想知道创建这个以供将来参考的最佳方法是什么。为什么。

本质上,有一个基本的XML文件,其中包含文件的详细信息(结构并非真正相关)。他开始查询这个XML文件,然后通过创建几个列表来存储所有检索到的文件,如下所示:

List<Integer> fileId = new List<Integer>;
List<String> title = new List<String>;

然后你会创建一个方法来查询这些列表以查找ID。

我想象一下创建一个方法来查询XML文件中的文件而不存储/设置任何内容,如下所示:

public Form getFile(Integer id) {
  Form ret = new Form();
  //Query XML, set to ret...
  return ret;
}

我想使用价值对象,因为那是我以前的工作方式。所以最后建议并解决了这个问题:

List<Form> forms = new List<Form>;

现在,我们有2种方法,1种填充“表格”#39;变量,然后1来查询它并返回Form ...对我来说似乎仍然很奇怪。

此外,而不是:

Form tempForm = new Form();
tempForm.id = 1;
tempForm.title = "Foo";

他更喜欢这样做:

Form tempForm = new Form(id, title);

纯粹因为它在1行并且看起来更整洁。尽管如此,我并不认为使用像这样的价值对象是最好的方法。

也许我担心和考虑事情而不是继续开发,但对此的任何建议都会很棒。

3 个答案:

答案 0 :(得分:2)

关于你的第二个问题:

使用构造函数的一个原因是,您可以使Form对象不可变,如下所示:

public class Form {
  private final String id;
  private final String title;
  public Form(String id, String title) {
    this.id = id; this.title = title;
  }
  public String getTitle() { return title; }
  public String getId() { return id; }
}

这有助于避免并发问题。

答案 1 :(得分:1)

我不确定我是否理解你的问题,但在此基础上,这听起来像是一个表演问题。即:是否值得在整个XML文件中读取,并对其进行重组以使查询更快更容易,或者每次扫描xml文件并对其进行查询更好。这是一个只有你能回答的问题。像往常一样,这是你必须评估的空间 - 速度权衡。

如果您的XML文件很大并且需要大量内存来缓存,而您只是偶尔查询,那么您的解决方案可能会更好。如果它很小并且速度很关键,那么缓存它是一个好主意。

尽管如此,您可以使用几种不同的库来以不同的方式加速处理。您可以查看使用XQuery和/或XPath(请参阅How to read XML using XPath in Java),JAXB,SAX等。每种技术都有自己的优点和缺点。

希望这会给你一些你可以互相讨论的背景。

答案 2 :(得分:1)

有趣的问题!但是,其中有几个问题。让我分别回答每一个。

让我首先列出domaindrivendesign.org

上的值类型的定义
  

定义:值对象是描述某些对象的对象   特征或属性,但不带有身份概念。

例如,文件路径是一个字符串,但它对字符串的格式和一些操作也有一些限制。这里创建一个值对象是个好主意。另请注意,路径不包含 identity 的表示法。也就是说,表示相同路径的两个路径对象将被视为相等。

现在对于实际问题,我强烈推荐您的编码方式 - 为属于一起的数据创建一个类。在您的第一个示例中,idtitle仅通过索引与两个单独的列表相关联。

最好使用此表格

Form tempForm = new Form(id, title);

这样,Form类可以immutable,这将为您提供出色的可读性优势和性能提升。该类的字段也被封装。

现在你想到的最后一件事很奇怪 - 有两个方法,一个用于创建列表,一个用于查询它。

这里我实际上会创建一个新类,只包含这两个方法,而不是让它们在静态类中说。我称之为FormCollection。因为你有更多的背景,你们可能会想出一些更聪明的名字。花费最多五分钟来计算一个有意义的名字。

您还可以进一步重构代码,例如将xml文件路径或流作为构造函数参数,然后使用单个方法在id上查询它。像这样:

class FormCollection
{
    public FormCollection(String xmlFilePath) { ... }
    public Form getById(int id) { ... }
}

这可能是您应用程序其余部分的良好界面,因为它简单易行。它也很容易测试。