2013-06-12 50 views
0

我在這裏尋找一點清晰。對於我的一個項目,我寫了一個容器,其中包含一堆不同的幾何形狀。我的界面是這樣的:多個成員函數或一個函數與枚舉

Container::AddTriangle(Point, Point, Point); 
Container::AddSquare(Point, Point, Point, Point); 

等等等等。我喜歡這個接口,因爲它會進行編譯時檢查,以確保您有所需的數據。然而,在與我的團隊的討論中,有人提出了這個接口來代替:

enum SHAPE { Triangle, Square }; 
Container::AddShape(std::vector<Point>, SHAPE); 

有了它僅具有一種功能,而不是許多提供更乾淨的代碼的說法。雖然我當然更喜歡第一種方法,但我對第二種方法沒有任何爭論。有沒有人遇到過這個選擇?一個選擇是否更好(或者至少是傳統上優先選擇的)?

注:有人提出之前:

Container::Add(Shape) 

我想,讓你知道這是不是一個很好的解決我的具體問題。我承諾。

+0

你對形狀做什麼?他們如何存儲在容器中? –

+0

它們最終被存儲在一個圖形結構中,節點包含一個boost :: variant,它的形狀是什麼,連接到表示點的節點的邊(上述問題中的點實際上是內部存儲節點的句柄)。 – Hounddog

回答

1

我會去第一個版本。具有單一功能Add(std::vector<Point>, SHAPE)只是增加了很多未定義的情況,例如如果你想在向量中添加一個帶有10個元素的三角形,你會怎麼做?

像AddTriangle,AddSquare等功能更乾淨,更容易看到代碼中添加了什麼。具有功能AddPolygon(std::vector<Point>)可用於添加通用形狀。

即使您將形狀作爲std::vector<Point>存儲在Container類中,我仍然更喜歡第一個版本。您可以在AddTriangle/AddSquare函數中創建矢量。

+0

因爲我們決定採用這個解決方案,並且您首先回答,所以我將其標記爲已接受。感謝大家! – Hounddog

1

針對第二個問題的主要觀點是,它忽略了具有兩個不同功能的基本效用:三角形和正方形是兩個不同的實體。當有兩個單獨的函數和兩個獨立的參數列表時,代碼清晰明確。

一個函數不會簡化代碼,因爲一個向量導致混亂:爲什麼有一個枚舉,當你可以通過向量的大小來確定形狀?如果你想要一個4點的三角形,那麼軟件會做什麼?顯然這不是更清潔。另外,在調用函數時實例化矢量將顯得更加複雜,然後只是單獨實例化點。

0

爲什麼不能同時使用?似乎這裏有兩個獨立的關注點:界面和實現。第一個是更好的接口,因爲參數是明確的,但如果每個函數幾乎相同,它們應該都使用相同的實現。換句話說,AddTriangle應該只會呼叫AddShape(vector, Triangle),而容器的外部用戶應該使用AddTriangle,但不能直接與AddShape一起使用。