曾經爲一家大型科技公司工作過。我們用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