2009-06-19 1 views
1

どの程度の情報隠蔽が必要ですか?コードリファクタリングを実行する際に、どの程度の情報隠蔽が必要ですか?

public override void OrderProcessing_Delete(Dictionary<string, object> pkColumns) 
    { 
     var c = Connect(); 


     using (var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM orders WHERE order_id = :_order_id", c) 
      { Parameters = { {"_order_id", pkColumns["order_id"]} } }) 
     { 
      var count = (long)cmd.ExecuteScalar(); 

      // deletion's boilerplate code... 
      if (count == 0) throw new RecordNotFoundException(); 
      else if (count > 1) throw new DatabaseStructureChangedException(); 
      // ...boiler plate code 
     } 



     // deleting of table(s) goes here... 
    } 

注:私はレコードを削除する前に、私は定型コードを持って、それはこのようになります定型コードが「使用(するvar CMD =新しいNpgsqlCommand(...)」

含め、コード生成で

しかし、私は真剣にこれは私がコードをリファクタリングする思い描く方法です私はより多くのsuccintコードを望んでいた、ボイラープレートコードをリファクタリングすると思っています。(拡張メソッド(いない唯一の理由で、よりよい製;))

using (var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM orders WHERE order_id = :_order_id", c) 
     { Parameters = { {"_order_id", pkColumns["order_id"]} } }) 
    { 
       cmd.VerifyDeletion(); // [EDIT: was ExecuteWithVerification before] 
    } 

私はrunscalarと定型コードを拡張メソッドの中に入れたいと思っていました。

上記の私のコードでは、コードリファクタリング/情報隠蔽が必要ですか?リファクタリングされた操作があまりにも不透明に見えますか?

答えて

2

あなたの新しいリファクタは、あなたのプログラムの多くの場所でコードのいくつかの行に置き換えられれば非常に良いと言います。特にこれらの場所すべてで機能が同じになるためです。

あなたのコードを見ているプログラマーは、拡張メソッドの定義を見て、それが何であるかを知るだけで、このコードが1つの場所に定義されていることを知っているので、それは場所によって異なる。

+0

VerifyDeletionは(少なくとも私のコードの場合は)機能がよく定義されているので、これを拡張メソッドに入れてください。 – Hao

0

コードを抽出またはリファクタリングしても、情報を隠すことはできません。リファクタリング後に拡張定義へのアクセスを制限し始めるときは、情報を隠すだけです。

1

あなたがしなければならないが、私の気持ちは簡潔さではなく、施行毎回またはほとんどの時間を実行するかどうかです。また、検証条件が変更された場合、ボード全体で変更される可能性があります。

基本的に、ボイラープレートコードの小さな塊を減らしても、必ずしも物がより簡潔になるわけではありません。開発者が歩き回って理解しなければならない抽象度のほんの一桁です。

開発者としては、「ExecuteWithVerify」が何を意味するのかわかりません。正確に何を確認していますか?私はそれを見て覚えていなければならない。しかし、ボイラープレートのコードでは、コードを見て、何が起こっているのかを正確に理解することができます。

別の方法に減らさないことで、違う条件で例外をスローする必要がある場合のボイラプレートコードを調整することもできます。

+0

答え#1がリファクタリングの引数を与えたので、mineが引数です。基本的には、現在のコードが "将来" – hythlodayr

-1

クラス内の "new"演算子(コンストラクターを除く)は、すべての費用をかけて回避する必要があります。これはここでリファクタリングする必要があります。

関連する問題