2009-07-29 32 views
2

在我的C#/ ASP.NET項目中,我有一個具有特定行爲類別的對象。每個行爲類別在物理上都依賴於根對象,但爲了使代碼更好地被讀取,我想清楚地區分這些類別。我認爲,看看我的實現與其他人可能寫的解決同一問題的方式相比,會很有趣。美化C#語法

在下面的例子中,我有一個類,它可以在網站上的不同位置生成URL。該網站有一個店面,它有自己的一套鏈接,這些鏈接的訪問方式應與主頁等網址不同。

public class WebsiteURLs 
{ 
    // One category of urls on the website is the store. 
    public class StoreURLs 
    { 
    private WebsiteURLs _website; 
    public class StoreURLs(WebsiteURLs website) 
    { 
     _website = website; 
    } 
    public string BestSellers 
    { 
     get { return _website.ResolveURL("~/store/bestSellers.html"); } 
    } 
    } 
    private StoreURLs _store; 
    public StoreURLs Store // property for generating store urls 
    { 
    get 
    { 
     if (_store == null) { 
      _store = new StoreURLs(this); 
     } 
     return _store; 
    } 
    } 

    public string Homepage 
    { 
     get { return ResolveURL("~/default.aspx"); } 
    } 

    // .. Other Categories Here 
    protected string ResolveURL(string url) 
    { 
    return HttpContext.Current.Response.ApplyAppPathModifier(url); 
    } 
} 

使用這個代碼將類似於以下

WebsiteURLs website; 
Console.WriteLine(website.Store.BestSellers); 

羅伯特:

這個例子本身只是一個場景,我發現自己想更明確地組織功能。你有沒有發現自己使用相關方法的前綴。 String.TrimStart(),String.TrimEnd(),String.Trim()是C#框架中想到的一個例子。

我試圖組織上面的代碼(從可讀性的角度來看)遭受了嵌套類無法訪問外部類成員的束縛。構建內部類需要額外的工作,因爲我必須將WebsiteURL實例的引用傳遞給StoreURLs類的構造函數,這幾乎違反了C#編碼實踐,因爲此閉包行爲不是嵌套類中的嵌套類行爲語言。我很好奇C#代碼在其他存在很多相關功能的情況下會使用哪些代碼(想想幾十或幾百種方法)。 (注意:上面的代碼更適合用Java編寫,其中嵌套類可以訪問其外部類成員)。

回答

0

使用C# Regions。地區將適當地分類您的代碼。

public class WebsiteURLs 
{ 
    #region StoreURLs sub-class 
    // One category of urls on the website is the store. 
    public class StoreURLs 
    { 
    private WebsiteURLs _website; 
    public class StoreURLs(WebsiteURLs website) 
    { 
     _website = website; 
    } 
    public string BestSellers 
    { 
     get { return _website.ResolveURL("~/store/bestSellers.html"); } 
    } 
    } 
    #endregion 

    #region StoreURLs prop. accessor 
    private StoreURLs _store; 
    public StoreURLs Store // property for generating store urls 
    { 
    get 
    { 
     if (_store == null) { 
      _store = new StoreURLs(this); 
     } 
     return _store; 
    } 
    } 
    #endregion 

    #region Homepage 
    public string Homepage 
    { 
     get { return ResolveURL("~/default.aspx"); } 
    } 
    #endregion 

    #region Methods 
    // .. Other Categories Here 
    protected string ResolveURL(string url) 
    { 
    return HttpContext.Current.Response.ApplyAppPathModifier(url); 
    } 
    #endregion 
} 
+3

區域是識別或單獨的功能,因爲他們只是隱藏在一個類中的文本,而不是實際上是一種可怕的方式降低複雜性。我們應該看看更多的固體解決方案。在開玩笑的時候,我聽說地區就像是把馬桶座放下而不沖水。一個很好的比喻,因爲所有的鯉魚代碼仍然存在,只是如果你喜歡,你可以選擇不看它。我強烈建議不要這種方法。 – 2009-07-29 06:40:32

0

我不確定我是否理解了目標。但是...

我相信我會創建一個接口或基類,它可以完成大多數生成工作,並且可以從每個類別派生出來。

或者,創建一個響應類別枚舉的工廠類。

2

當我看到您的示例時,我的直接反應是認爲您將相對靜態的某些類型綁定到相對動態的某些網址屬於某個網站。那味道對我來說是錯誤的。這樣做會將您的代碼緊密結合到網站的結構和功能上。對綁定的網站中任何位置的任何URL進行任何更改都會強制重建和重新部署軟件。

所以,如果你打算這樣做,你必須有一個很好的理由。你從中得到什麼?在網頁層次結構上使用類型檢查(可能是IntelliSense)的功能。爲了得到這個,你付出了很大的代價。

它值得嗎?是這樣的:

url = website.Store.BestSellers; 

真的那麼多比這更好的:

url = website.GetUrl("Store.BestSellers"); 

,這是值得你將不得不投入只是爲了實現它的工作量?

當然有些情況下對這個問題的答案可能是「是」。但是如果不確定我是否知道這一點,我不會在這個設計上再花一分鐘。

+0

查看我編輯的最高職位 – hannasm 2009-07-29 07:20:32

0

我會在web.config,資源文件或數據庫中配置路徑,這樣做會獲得很多優勢,例如您可以使用不同的配置進行測試/生產,您可以切換到另一個頁面編輯你的配置而不用修改源代碼並重新編譯...

0

我同意羅伯特。你可以做的另一件事是創建一個你的網站的資源文件(鍵/值),並像這樣引用它:

string url = Resources.Navigation.Home;

它給你的名字的自動檢查,在編譯時,而不是運行時(因爲字符串在那之前不會被評估)