2009-06-19 27 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] 
    } 

我希望executecalar和樣板代碼進入擴展方法。

對於我上面的代碼,它是否保證代碼重構/信息隱藏?我的重構操作看起來太不透明瞭嗎?

回答

2

我會說,你的重構是非常好的,如果你的代碼的新一行替換程序中的許多地方的代碼行的屈指可數。特別是因爲所有這些地方的功能都是相同的。

程序員追隨你,看着你的代碼,只會看看擴展方法的定義以找出它的作用,現在他知道這個代碼是在一個地方定義的,所以不可能它因地而異。

+0

VerifyDeletion是定義良好的功能(至少在我的代碼的情況下),所以我同意你應該把這個擴展方法放在 – Hao 2009-10-09 08:25:55

0

當您提取或重構代碼時,這不是信息隱藏。只有在重構後限制訪問擴展定義時,纔會隱藏信息。

1

嘗試一下,如果你必須的,但我的感覺是它不是簡潔,但你是否想執行行爲每次或大部分時間。另外,如果驗證條件發生變化,它可能會發生全面變化。

基本上,降低鍋爐板代碼一小塊不一定使事情更加簡潔;這只是開發人員必須通過並理解的一點抽象概念。

作爲一個開發者,我不知道什麼是「ExecuteWithVerify」的意思。我們究竟在驗證什麼?我必須查看並記住它。但通過鍋爐代碼,我可以查看代碼並準確瞭解發生了什麼。

並通過將其不降低到一個單獨的方法我還可以調對於其中例外需要被拋出不同條件情況下,鍋爐板代碼。

+0

因爲答案#1給出了重構的論點,我的論據是反對它。基本上,重構如果當前的代碼要求它而不是「未來」 – hythlodayr 2009-06-19 04:27:56

-1

A類(除了構造函數)中的「新」運營商應該不惜一切代價避免。這是你需要重構的地方。