3

階層内の null のチェックを避けるために拡張メソッドを使用することに疑問があります。例:

// GetItems(), GetFirstOrDefault(), GetProduct(), GetIDProduct() are extension methods like:
public static SomeType GetSomeProperty( this XYZ obj ) {
    if ( object.ReferenceEquals( obj, null ) ) { return default( SomeType ); }
    return obj.SomeProperty;
}

// the code with extension methods
Guid? idProduct = this.Invoice.GetItems().GetFirstOrDefault().GetProduct().GetIDProduct();
// instead of
Guid? idProduct = null;
Invoice invoice = this.Invoce;
if ( null != invoice ) {
    InvoiceItems items = invoice.Items;
    if ( null != items && items.Count > 0 ) {
        InvoiceItem item = items[0];
        if ( null != item ) {
            idProduct = item.IDProduct();
        }
    }
}

利用可能な Null オブジェクト パターンがあることは知っていますが、このタイプの拡張メソッドを使用したソリューションの方が優れているように見えます。

このソリューションは良いと思いますか、それとも悪いと思いますか (悪い/良いデザイン、明快さ、その他何でも)?

「良い」または「悪い」に投票してください。また、その理由を教えてください。投稿にはコミュニティとしてフラグが付けられます。

4

5 に答える 5

2

私はそれを正気でやります:

Guid? idProduct = null;
Invoice invoice = this.Invoce;

if (invoice != null && 
    invoice.Items != null &&
    invoice.Items.Count > 0 &&
    invoice.Items[0] != null) 
{
   idProduct = invoice.Items[0].IDProduct();
}
于 2008-11-15T13:57:40.867 に答える
1

これは、インスタンスメソッドのセマンティクスを壊します。拡張メソッドは、呼び出し元にとってはインスタンスメソッドのように見えるため、そのように動作する必要があります。このようなセマンティクスを破ると、コードの理解と維持が難しくなり、その動作はほとんどの開発者を驚かせます。

于 2010-02-04T14:05:26.013 に答える
1

私はこれを「そのソリューションに関心がない」と投票します。

エンティティモデルクラスのNull-Object-Patternで問題ありません。

于 2010-02-04T14:08:17.617 に答える
0

このコードを読んで最初に驚いたのは、

GetFirstOrDefault().GetProduct()

それは 2 つのイディオムを壊します: 1) GetJon が指摘したようにスタイル メソッドを使用し、2) Null オブジェクトによって提供される抽象化を「表示」します。あなたのコードのリーダーとして私を引き付け、どこでOrDefault私を考えさせますnull

GetFirst().GetProduct()

しません。はい、Null オブジェクトと拡張メソッドの代替手段のポイントの 1 つは、リーダーやメンテナーの負担を軽減することです。または、なぜどちらかを行うのですか?

于 2011-10-25T03:03:45.317 に答える
0

Java と .net の制限の 1 つは、参照型の格納場所が意味的にオブジェクトの値を保持していると見なされるべきかどうか、オブジェクトを識別するものと見なされるべきかどうかを明確に識別するものがないことです (もちろん、コンピューターの観点からは、そのような格納場所はすべて、後者)。Stringそれにもかかわらず、格納場所が通常は値を保持しているとみなされるタイプ ( など) と、StringBuilder格納場所が操作を実行する必要があるオブジェクトを識別するものとみなされるタイプ ( など) があります。

structの制約がなく、null オブジェクトで呼び出されたときにNullable<T>インスタンス メンバーが ( thisnull で) 実行されるようにクラス型が指定できた場合、それは一部の型の優れたパターンと見なされます。通常、変更可能なクラス型の既定値を適切に指定することはできませんが、多くの不変型では、適切な既定の動作 (たとえば、default(string).Length0 を返す可能性) を持つことが完全に合理的です。残念ながら、.net 言語には、プロパティとメソッドが null オブジェクトで使用可能であることを指定する手段がありませんが、少なくとも拡張メソッドはその方向で少しは役立ちます。

于 2012-10-03T18:07:05.023 に答える