2016-12-14 3 views
2

Jason Robertsがpluralsite courseをレビューした後、私たちのコードベースの一部をより機能的なスタイルに変換しようとしています。より機能的なアプローチはnull参照例外が少ないことを意味しますか?

例えば、我々が持っている場合:

var request = new RetrieveAttributeRequest 
    { 
     EntityLogicalName = EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value, 
     LogicalName = attributeName 
    }; 

    var response = (RetrieveAttributeResponse) _organizationService.Execute(request); 

を私は単に、要求の上に私のカーソルを置いて、ctrl+alt+N resharper shortcutを使用すると、結果は次のようになりますことができます。

 var response = (RetrieveAttributeResponse) _organizationService.Execute(new RetrieveAttributeRequest 
     { 
      EntityLogicalName = EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value, 
      LogicalName = attributeName 
     }); 

もう一つの例:

まずは:

var request = new RetrieveAttributeRequest 
    { 
     EntityLogicalName = EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value, 
     LogicalName = attributeName 
    }; 

    var response = (RetrieveAttributeResponse) _organizationService.Execute(request); 

    var attribute = response.AttributeMetadata; 
    var type = attribute.AttributeType; 
    var logicalName = attribute.LogicalName; 

、すべてのインライン交換後:彼らのインライン同等物は、コードの安全性を高め、null参照ポインタ例外を減少させると

var logicalName = ((RetrieveAttributeResponse) _organizationService.Execute(new RetrieveAttributeRequest 
    { 
     EntityLogicalName = EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value, 
     LogicalName = attributeName 
    })).AttributeMetadata.LogicalName; 

を質問

変数を交換していますか?

+0

:あなたがnullの取扱いをやってみたかった場合、あなたの最後の例で

は、あなたがこのような何かをしますか?最後のスニペットを見てください。 'Execute()'が 'null'を返すと、' AttributeMetadata'にアクセスするとNREがトリガーされます。 –

+0

どちらも、参照例外をヌルにする傾向がありません。まったく同じ参照はすべて参照解除されています。ヌルの場合はNREを取得します。 –

+0

最も欠陥のあるコードは、resharperが変更されていないものです: 'EntityTypeDictionary'に要素が含まれていない場合、' EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value' –

答えて

2

あなたは、最初にヌルポインタをチェックしていませんでした。

var response = (RetrieveAttributeResponse) _organizationService.Execute(request); 

if(response==null) throw ArgumentNullException(); 
var attribute = response.AttributeMetadata; 

次のようなコードがあった場合、resharperは同じコードを提供しません。より流動的なアプローチは、あなたの期待に沿ってあなたのnull処理をインライン化することだと思います。例えば、拡張メソッド。

var response = _someObject.FluidComposition(...).ExceptionIfNUll().ExecuteSomething(); 

OR

var response = _someObject.FluidComposition(...).EmptyIfNUll().ExecuteSomething(); 

あなたは明確に上記の意図した動作を確認することができ、しかし、それだけの操作ではなく、あなたが持っているでしょうnullポインタ例外の数に期待されるものを定義します。

2

いいえ。指定した例は機能的に同等であり、スタイルの変更の目的は読みやすくすることです。

これは、オブジェクトの初期化子が言語構文にも追加されたのと同じ理由です。例えば

var myClass = new MyClass() 
myClass.Value1 = someValue1; 
myClass.Value2 = someValue2; 

var myClass = new MyClass() 
{ 
    Value1 = someValue1, 
    Value2 = someValue2 
}; 

これは、機能的に同等ですが、すぐに読み取ることがはるかに簡単です。

コードを書くときには、コンピュータが読みとって解釈するだけでなく、他の開発者も読むことができる言語で書いています。それはなぜでしょう

var logicalName = ((RetrieveAttributeResponse) _organizationService.Execute(new RetrieveAttributeRequest 
{ 
    EntityLogicalName = EntityTypeDictionary.FirstOrDefault(kvp => kvp.Key.Name == entityTypeName)?.Value, 
    LogicalName = attributeName 
}))?.AttributeMetadata?.LogicalName; 

if (logicalName == null) 
    throw new Exception("Something broke."); 
関連する問題