假設我有一個大介面 IShape,它繼承自 Circle、Square、Triangle...。
IShape 變得非常大,并且具有處理無關主題的功能:例如,許多用于尺寸計算,其他用于移動和影片,其他用于著色等。
這違反了介面隔離和單一職責原則,所以我試圖找到更適合我的情況的設計模式,但我不確定什么是我繼續進行的最佳方式。
我正在考慮在更小的界面中打破 IShape:IDimensions、IMovement、IColour ......然后讓 Circle、Square 和 Triangle 從它們繼承。這將解決胖介面的問題(盡管實作仍然非常大)。
我應該遵循什么方法?
uj5u.com熱心網友回復:
一種方法是保持物件(IShape)相當“啞”(僅跟蹤其內部狀態,加上樣板訪問函式),然后添加以更復雜的方式作用于它的獨立函式。在某些情況下,將這些函式集成到它們自己的類介面中可能很有用(特別是如果功能可以很好地分組并且需要一些內部狀態),但根據我的觀點和經驗,獨立庫沒有任何問題作用于物件的函式。例如,請注意大部分 STL 是由非類函陣列成的。
編輯:請注意,獨立功能基本上是自動可重入的(執行緒安全)。對于成員函式,您必須更加注意物件狀態不會改變,您可能必須鎖定某些部分,等等。
編輯2:我通常嘗試支持物件的組合(物件A“具有”物件B)而不是繼承(物件A“是”物件B的一種)。當您考慮它時,正方形(“是”一種形狀)可能“具有”一種顏色,但它“不是”一種顏色。此外,請認真考慮您在哪個級別構成物件:是否每個 Shape 都有顏色和/或尺寸(在這種情況下,Shape 基類應該具有 Color 和 Size/Polygon/Geometry/BoundingBox/... 成員),或者做你想在你的代碼生態系統中保持 Shape 介面更加抽象(在這種情況下,具體的幾何形狀繼承自(抽象)Shape,并且還具有進一步的具體屬性,例如大小和顏色)?這(以及例如大小/幾何的具體實作)主要取決于您想要對形狀類似的物件做什么。
uj5u.com熱心網友回復:
我支持丹尼爾的回答,也想補充一些花絮。
我認為適用的第三個原則是關注點分離(https://en.wikipedia.org/wiki/Separation_of_concerns)。它說明了一切,什么也沒有,而且還需要很多時間才能保持精神狀態。我缺乏關于您的應用程式的很多資訊,所以我在黑暗中拍攝,但是,作為推理的一個例子:
為什么要將圓形和正方形關聯起來?他們的共同點是什么?除了具有環繞 2D 區域的線之外,它們沒有太多共同點。圓有半徑,正方形沒有。在正方形中,腿之間的角度是 90 度 - 圓形沒有這種情況。您無法使用完全相同的一組明確的、定義明確的變數來描述這兩者。
那么,為什么要把它們放在同一個籃子里呢?當你有答案,或者更可能的答案是為什么不把它們放在同一個胖界面中時,我認為你正在理解你的設計的好方法。
希望你能找到自己的方式!/尼爾斯
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/496982.html
