簡體   English   中英

術語:您稱什么為不會更改對象狀態的函數?

[英]Terminology: What do you call a function that does not change object state?

例如,我有一個Employee類,具有getName()pay()函數。 第一個函數只是返回人員名稱(不可變的屬性),但是第二個函數會顯着更改對象(例如,從不同的線程調用此第二個函數很不好)。

是否存在不更改對象狀態(例如getName()的函數的術語? 不變類中的所有函數都將具有此屬性。

我認為這種功能沒有全球認可的術語。

也許“無副作用”和“純凈”接近您想要的狀態,但是它們表示該函數不會更改任何狀態(您調用它的對象以及任何其他對象均不會改變)。

“純”一詞來自功能編程領域,表示函數的返回值僅取決於其參數的值。 在面向對象的編程中,通常也將調用它的對象視為輸入參數之一,以便將屬性獲取器視為“純”函數。

對此沒有特殊的命名。 預期合理的事情是,一個名為“getSomething()”方法應該沒有副作用。 除此之外,對於不可變屬性,它應始終返回相同的結果。

換句話說:實現此類方法時,您以確認那些規則的方式來編寫它們。 (這也以某種方式告訴您不要通過在某些地方執行lazy-init來進行過早優化;以避免在第一次調用該方法時產生副作用!)

不管是好是壞,Java都沒有一個“ const”關鍵字的概念,該關鍵字可以用來明確某種方法是無副作用的。

此外,從設計的角度來看:您應該考慮使Employee類完全不可變 從某種意義上說:為什么調用“ pay”方法應該更改Employee對象中的任何內容? 當我收到薪水時,銀行帳戶會增加,但是我(員工)不會因此而改變!

從這個意義上講:您可能正在網上搜索Robert Martin的“敏捷實踐”。 他為真實的Employee / Payroll應用程序進行了擴展的全面 OO設計。 (並提示:C#版本PDF似乎是免費提供的)。

“查詢”類似於Command-Query-Separation原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM