曾经为一家大型科技公司工作过。我们用Java编程。他们非常聪明,他们喜欢用Java在C/C++中模拟结构。为了让自己清楚,他们主张以创建充当“数据持有者”类:在Java中模拟结构是一个好方法吗?
public class BookInformation {
public final List<String> authors;
public final String bookTitle;
public BookInformation(List<String> authors, String bookTitle) {
this.authors = authors;
this.bookTitle = bookTitle;
}
@Override
public String toString() { ... }
@Override
public int hashCode() { ... }
@Override
public boolean equals(Object obj) { ... }
}
我们可以看到,这个班的目的是简单地保存数据。尽管我们违反了许多企业编程规则,例如不直接暴露类字段和防御性复制,但这种类别确实获得了诸如简洁编码等好处。我们可以直接调用字段名称,而不是调用getter和setter。
惹我生气的是这类难以维护和延伸。这很难维护,因为没有办法确保对象的状态是合法的。业务逻辑可能会说,一本书必须有一个标题和至少一个作者。但在现实世界中,对象可以有空标题,空标题,空作者列表或空作者列表,我们无法控制它。这很难延伸。例如,如果数据源被更改为为作者姓名分别提供名字,姓氏?我必须使用两个字符串列表而不是一个。更糟的是,数据结构的变化影响和接口。由于我没有getAuthorNames()接口,因此我可能不得不在许多地方更改代码。我不得不承认上述情况并未发生。我不得不承认,所有使用该类的代码都在团队的控制之下,所以界面变更听起来不像为其他团队/公司使用那样糟糕。那么即使我们使用Java,一种纯粹的OO语言,在企业级编码,也可以拥有这样的编码标准吗?
我知道那里可能没有“正确”的答案。我想听听个人意见。代表你自己大声说话!
编辑:
好的。我应该重申我的问题的核心:牺牲一些教科书编码规则以获得简单性是明智的吗?随着代码库的增长和团队的成长,牺牲会在稍后时间发生吗?个人意见很重要,特别是来自智者,在许多情况下,没有正确或错误的问题,我们都只是遵循令人信服的意见。我很抱歉,Stackoverflow仅适用于正确和错误的问题。在这种情况下,这个问题应该关闭。
我不认为这是一个非常适合#1。 Stackoverflow用于客观答案的问题,而不是“个人意见”。此外,我们的个人意见如何让您受益?你怎么知道我们的经历代表你的情况? – meriton
你不必模拟一个C结构,你可以模拟一个C++结构并添加像'getAuthorNames'这样的辅助函数。另外请记住,Java对象是引用类型,不像C/C++/C#结构 –
您的问题也非常广泛。是关于公共领域吗?缺乏防御性复制?并行类层次结构?适合执行验证的地方?不稳定的接口? – meriton