我想用兩種方法創建一個類,除了創建兩個繼承這些方法的子類外,沒有別的用途。這個類不能獨立運作。這是一個糟糕的編程設計或習慣嗎?用兩種方法創建一個小類只用於繼承是不是很糟糕的設計?
回答
甚至有些類別不會做任何事情,除了讓其他類別從中派生。超類是否可以擁有有用的實例並不重要。只有其他類可以派生出來的類通常稱爲抽象類;某些語言(如C++)也具有語法功能,以便在嘗試從抽象類創建對象時允許編譯器發出錯誤。所以,像這樣的班級不是很糟糕。
除此之外,什麼是「不好的做法」?如果設置使代碼更容易理解,那麼它不會壞。
當然,如果你打算推導的兩個類實際上沒有任何共同之處,而這兩個方法只是「嗨,我注意到該類中的10行代碼與這10行代碼相同另一個階級「,然後把它變成一個普通的超類,可能會讓人困惑不止。班級應該仍然有某種形式的關係。如果只是分享一些隨機出現的代碼,獨立功能可能是更好的選擇。
基本上,看看類的名稱。如果你的新超類被命名爲「某些非常通用的名字」,因爲我不知道它是什麼「,那麼它可能不是」好設計「。另一方面,如果你有一個超類的專有名稱,並且派生類的名字仍然與超類具有「種類」關係,那麼它可能不是一件壞事。
另一個強有力的提示是,當你開始使用指向超類的指針時,因爲你不關心你是在處理一個還是另一個子類。
好帖子!之後我會對此答案投票。我無法確定它們是否涉及,但它們彼此依賴。我也把這兩個課程合併爲一個。我有一個類顯示從屬性列表加載的一系列文本。然後,另一個類將顯示一個特定的精靈/圖片,這些精靈/圖片也會從屬性列表中加載,該屬性列表對應於正在顯示的文本。這兩個類都有兩個方法:loadValueFromPlist和displayNextValue。內部loadValueFromPlist是didPlistLoad,它在完成後會做一些事情。我想創建一個包含這些方法的supercalss。 – EmbodiedDarkness 2012-07-22 18:36:38
我很抱歉雙後,但我達到了最大文本限制。我想命名包含前面列出的三種方法的超類「PropertyLoader」。這兩個類繼承了這一點,並將重寫didPlistLoad來執行一些特定的操作。所有其他方法保持不變。謝謝您的回答。 – EmbodiedDarkness 2012-07-22 18:45:18
來闡明Christian Stiebers的帖子:不要使用繼承來保存代碼行。這是糟糕的設計。這些班級應該有一種「種類」的關係。你的「PropertyLoader」「TextLoader」/「ImageLoader」例子似乎沒問題(imho)。 – 2012-07-23 05:41:06
它是一個好習慣,它導致更好的功能組織。另一個原因是你可以看看繼承樹,並知道它與這兩個函數類有關。它沒有太大的傷害。
- 一般來說,沒有固有的好處或壞處。這很大程度上取決於具體情況。但是,總的來說,你應該總是試圖遵循面向對象的原則。例如,無論您是創建類,無論是抽象類還是具體類,該類都應該同時具有數據和行爲。這條規則非常重要,它一路走向了面向對象的基礎。沒有數據的類只是一堆方法(這是程序性編程,而不是OO)。沒有行爲的類是一堆變量(同樣是程序性的,而不是OO)。因此,將數據和行爲結合在一起非常重要。但是,他們應該有彼此的邏輯關係,而不是隨機地放在一起。例如,一種方法應該以某種方式訪問數據。
當然,這個規則有偏差。例如,您可能只有一堆靜態類中的方法(如Java中的Math類),或者只是一組Interface中的常量。但是,他們是例外而非規則。爲了方便起見,他們出於必要性。在嚴格的面向對象的意義上,它們不是真正的類。
因此,總是針對正確的原則,只有在沒有其他方式來實現它時纔會偏離,而只是作爲一個例外而非規則。
- 上一點是指如何構造一個類。爲了設計班級之間的關係,應該遵循邏輯路徑。仔細考慮你正在處理的每個概念,看看每個概念是否合理,然後看看這些類之間的關係。如果看起來你有三個可以繼承的概念 - 從父類派生的兩個類,那就這樣吧。如果父類有兩種方法,那就OK。即使它有一種方法,它仍然可以。只要它代表一個連貫的邏輯單元。
- 1. 創建一個線程池到servlet中是不是很糟糕?
- 2. 糟糕的OOP有很多類只有1或2種方法
- 3. 這是一個糟糕的設計? UITabBarController
- 4. 改變jButtons的功能是不是很糟糕的設計?
- 5. 公有變量是不是很糟糕?
- 6. 在數據庫中使用數組是不是很糟糕的設計?
- 7. 是EAV - Hybrid是一個糟糕的數據庫設計選擇
- 8. 這個Ruby類的設計真的很糟糕嗎?
- 9. 「getSomething()」是一種糟糕的方法命名模式嗎?
- 10. 訪問存儲庫中的UnitOfWork是不是很糟糕的設計?
- 11. 繼續在SQL Server中更新同一行是否很糟糕?
- 12. 業務層中的[DataContract]標記類是否是一個糟糕的設計?
- 13. DataTypeFactory在創建XMLGregorianCalendar時的用法很糟糕
- 14. 2繼承的POCO創建一個表而不是兩個
- 15. 在查詢中使用$ _SESSION ['id']是不是很糟糕?
- 16. 在事務表中複製數據是否是一種糟糕的設計?
- 17. 每次我想清除一個並重新創建一個新的DefaultStyledDocument時,是不是很糟糕的形式?
- 18. 設計模式的混合是一個糟糕的實踐嗎?
- 19. setInterval一直在運行是不是很糟糕?
- 20. 糟糕的CSS導致真的很糟糕的佈局在小設備上
- 21. AlarmManager和BroadcastReceiver而不是服務 - 是不是很糟糕? (超時)
- 22. 循環依賴c意外錯誤或只是一個糟糕的設計
- 23. 將一個表單作爲參數傳遞給一個類來訪問它的一些變量或方法是不是很糟糕的設計?
- 24. 檢查每個asp.net請求的Properties.Settings設置是否很糟糕?
- 25. Excel VBA Application.OnTime。我認爲使用這種想法是一個糟糕的主意......無論是哪種方式?
- 26. 設置單例是否很糟糕,以至於所有方法都是靜態方法?
- 27. 引用unique_ptr是一個糟糕的用法嗎?
- 28. 睡眠()是一個糟糕的設計,但似乎是我唯一的選擇
- 29. 在單個頁面中使用多個div是不是很糟糕?
- 30. 從該實例的__init__方法中調用實例方法是不是很糟糕的形式?
總是很重要的質疑那些說「這屬於」的人,因爲他們往往是錯誤的。此外,抽象類。看看他們。 – Will 2012-07-23 11:14:25