2009-06-25 6 views
2

私は、製品の複数のリリースで使用されるライブラリを設計しています。その仕事の一部は、.NET 1.1には存在しない機能の一部を強化することですそれを使用する。おそらくこれの最良の例はString.IsNullOrEmptyメソッドであり、その機能はかなり重く依存しています。.NET 1.1で密閉クラスを拡張するためのクリーン/直感的なアプローチは何ですか?

.NETのStringクラスはシールされています。私は、元の文字列をラップすることによってクラスの機能を拡張するために、アダプターパターンまたはデコレータパターンのいずれかを使用することについて考えましたが、これは私がしようとしていることに対して非常に直感的なアプローチであるとは確信していません。私はまた、同様の質問についてanother post on StackOverflowを見てきましたが、私が先ほど触れた問題を再び提起します。

私は間違いなく私が探している機能を作成するためにアダプタを使用することができますが、私はすべての文字列のためにこれをやって想像することはできません:私は必ずしもこのアプローチを嫌いしないでください

bool isEmpty = new StringExtensionAdapter(myXmlNode.SelectSingleNode(myXpathString)).IsNullOrEmpty(); 
if (isEmpty) 
{ 
    // Do something 
} 

が、それはそうですこのように、さまざまなソリューションが優れている可能性がある、多くのメモリ管理が行われます。また、私は "StringUtility"ライブラリを作成することに夢中ではありません。そのアプローチは、私が追求したいオブジェクト指向設計からさらに遠ざかります。

すべての入力は役に立ちます。私がちょうど狂っていて、これらのアプローチの1つを使うべきなら、私に知らせてください。私は複数のベストプラクティスを探しています。

+0

私は、アダプタのパターンをお勧めしますし、小さなサンプルを書きたかったけど...あなたがすでにそれを言及したようだ:( –

+0

私は密閉されたクラス、特にシリアライズ可能な密閉されたクラスを嫌いです。1.1以来、SqlDataAdapterを拡張してシリアル化を制限したかったので、醜いマシンで生成されたコードの代わりに、 。 – quillbreaker

答えて

3

静的なIsNullOrEmptyメソッドを持つ "StringUtility"ライブラリが個人的に好きです。本質的には、extension methodsを呼び出すための素敵な構文なしで作成しています。

2

定義上、明確なアプローチはありません。私は、アダプターのアプローチが.NET 1.1でできることは最高だと思います。もちろん、これはあなたが外の世界を扱うときに前後に行く必要があります。

0

マシューには、きちんとしたアプローチがないと私は同意します。デコレータパターンは、継承(または多態性)に依存するため適用できません。また、同じインタフェースを持つクラスを作成することはできないため、Decorating System.Stringはできません。

アダプタは基本的に1つのインターフェイスを別のインターフェイスに適応させるために使用されます。それはあなたがここでやりたいことではありません。本質的に、あなたが念頭に置いているように見えるのはラッパーですが、マシューが指摘しているように、あなたは多くを前後に変換しなければなりません。

おそらく、新しいタイプの「テキスト」に名前を付けて、文字列との暗黙の変換を実装して、書き込む必要のあるキャスト量を最小限に抑えることができます。そのルートを選択した場合は、文字列自体と同じ動作であるため、型を不変型として設計するようにしてください。

0

あなたは物事をより「自然」を作るために暗黙の演算子を使用することができます。

public class SuperString 
{ 
    public SuperString(string s) { S = s; } 

    public static implicit operator SuperString(string s) 
    { 
     return new SuperString(s); 
    } 

    public string S { get; private set; } 

    public bool IsNot() { return String.IsNullOrEmpty(S); } 
} 

[TestMethod] 
public void Test_SuperString() 
{ 
    SuperString ss = "wee"; 
    SuperString xx = ""; 
    if (xx.IsNot()) ss = "moo"; 
    System.Console.WriteLine(ss.S); 
} 
関連する問題