簡體   English   中英

如何處理胖接口?

[英]How can I deal with a fat interface?

假設我有一個大接口 IShape,它繼承自 Circle、Square、Triangle...。

IShape 變得非常大,並且具有處理無關主題的功能:例如,許多用於尺寸計算,其他用於移動和動畫,其他用於着色等。

這違反了接口隔離和單一職責原則,所以我試圖找到更適合我的情況的設計模式,但我不確定什么是我繼續進行的最佳方式。

我正在考慮在更小的界面中打破 IShape:IDimensions、IMovement、IColour ......然后讓 Circle、Square 和 Triangle 從它們繼承。 這將解決胖接口的問題(盡管實現仍然非常大)。

我應該遵循什么方法?

一種方法是保持對象(IShape)相當“啞”(僅跟蹤其內部狀態,加上樣板訪問函數),然后添加以更復雜的方式作用於它的獨立函數。 在某些情況下,將這些函數集成到它們自己的類接口中可能很有用(特別是如果功能可以很好地分組並且需要一些內部狀態),但根據我的觀點和經驗,獨立庫沒有任何問題作用於對象的函數。 例如,請注意大部分 STL 是由非類函數組成的。

編輯:請注意,獨立功能基本上是自動可重入的(線程安全)。 對於成員函數,您必須更加注意對象狀態不會改變,您可能必須鎖定某些部分,等等。

編輯2:我通常嘗試支持對象的組合(對象A“具有”對象B)而不是繼承(對象A“是”對象B的一種)。 當您考慮它時,正方形(“是”一種形狀)可能“具有”一種顏色,但它“不是”一種顏色。 此外,請認真考慮您在哪個級別構成對象:是否每個 Shape 都有顏色和/或尺寸(在這種情況下,Shape 基類應該具有 Color 和 Size/Polygon/Geometry/BoundingBox/... 成員),或者做你想在你的代碼生態系統中保持 Shape 接口更加抽象(在這種情況下,具體的幾何形狀繼承自(抽象)Shape,並且還具有進一步的具體屬性,例如大小和顏色)? 這(以及例如大小/幾何的具體實現)主要取決於您想要對形狀類似的對象做什么。

我支持丹尼爾的回答,也想補充一些花絮。

我認為適用的第三個原則是關注點分離( https://en.wikipedia.org/wiki/Separation_of_concerns )。 它說明了一切,什么也沒有,而且還需要很多時間才能保持精神狀態。 我缺乏關於您的應用程序的很多信息,所以我在黑暗中拍攝,但是,作為推理的一個例子:

為什么要將圓形和正方形關聯起來? 他們的共同點是什么? 除了具有環繞 2D 區域的線之外,它們沒有太多共同點。 圓有半徑,正方形沒有。 在正方形中,腿之間的角度是 90 度 - 圓形沒有這種情況。 您無法使用完全相同的一組明確的、定義明確的變量來描述這兩者。

那么,為什么要把它們放在同一個籃子里呢? 當你有答案,或者更可能的答案是為什么不讓它們在同一個胖界面中時,我認為你正在理解你的設計的好方法。

希望你能找到自己的方式! /尼爾斯

暫無
暫無

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

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