2009-01-13 51 views
1

命名空間非常酷:使用它們,您可以組織您的庫,並且可以避免名稱衝突。你如何使用命名空間?

嗯,這是我的意圖。我認爲很多人不會像使用它一樣使用它......每天,我會看到95個字符長的命名空間分散代碼並隱藏真正重要的信息。

下面是一個例子:

BigCorp.FrontOffice.MyApp.MySubDomain.Controllers.MyControllerXYZ xyzController = new 
    BigCorp.FrontOffice.MyApp.MySubDomain.Controllers.MyControllerXYZ( 
     BigCorp.FrontOffice.MyApp.MySubDomain.Const.MyValue1, 
     BigCorp.FrontOffice.MyApp.MySubDomain.Const.MyValue2); 

難道你有打算嗎?不,當然。它是:

MyControllerXYZ xyzController = new MyControllerXYZ(MyValue1,MyValue2);

沒有命名空間很簡單,但難以理解與...

好了,你怎麼使用命名空間?關於他們的最佳做法是什麼?我們應該使用名稱空間還是內部類?你的主項目有多少名字空間? (目前,我正在使用210個接口(!)和更多的命名空間 - 不可維護!)

在此之前,感謝您的回答,
Sylvain。

+0

請添加更多標籤併爲您的問題使用更好的標題。 – 2009-01-13 23:24:26

+0

您錯誤輸入了長版本。在第二行末尾有一個額外的xyzController(我相信) – 2009-01-13 23:45:26

回答

2

那是一個很大的一個問題後的問題!

1)爲什麼使用命名空間?如您在問題中所述,它們是代碼的組織化方法。實際上沒有「單一」的方式來編寫代碼,所以通常命名的對象不會導致你的問題。創建一個類庫可能會使用與另一個類庫完全不同的mechinism。

2)我應該如何使用命名空間? 我更喜歡Microsoft如何分組其名稱空間(see 3.5 name space map!)。按功能分組,繼承,不管!命名空間只是另一個可以使用的orginizational工具。這就是說,我在少一方的錯誤更多。正如你所說,命名空間可以隱藏代碼,並隱藏其他開發者的函數代碼(哪個命名空間有我需要的gridrow類?Grid或Row?)。我試圖只在需要時才使用命名空間。叫我馬虎,但它迄今爲止一直工作!

總結:避免複雜性。不要過分分類你的代碼。

1

這取決於組織和代碼的語言和廣度。你說得對,在整個代碼中散佈很長的命名空間列表使得它更難閱讀。但他們確實有一個很好的目的:代碼組織。您的語言是否允許您通過「使用」或「導入」語句對別名進行別名,或者僅僅在文件的開頭添加名稱?如果是這種情況,那麼在代碼體中,只需要它們發生衝突的名稱空間。

2

假設你在C#中談到的命名空間,除了的

using Namespace; 

明顯的使用情況,您也可以有別名:

using ShortCut = Really.Complicated.Namespace.Its.Just.Terrible; 
2

從理論上思考這個問題(我自己很少使用名稱空間),我不確定有多少名稱空間有幫助。爲了保持代碼的可讀性,你將嘗試爲你的函數和變量選擇清晰的名字。此外,大多數語言都支持範圍設置,以某種方式限制函數或變量的可見性。而且函數本身在大多數語言中爲變量內部的變量提供了一個自然名稱空間

這是關於如何命名變量的一般問題。是一個聲明

int x;

最好被視爲一個容易驗證的

intx;形式?

當程序員已經知道它是一個int,寫東西像

int myint;

是同義反復。比這更糟糕,變量聲明爲

int x;

停止你寫

double x;

下一行

,同時保持它們作爲一個字沒有。以及這一點,你必須記住,當你編碼x是一個int或y是一個雙。這就是爲什麼人寫

ByteArrayOutputStream myByteArrayOutputStream = new ByteArrayOutputStream(size);

,讓他們知道該變量到底是什麼。這最終是非常重複的。如果你打算把它稱爲myByteArrayOutputStream,爲什麼語言的語法強制你明確地進入這個類?

1

我們有這樣的人傾向於這樣做。他們也傾向於繼續使用「使用」從句來擺脫罪行。這個愚蠢的部分是讓他們馬上回到他們開始的地方。

通常我喜歡看到的是一種,在極少情況下是兩種級別的命名空間。你應該做的是:每次你被誘惑時堅持

foo_

的前(或後)一串標識符,而不是把他們都變成命名爲「foo 「,並呼籲他們與

富::

這樣,你現在打算反正穿上有疣有一些信達ctic signifigance。更好的是,在「foo_」內部代碼中,不再需要使用前導「foo」。據瞭解,由於您已經在「foo」命名空間中處理一個項目。這使得內部代碼更容易閱讀,客戶端代碼也更容易理解。