2009-07-29 5 views
2

私のC#/ ASP.NETプロジェクトには、特定のカテゴリの動作を持つオブジェクトがあります。それぞれの行動カテゴリは物理的にはルートオブジェクトに依存していますが、コードの読みやすさを高めるために、カテゴリを明確に区別したいと思います。同じ問題を解決するために他の人が書くかもしれないものと私の実装がどのように比較されているかを見ることは興味深いと思います。Beautifying C#構文

以下の例では、私はウェブサイト上の別の場所にURLを生成するクラスを持っています。ウェブサイトには、ホームページなどのURLとは別の方法でアクセスする必要があるリンクがあります。次

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

ロバートのようになり、このコードを使用して

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); 
    } 
} 

例自体は、私は自分自身をより明示的な機能を整理しようとして発見した唯一のシナリオです。関連するメソッドの接頭辞を使って自分自身を見つけたことはありますか? String.TrimStart()、String.TrimEnd()、String.Trim()は、C#フレームワークから気になる例です。

上記のコードを(可読性の観点から)組織化しようとすると、ネストされたクラスが外部クラスのメンバーにアクセスできなくなるという問題があります。 WebURLインスタンスのリファレンスをStoreURLsクラスのコンストラクタに渡す必要があるため、内部クラスの構築には余分な作業が必要です。このクロージャの動作は、言語。私は、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

(文字列は文句を言わない、それまで評価されるので)あなたの自動コンパイル時に名前の確認ではなく、ランタイムを提供します複雑さを軽減する。我々は、より固いソリューションに目を向けるべきです。冗談を言って、私は地域がフラッシングせずに便座を置くようなものだと聞いた。すべての鯉のコードはまだそこにあるので、良いアナロジーは、あなたが好きならそれを見ないことを選択することができます。このアプローチには強くお勧めします。 –

0

私は目標を理解しているかどうかはわかりません。しかし...

私は世代作業の大部分を行い、各カテゴリのためにそれから派生するインターフェイスまたは基本クラスを作成すると思います。

カテゴリの列挙に応答するファクトリクラスを作成します。

2

私があなたの例を見ると、私は、比較的静的なもの(タイプのセット)を比較的ダイナミックなもの、すなわちWebサイトに属するURLの束にバインドしていると考えることになります。それは私にとって間違っている。これは、コードをWebサイトの構造と機能に密接に結びつけます。 Webサイトの任意のURLを変更すると、ソフトウェアの再構築と再デプロイが強制されます。

あなたがそうするつもりなら、かなり良い理由があります。何をあなたはこれから出ていますか? Webページの階層でタイプチェック(おそらくIntelliSense)を使用する能力。あなたはこれを得るために非常に大きなコストをかけています。

それは価値がありますか?

url = website.Store.BestSellers; 

そんなにこれよりも良い本当に:

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

それはあなたがそれを達成するために入れする必要があるとしている仕事の量価値があるということですか?

確かに、その質問に対する回答が「はい」になる可能性があります。しかし、私はそれを知っていることなく、このデザインにもう一分を費やすことはありません。

+0

トップポストへの編集を表示 – hannasm

0

web.config、リソースファイル、またはデータベースにパスを設定すると、 のように、テスト/プロダクション用に異なる設定を使用するなど、多くの利点が得られます。別のページに切り替えることができますソースを変更せずに設定を編集し、再コンパイルすることができます。

0

私はRobertに同意します。もう1つのことは、サイトURLのリソースファイル(Key/Value)を作成し、次のように参照することです。

string url = Resources.Navigation.Home;

それは、彼らは単に、実際にクラスでテキストを隠すのではなくので、地域を特定するためにひどい方法または別の機能です