有一次我在一家大型科技公司工作。我们用 Java 编程。那里的人非常聪明,他们喜欢用 Java 中的 C/C++ 模拟结构。为了清楚起见,他们提倡创建充当“数据持有者”的类:
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 仅针对正确和错误的问题而设计。在那种情况下,这个问题应该被关闭。