簡體   English   中英

要懷疑只有一個實例的類

[英]Be suspicious of classes of which there is only one instance

tl; dr - 以下引用的段落是什么意思?

要懷疑只有一個實例的類。 單個實例可能表示設計將對象與類混淆。 考慮一下你是否可以創建一個對象而不是一個新類。 派生類的變體可以用數據表示而不是作為一個獨特的類來表示嗎? Singleton模式是本指南的一個值得注意的例外。

麥康奈爾,史蒂夫(2004-06-09)。 代碼完成(第2版)

擴大的視野:

我正在閱讀Code Complete ,我無法理解上面提到的段落。 對於上下文,它來自第6章的繼承指南。 起初我認為這是反對使用單身人士的建議,但當我到達段落末尾時,我顯然被證明是錯誤的。

我根本無法理解作者試圖穿過厚厚的頭骨。 例如,我不知道設計是否將對象與類混淆是什么意思,也不知道在具有只有一個實例的類的上下文中它意味着什么。 救命!

這里的措辭非常令人困惑,但我相信這意味着有時新手程序員可能會創建一個全新的類型來實例化它的一個對象。 作為一個特別明顯的例子:

struct Player1Name
{
    string data;
};

我們可以使用string player1_name; (或者甚至是多個玩家的聚合)而不創建一個全新的類型,因此嘗試使用類來模擬新對象(現有類型的新實例)已經可以做的混淆。

在這種情況下,開發人員可能會使用數百種新的用戶定義數據類型以及可能的大規模繼承層次結構來對代碼庫進行垃圾郵件處理,而對於他想要創建的每個新事物,單個實例都無法在單個實例之間重復使用。現有的課程通常就足夠了。

真正的問題不是類被實例化一次,而是它們的設計非常適用,只值得實例化一次。

類通常用於模擬與其實例(對象)的一對多關系。 除了該類的單個實例之外,它們應該至少在某種程度上更普遍適用。 粗略地說,一個班級應該塑造一只Dog ,而不是你鄰居的特定寵物狗Spark 它應該模擬一個Rectangle ,而不是一個4.2米乘8.7米的精確Rectangle42x87 如果您正在設計要實例化的東西,那么您可能過於狹窄地設計它們,並且可能存在您可以使用的現有東西。

新的數據類型通常用於解決問題的類(類別),可以說,而不是一個只需要該類的一個實例的非常精確的數據類型。 否則,你的課程設計將是一次性的交易,只是在表面上創建課程,以解決非常個別的問題,沒有任何潛在的更廣泛的應用程序。

單例是規則的一個例外,因為它沒有以這種正常的面向對象的方式使用類。 在那里它故意開始創建一個單獨的實例,懶惰構造,並具有全局訪問點。 因此,開發人員創建了一個旨在實例化一次的類,這不是因為面向對象設計的一些偶然和誤解。 可以這么說,這是一個非常慎重和有意識的設計決策,而不是對如何使用這些工具的誤解。

暫無
暫無

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

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