2010-03-31 83 views
3

最初我曾在我們的DL的方法,將採取在它的更新,像這樣的對象:什麼名字2種方法用相同的簽名

internal void UpdateCash(Cash Cash) 
{ 
    using (OurCustomDbConnection conn = CreateConnection("UpdateCash")) 
    { 
     conn.CommandText = @"update Cash 
          set captureID = @captureID, 
            ac_code = @acCode, 
            captureDate = @captureDate, 
            errmsg = @errorMessage, 
            isDebit = @isDebit, 
            SourceInfoID = @sourceInfoID, 
            PayPalTransactionInfoID = @payPalTransactionInfoID, 
            CreditCardTransactionInfoID = @CreditCardTransactionInfoID 
           where id = @cashID"; 

     conn.AddParam("@captureID", cash.CaptureID); 
     conn.AddParam("@acCode", cash.ActionCode); 
     conn.AddParam("@captureDate", cash.CaptureDate); 
     conn.AddParam("@errorMessage", cash.ErrorMessage); 
     conn.AddParam("@isDebit", cyberCash.IsDebit); 
     conn.AddParam("@PayPalTransactionInfoID", cash.PayPalTransactionInfoID); 
     conn.AddParam("@CreditCardTransactionInfoID", cash.CreditCardTransactionInfoID); 
     conn.AddParam("@sourceInfoID", cash.SourceInfoID); 
     conn.AddParam("@cashID", cash.Id); 

     conn.ExecuteNonQuery(); 
    } 
} 

我的老闆認爲,每一次創建一個對象只是爲了更新一個或兩個領域是矯枉過正。但是我有一些代碼使用這個地方。他建議只使用UpdateCash併發送我想要更新的CAsh和字段的ID。那麼問題是我有我的原始方法在代碼中的2個地方。而這兩個地方正在更新Cash表中的兩個完全不同的字段。在我能夠獲取現有現金記錄並將其轉儲到Cash對象之前,然後更新我想要在數據庫中更新的屬性,然後將現金對象發送回我上面的方法。

我需要一些建議在這裏做什麼。我有2個方法,他們有相同的簽名。我不太確定,因爲兩者都在更新現金錶2個完全不同的領域如何重命名這些:

internal void UpdateCash(int cashID, int paypalCaptureID) 
{ 
    using (OurCustomDbConnection conn = CreateConnection("UpdateCash")) 
    { 
     conn.CommandText = @"update Cash 
          set CaptureID = @paypalCaptureID 
        where id = @cashID"; 

     conn.AddParam("@captureID", paypalCaptureID); 

     conn.ExecuteNonQuery(); 
    } 
} 

internal void UpdateCash(int cashID, int PayPalTransactionInfoID) 
{ 
    using (OurCustomDbConnection conn = CreateConnection("UpdateCash")) 
    { 
     conn.CommandText = @"update Cash 
          set PaymentSourceID = @PayPalTransactionInfoID 
        where id = @cashID"; 

     conn.AddParam("@PayPalTransactionInfoID", PayPalTransactionInfoID); 

     conn.ExecuteNonQuery(); 
    } 
} 

所以我想嗯,也許改變名稱,這些使他們現在唯一的,有點解釋它更新什麼領域:

UpdateCashOrderID 

UpdateCashTransactionInfoID 

好的,但這不是很好的名字。我不能去過於籠統,例如:

UpdateCashTransaction(int cashID, paypalTransactionID) 

如果我們有不同類型的transactionIDs的,現金持有記錄除了剛剛的paypalTransactionInfoID?如creditCardInfoID?那又怎麼樣?交易不告訴我什麼樣的。進而,如果你要更新2場,所以你有2個PARAMS旁邊cashID PARAM什麼:

UpdateCashTransaction(int cashID, paypalTransactionID, someOtherFieldIWantToUpdate) 

看到我的無奈?處理這個問題的最好辦法是我的老闆不喜歡我的第一條路線?

+0

順便說一句,你不應該啓動一個大寫字母的參數(PayPalTransactionInfoID應該是payPalTransactionInfoID) – 2010-03-31 20:35:05

+0

對不起,我需要更新這篇文章。該網站存在問題。 – PositiveGuy 2010-03-31 20:36:15

+1

它實際上是造成問題嗎?有一個很好的機會,你的老闆只需要一個很好的STFU熱杯... – aehiilrs 2010-03-31 20:42:40

回答

2

我的老闆覺得每次創建一個對象只是爲了更新一個或兩個字段是矯枉過正的。

他會是對的,如果您必須每次創建對象。對此的正確迴應是,您應該已經在整個應用程序中使用這些業務對象。您不需要創建新的Cash對象。您將Cash對象傳遞給您必須保存。

+0

是啊,他做了很多化妝的原因,他爲什麼想要一切完成了他的方式,直到我甚至無法再讓代碼變得怪異爲止......嘿,不如接管我那該死的鍵盤......當一半的時候他甚至都不對,這就是爲什麼我想要驗證其他聰明的開發人員......謝謝。 – PositiveGuy 2010-05-07 04:18:26

+0

他仍然認爲foreach循環比循環更快。 – PositiveGuy 2010-05-07 04:19:03

+0

@coffeeaddict - 你應該比較喜歡foreach和可以的時候。性能差異是微乎其微的,並且通過語義改進來證明是非常合理的。 – 2010-05-07 13:06:22

3

爲什麼不乾脆:

UpdateCashPaymentSource(int cashID, int PayPalTransactionInfoID) 

UpdateCashCapture(int cashID, int paypalCaptureID) 
+0

抱歉,請重新閱讀我的文章...我在更新時遇到了問題。 – PositiveGuy 2010-03-31 20:38:38

+0

是的,還不錯,但是確實對於來電者來說真的意味着什麼?他們不會推斷它實際上正在更新字段CaptureID。並假設假設你在這個現金錶中有一堆CaptureThis CaptureThat字段。然後Capture變得過於通用,調用者現在必須進入方法才能看到代碼。但是命名方法的全部重點是讓你更好地解釋調用方法的作用,所以他們不必總是進入方法來理解可以說什麼,例如捕獲在這種情況下的意思 – PositiveGuy 2010-03-31 20:45:09

+0

看起來像你你正試圖將你的所有評論放在名字中。然後追加一個「ID」到Capture。但是調用者不應該只使用方法的名稱,而應該使用方法的xml文檔!在方法簽名上面追加「///」並填寫xml。然後,調用者將始終清楚參數是什麼以及該方法的作用。 – 2010-03-31 20:54:04

1

「UpdateCashWithCapture」 和 「UpdateCashWithTransaction」?

+0

抱歉,請重新閱讀我的文章...我在更新時遇到了問題。 – PositiveGuy 2010-03-31 20:40:41

0

如何UpdateCashByCaptureIDUpdateCashByTransactionInfoID

+0

「by」部分在兩者上都相同。這是不同的更新部分 – 2010-03-31 20:28:45

+0

是的,然後域驅動的DL專家會討厭這個。但是,對我而言,這是我一直喜歡這樣做的方式。但是現在如果由於字段名太長而導致方法名稱變得很長,該怎麼辦?然後它變得不可讀。此外,如果你現在想要創建一個更新方法,那麼將會增加2個字段或3個字段......所以現在你需要更多的參數。那又怎麼樣?你怎麼稱呼它,因此它推斷出它的作用,而不必一直查看其內部部分? – PositiveGuy 2010-03-31 20:42:32

1

UpdateCashByTransactionInfoID
UpdateCashByCaptureID()

+0

對不起,請重新閱讀我的文章...我有更新它的問題。 – PositiveGuy 2010-03-31 20:39:43

+0

不錯,但是如果你現在正在更新2個參數或者3或4會怎麼樣。一旦更新基於多個字段而不是單身ID,你是否會明白爲什麼名稱依賴於ID會成爲磚牆!我很頭疼,有時會想到最好的路線,因此我在這裏將我的帖子貼在了stackoverflow上。我真的沒有其他開發人員能夠解決這個問題......我們這裏沒有團隊。 – PositiveGuy 2010-03-31 21:36:54

0

,添加字段更新的名稱,即

internal void UpdateCash_paypalCaptureID(...) 
internal void UpdateCash_PayPalTransactionInfoID(...) 
+0

我在方法名中不使用下劃線...不好的做法 – PositiveGuy 2010-03-31 20:41:05

1

將一個方法和枚舉下調嗎?

internal void UpdateCash(int cashID, int id, FieldName field) 
{ 
    using (OurCustomDbConnection conn = CreateConnection("UpdateCash")) 
    { 
     conn.CommandText = string.format("update Cash set {0} = @id where id = @cashID", field.ToString()); 

     conn.AddParam("@id", id); 
     conn.AddParam("@cashId", cashId); 

     conn.ExecuteNonQuery(); 
    } 
} 

public enum FieldName 
{ 
    PayPalCaptureId, 
    PayPalTransactionInfoID 
} 

編輯:

在現在讀你的編輯,我同意你的原來的辦法是去,在我看來的方式 - 通過在一個對象,並更新所有相關的字段在數據庫中,與傳遞對象屬性值並更新數據庫中的值相比,最大的性能殺手將打開數據庫連接,而不是與一個數據庫記錄相關的字段數。

+0

避免這個問題的方法! – 2010-03-31 20:44:31

+0

對不起,請重新閱讀我的文章...我在更新它時遇到問題。 – PositiveGuy 2010-03-31 20:45:43

+0

@傑弗裏 - 這是在編輯之前的問題上的另一個角度:) – 2010-03-31 20:47:10

0

您可以封裝更新查詢邏輯類:

public abstract class CashUpdateQuery 
{ 
    public CashUpdateQuery(int cashId) 
    { 
     this.CashId = cashId; 
    } 

    protected int CashId { get; private set; } 

    public abstract void SetConnectionProperties(OurCustomDbConnection conn); 
} 

然後,你可以爲每個更新方案的具體子類。因此,對於你的PayPal查詢你有這樣的事情:

public PaypalTransactionCashUpdateQuery : CashUpdateQuery 
{ 
    private readonly int paypalCaptureId; 
    public PaypalTransationCashUpdateQuery(int cashId, int paypalCaptureId) 
    { 
     this.paypalCaptureId = paypalCaptureId; 
    } 

    public override void SetConnectionProperties(OurCustomDbConnection conn) 
    { 
     conn.CommandText = @"update Cash 
          set CaptureID = @paypalCaptureID 
          where id = @cashID"; 

     conn.AddParam("@captureID", this.paypalCaptureId); 
     conn.AddParam("@cashID", this.CashId); 
    } 
} 

那麼你的更新方法可以查詢對象,並用它來設置連接上的查詢屬性和執行:

internal void UpdateCash(CashUpdateQuery query) 
{ 
    using(OurCustomDbConnection conn = CreateConnection("UpdateCash")) 
    { 
     query.SetConnectionProperties(conn); 
     conn.ExecuteNonQuery(); 
    } 
} 

這意味着添加新查詢只是添加CashUpdateQuery的新子類的一個例子。

+0

很不幸,我現在有一個老闆認爲這是「過度殺傷」 – PositiveGuy 2010-03-31 21:37:23

相關問題