2012-01-16 96 views
5

作者後期編輯:選擇的解決方案

(原來的問題依然低於這個框)

摘要:你不應該命名類相同作爲它的命名空間。因此,產品名稱應該用於名稱空間還是主類?產品商標名稱乞求類/命名空間同名

選擇的解決方案:我決定的產品名稱適用於命名空間和一個後綴添加到主類名稱(例如,__Module)。

理由: Visual Studio中默認使用項目名稱的命名空間,程序集的名稱,以及實際交付.exe或.dll - 這是最明顯的項目,所以我覺得是有道理的名字命名空間放在我的產品名稱後面,然後按照Jon Skeet在其答案中的建議進行操作,並將主類命名爲___ Main或__Program或__Module。沒有人想到我的正確答案。


原題:

COMPLETELY GET它 - 不名一類SAME AS其命名空間!

這幾乎是一個重複的問題...除了我已經花了幾個小時閱讀文章(見下文),並不能找到或認爲似乎是正確的解決方案的。我的產品名稱爲ACME Foobarinator。它有幾個相關的類型(例如,設置,枚舉),但不足以調用任何類型的名稱空間層次結構。

是有意義的創建一個單一的產品命名空間,拋開一切到它:

namespace Acme.Web.Foobarinator 
{ 
    public class Foobarinator { } // BAD! Same name as namespace! 
    public class FoobarinatorInfo { } 
    public enum Mode { Disabled, Enabled } 
} 

BAD!名稱空間和類名都相同!

但是,我也想主類是Foobarinator因爲它的商標的產品名稱,我想通過消費者的商標名稱使用它:var fb = new Foobarinator();

選項1:消除產品命名空間,將所有類型提升到父命名空間。但是,這會污染父類名稱空間和特定於產品的類型(不一定是所有公共類型)。隨着產品的發展,污染正在增加!

namespace Acme.Web 
{ 
    public class Foobarinator { } 
    public class FoobarinatorInfo { } 
    public enum FoobarinatorMode { Disabled, Enabled } 
    // More pollution in future... 
} 

選項2:添加後綴不用向主類。但是,這混淆了產品商標名稱!

namespace Acme.Web.Foobarinator 
{ 
    public class FoobarinatorMain { } // Not the name of the product! 
    public class FoobarinatorInfo { } 
    public enum Mode { Disabled, Enabled } 
} 

選項3:使用子類/類型相關的類型。然而,在一類封裝一切最終違背了關注點分離作爲產品的演進:

namespace Acme.Web 
{ 
    public class Foobarinator 
    { 
     public class FoobarinatorInfo { } 
     public enum Mode { Disabled, Enabled } 
    } 
} 

您的想法?

我在哪裏妥協?

相關的問題和文章:

How to avoid having the same name for a class and it's namespace, such as Technology.Technology?

Should a class have the same name as the namespace?

Namespace with same name as a class name

Should a class have the same name as the namespace?

http://blogs.msdn.com/ericlippert/archive/2010/03/09/do-not-name-a-class-the-same-as-its-namespace-part-one.aspx

回答

3

我會用:

namespace Acme.Web.Foobarinator 
{ 
    public class Program { } // The entry point 
    public class FoobarinatorInfo { } 
    public enum Mode { Disabled, Enabled } 
} 

甚至:

namespace Acme.Web.Foobarinator 
{ 
    public class EntryPoint { } 
    public class FoobarinatorInfo { } 
    public enum Mode { Disabled, Enabled } 
} 

首先是在Visual Studio默認的(至少對於某些種類的項目)和第二使它晶瑩剔透什麼班級的角色是。

+0

同上這一點 - 我會向第二個傾斜。我喜歡將名稱空間視爲一個類別,而類名稱是該類別中特定功能塊的描述。我認爲將主類命名爲「Foobarinator」的願望有點謬誤。調用它像「EntryPoint」是一個更清晰的描述。 – 2012-01-16 21:48:00

+0

實際上它是一個HTTP模塊。 「Acme.Web.Foobarinator.HttpModule」聽起來對嗎?我有很多這樣的東西,很多時候它只是一個單獨的類,它只是尖叫着'Acme.Web.Foobarinator'類。但是,只要添加一個或兩個幫助器類型,就開始苦於需要一個子命名空間。 HENCE,我應該擁有多個單獨的類產品,它們都被稱爲'HttpModule',它們分別位於各自的名稱空間中 - 或者 - 我應該同時在'Acme.Web'和子名稱空間中混合使用單個類? – 2012-01-16 21:50:40

+0

@KevinR:如果沒有「Foobarinator」的具體例子,很難知道......你能否用* Foobarinator這個詞來描述模塊的目的? – 2012-01-16 21:54:21

1

創建一個更具體的命名空間,上面寫着類是什麼:

namespace Acme.Web.Foobarinator.Client { 
    public class FoobarinatorInfo { } 
    public enum Mode { Disabled, Enabled } 
    public class Foobarinator { } 
} 
0

我會改變命名空間的名稱是描述性的產品,而不是產品的名稱。因此,如果Foobarinator與圖形有關,請使用命名空間Acme.Web.Graphics

+0

因此,在這種情況下'Acme.Web.HttpModule'。除了我有多個HttpModule產品。因此,這基本上是選項#1,問題是是否用屬於單獨產品的所有助手類型「污染」Acme.Web.HttpModule。 – 2012-01-16 21:54:31

+0

當我寫信給HardCode時 - Visual Studio默認使用名稱空間,程序集名稱以及.exe或.dll的項目名稱 - 這些是最明顯的項目,所以我認爲在我的命名空間產品名稱,然後按Jon Skeet的建議進行操作,並將主類命名爲___ Main或__Program或__Module。如果產品包含子功能,我可能會使用* .Graphics等子命名空間。我想沒有正確的答案。 Thx爲您的輸入。 – 2012-01-16 23:30:22

0

一種選擇是使用複數。我傾向於這樣做,即使我的名稱空間中沒有實際的商標產品名稱。

例如,假設你有一個售票系統:

namespace Acme.Web.Tickets 
{ 
    public class Ticket { } 
    public class TicketInfo { } 
    public enum Mode { Disabled, Enabled } 
} 

你可以應用,爲您的產品:

namespace Acme.Web.Foobarinators 
{ 
    public class Foobarinator { } 
    public class FoobarinatorInfo { } 
    public enum Mode { Disabled, Enabled } 
} 
+0

僅供參考 - 「普通法商標」適用於任何時候您使用和聲明商標,因此如果您想申請Foobarinator,您所做的只是將其用於商業用途並聲稱它爲Foobarinator(TM)。你不應該一直稱不同的東西來「稀釋」你的用法(例如複數)。 Visual Studio默認使用項目名稱作爲名稱空間,程序集名稱以及.exe或.dll - 因此我將在產品名稱後面命名該名稱空間。我同意Jon Skeet所說的主要類可以被裝飾爲___主要或__Program或__Module。 Thx爲您的輸入。 – 2012-01-16 23:25:36

相關問題