2013-04-29 58 views
3

下面是類似的代碼,我最近寫的東西,這已經被證明是在工作中一點點有爭議的一個例子:這是對C++繼承層次結構命名空間的合理使用嗎?

namespace Shape 
{ 
    class Renderer 
    { 
    public: 
     virtual void Draw() = 0; 
    }; 
}; 

namespace Square 
{ 
    class Renderer : public Shape::Renderer 
    { 
     virtual void Draw(); 
    }; 
}; 

namespace Circle 
{ 
    class Renderer : public Shape::Renderer 
    { 
     virtual void Draw(); 
    }; 
}; 

的要點是: 1)在繼承層次大多數類具有相同名稱,但屬於不同的命名空間 2)'渲染器'將只是這些相同名稱空間內的幾個繼承層次結構之一

我的問題是:這可能是合理使用名稱空間,還是濫用名稱空間? 有沒有其他人以這種方式使用名稱空間?

已經收到了一些評論,如果我指出在我的真實世界編碼中,名稱空間實際上是不同的數據庫技術,那麼它可能有助於討論,所以一個是ADO,另一個是SQLite。因此,對我來說,名稱空間確實是有用的分組。

+0

真的更適合http://codereview.stackexchange.com/ – Chad 2013-04-29 14:30:54

+0

謝謝@Chad,我不知道那個網站。我會調查那裏發佈的問題。 – 2013-04-29 14:31:51

+2

想一下當你看到剛剛提到'Renderer'的代碼時你是否會感到困惑...... – 2013-04-29 14:34:29

回答

4

這是十分不同,你需要對你爲什麼會想這樣編寫代碼一個真正強大的理由。你的同事只是看着「這真的很奇怪」的代碼,而不是「這真的很奇怪,但是因爲X而真的很聰明。」這不是一種濫用,它只是非常規的。但是,如果沒有足夠令人信服的X因素,非常規就不好了。

4

在我的意見中,這是濫用命名空間的概念,因爲你用子命名空間垃圾全局命名空間。

命名空間的目的是在邏輯上將功能組合起來,而無需使用過長的名稱和通過使用子句的方便使用的選項(僅在CPP中 - 從頭到尾)。

我會反轉嵌套:

namespace Renderer 
{ 
    class BasicShape 
    { 
    //... 
    }; 

    class Circle: public BasicShape 
    {}; 

    class Sqare: public BasicShape 
    {}; 
} 
+0

謝謝@vlad_tepesch。我可以看到,只有一個繼承層次結構,或者層次結構之間沒有強大的互連,這種情況很有效。假設我們有'串行器'作爲另一個層次結構,我認爲這不會很好,因爲當它們基本上是相同的時候,在不同的命名空間中重複了'圓'和'方'。 – 2013-04-29 14:51:44

+0

@Coder_Dan:我想我並沒有理解你的觀點與串行器。爲什麼會在不同的命名空間中重複Circle? – 2013-04-30 07:47:48

+0

@ vlad_tepesh-這是因爲我的命名空間中有多個繼承層次結構,所以假設我在這個例子中添加了'Serializer',那麼你會得到: namespace Serializer {class BasicShape; class Circle; class Square;}你倒過來做我做的事情。 這個倒置的方案有相當的全局名稱空間的垃圾郵件,它只是另一種方式,它確實將層次結構保留在單個名稱空間中,但在我的情況下(我的名稱空間實際上是不同的數據庫技術),您的方案不幸不太適合。謝謝你回覆,但 – 2013-04-30 08:29:58