2014-12-03 72 views
0

我正在開發一個遵循3層體系結構並且其數據訪問層(DAL)由其他人編寫的項目。我檢查了代碼,發現他使用兩個類庫和數據訪問層(DAL)中的一個接口連接到數據庫。界面是IDBManager和類庫是DBManagerFactoryDBManager在項目中聲明命名空間外的枚舉

類DBManagerFactory,他宣稱這樣一個枚舉的DataProvider:

using System; 
using System.Data; 
using System.Data.Odbc; 
using System.Data.SqlClient; 
using System.Data.OleDb; 

public enum DataProvider 
{ 
    Oracle, SqlServer, OleDb, Odbc 
} 

namespace DataAccessLayer 
{ 
    public sealed class DBManagerFactory 
    { 
     private DBManagerFactory() { } 

和接口IDBManager,他用這樣的枚舉:

using System; 
using System.Data; 
using System.Data.Odbc; 
using System.Data.SqlClient; 
using System.Data.OleDb; 

namespace DataAccessLayer 
{ 
    public interface IDBManager 
    { 
     DataProvider ProviderType 
     { 
      get; 
      set; 
     } 

     string ConnectionString 
     { 
      get; 
      set; 
     } 

所以,我的問題是,在命名空間之外聲明枚舉是一種好方法還是壞方法?我認爲應該在命名空間內聲明枚舉,並通過命名空間在另一個類或其他項目中使用枚舉。請告知標準方法。

+0

將這些類型打包到有意義的命名空間中是一種很好的做法,這樣我們就可以有一個清晰的分離和更好的想法。但是,如果這些類型是常見的,我們不希望類型轉換,那麼你可能會把它們放在命名空間之外。 – 2014-12-03 08:21:27

+0

@SivaGopal - 我無需使用名稱空間就可以看到枚舉的唯一好處是我們可以在其他類中使用它,而無需添加名稱空間的名稱。 – 2014-12-03 09:41:27

+1

Shory版本:是的,它應該在命名空間內;污染全球命名空間的形式很差;它也存在導致衝突的真實風險。 – 2014-12-04 11:08:01

回答

0

對於編譯器來說,只要沒有名稱衝突,它無關緊要。

如果在單獨的名稱空間中定義,則兩種類型可以具有相同的名稱。 「空白」名字空間也可以被認爲是一個名字空間。

假設您有兩種類型,My.Namespace.DataProviderYour.Namespace.DataProvider。如果你想同時使用,你必須區分一個從其他:

private My.Namepspace.DataProvider myDataProvider; 
private Your.Namepspace.DataProvider yourDataProvider; 

不過,如果你只想要一個,你可以使用一個using

using My.Namespace; 

private DataProvider dataProvider; 

這使得代碼更易讀。無名稱類型的問題是「空」名稱空間總是被「包含」。因此,考慮有My.Namespace.DataProvider和命名空間少DataProvider

using My.Namespace; 

private DataProvider dataProvider; // <-- unclear which one is used 

在上面的例子中,編譯器將使用My.Namespace.DataProvider,並儘快爲您刪除using它會悄悄地切換到命名空間較小型。

這是違反直覺的,您通常希望將一組類型放在命名空間中以「捆綁」它們。

0

是的。

定義一個接口是爲了從一個具體的實現中抽象出來(這樣你就可以讓其他代碼模塊只依賴於抽象,而不依賴於特定的實現)。

enum可以被認爲是一個特定的實現(它具有特定的值),所以立即接口依賴於這個具體的實現。因此,我個人更喜歡enum被定義在與界面相同的命名空間中,以限制未來維護代碼引入更多依賴的可能性(如果enum被移動到不同的項目,那麼如果該項目具有依賴性,則它們變成依賴關係的界面)。

將它放在相同的名稱空間中可以幫助其他開發人員將它視爲接口的緊密耦合依賴關係。