最近我感覺實例變量具有全局變量的相同問題,我對此進行了搜索,發現this old article或多或少地描述了我所看到的潛在問題。實例變量是新的全局變量嗎?
你用什麼好的做法來避免全局變量的相同問題影響實例變量或類變量?
最近我感覺實例變量具有全局變量的相同問題,我對此進行了搜索,發現this old article或多或少地描述了我所看到的潛在問題。實例變量是新的全局變量嗎?
你用什麼好的做法來避免全局變量的相同問題影響實例變量或類變量?
類比全局結構小得多,所以實例變量的影響要小得多。通過保持小班制和密切遵守單一責任原則,避免了全球變量的許多不利因素。如果實例變量是通過傳入參數創建的,那麼我通常會在構造函數中使該參數成爲明確的依賴關係。此外,實例變量被封裝得很好,絕不會直接在實例的方法之外進行修改,從而很容易確定實例變量的修改位置。最後,實例變量必須對整個類有意義或者必須是私有的。
實例變量只能在特定的類中訪問。因此爲了防止實例變量被廣泛使用,請保持較小的類。如果一個類變得很大,決定它的一部分是否可以重構爲另一個更小的類,以及原始類使用的類。
既不是實例變量也不是全局變量,也不是任何種類的變量都有「問題」......它們都是工具。問題是有時候很多程序員選擇使用「錯誤的工具」。你必須仔細考慮你的選擇是什麼意思,所以你可以做出正確的選擇。
對某些東西使用全局變量,如CurrentUserName ...意味着您說他的CurrentUserName是普遍知道的東西。而且「每次只能有一個」CurrentUserName。如果你想允許用戶同時登錄(除非你真的很幸運,並且兩個用戶都有相同的名字),那麼這可能是錯誤的...
實例錯誤使用實例變量如果您將用戶的電子郵件地址作爲實例變量,然後您意識到每個用戶可以有多個電子郵件地址。
我也給出了一個繼承的例子,因爲我認爲它會使它更加清晰: 與繼承相關的問題是,例如,如果您建模典型的學生,教師問題,並且您嘗試讓學生Person和Teacher的子類Person的子類。然後你意識到有些人可能都是...
從Person繼承的學生是一種靜態關係,不能在運行時更改。而學生和教師不是靜態的關係......一個人既不可能既然成爲一名學生,然後開始成爲一名教師,然後又不再是兩個人,而是永遠是同一個人,並且該模型不能處理...
回到用戶,用戶是「關聯」與多個電子郵件帳戶...如果你把一個實例變量,你說他只是「關聯「一個電子郵件帳戶,並且您與您的問題域相矛盾,這就是爲什麼您會遇到問題的原因......
如果您說全局已知的當前用戶名同樣適用。 ..
所有情況下的問題是t你有一個問題領域,並且你的模型是錯誤的......你必須讓你的程序和你的模型的行爲類似於問題領域....如果你不這樣做,你會遇到問題,無論您選擇哪種工具來解決您的問題。
順便說一句:我也認爲用戶有一個電子郵件地址列表是錯誤的,但這是一個完全不同的動機。其實我使用
class ContactInformation
{
User contact;
EMailAddress email;
}
,記住,對象不「自己的」,也不是「有」其他對象......這是一個實現決策...對象只是「知道」其他物體...