2012-06-15 63 views
0

在Java中,當我有簡單的模型/ pojos時,我使用getters/setters。當你這樣做時,我發現代碼變得自我記錄。調用getName()將返回一個名稱,我不需要關心它是如何映射到某個數據庫的,等等。不使用getter和setter的文檔

使用語言時出現問題,getter和setter開始感覺笨重,就像在Python中一樣,我經常聽到人們說他們不好。例如,有一段時間,我有一個PHP項目,其中一些數據只是從數據庫查詢,而列值則映射到objects/dictionaries。我發現這樣的代碼很難閱讀,你不能真正閱讀代碼,閱讀代碼,然後你發現數據從數據庫中獲取,現在你必須查看數據庫無時無刻地瞭解它。當你所能做的只是看看班級的定義,並知道那裏不會有任何無證的魔術鑰匙。

所以我的問題是你們如何在沒有getter和setter的情況下編寫代碼?

+1

你似乎混淆了這裏的東西。如果不需要,建議不要在Python中使用getter和setter,這意味着您不應該在getter和setter中包含普通實例屬性 - 這在Python中不是必需的,因爲如果您決定更改此屬性,則可以使用屬性來保持向後兼容性實例佈局。 –

+5

所以你說'getName()'是自我記錄,但包含名稱的'instance.name'不是? –

+0

當然,當你看到它,但如果你沒有看到類定義的值?通過查看代碼,您可以假定它始終存在,它不是爲程序的這部分添加的一些魔術鍵/屬性? – Guu

回答

1

在我看來,班上不應該有任何無證的屬性。 PHP和其他語言允許您從任何地方將屬性粘貼到類上,無論它們是否在課堂中定義。我認爲這是不好的做法,因爲你描述的原因和更多:

這很難閱讀。

這會讓其他程序員(包括您未來的自己)更難理解發生了什麼。

它阻止IDE中的自動完成功能工作。

它通常使域層太依賴於持久層。

不管你使用getters還是setter來訪問一個類的定義屬性對我來說都是可以替代的。我喜歡事物的一致性,所以如果我有一個有getChildren()方法來延遲加載一些對象數組的類,那麼我不會公開$ children屬性,並且我傾向於使其他屬性也是私有的。我認爲這更多的是品味的問題,但是我覺得很煩人直接訪問類中的某些屬性($ object-> name;)和getters/setters的其他屬性。

+0

我會接受這一點。應該製作文檔,以便您快速查看IDE,並且從那裏應該很明顯。 – Guu