比方說,我有一個函數可以將記錄插入數據庫表中,字符串字段的長度有限。一般來說,我應該在什麼時候截斷對於存儲位置來說太長的字符串,在插入函數本身中還是在代碼中調用它的每個點上?何時截斷比存儲位置更長的字符串?
(我在這裏假設太長比擁有一個異常拋出更理想的字符串是被截斷。)
比方說,我有一個函數可以將記錄插入數據庫表中,字符串字段的長度有限。一般來說,我應該在什麼時候截斷對於存儲位置來說太長的字符串,在插入函數本身中還是在代碼中調用它的每個點上?何時截斷比存儲位置更長的字符串?
(我在這裏假設太長比擁有一個異常拋出更理想的字符串是被截斷。)
我認爲這取決於函數的位置以及它的可訪問性。
如果它是一個私人的功能,只是讓你自己的SQL庫,然後你也許可以逃脫在功能截斷它。
如果它在這,說,你的團隊在工作,那麼所有使用也許你需要嘗試插入它之前至少解析字符串庫。
如果它是一個公共的API,那麼你不應該靜靜地截斷任何東西 - 拋出一個有意義的異常來代替。
這應該坐在插入功能 - 它的數據庫特定的實現,而不是調用應用。如果你設法改變你的數據結構,你不想回頭查看所有的客戶端代碼,以確保使用完整的字符串。
按Widor,但我還要補充:
您的應用程序就理應結構使得有你的代碼的其餘部分從數據庫和它的實現邏輯隔離不同的數據層。
在高流量系統中,您最好希望限制數據庫和代碼之間來回傳遞的數據量,因此數據驗證應在數據層傳遞到數據庫之前由您的數據層執行。在這裏,您可以爲您的業務邏輯提出一個有意義的異常來處理。
數據層提供的對象數據不必承擔任何關係什麼是真正存儲或數據庫。例如,它可能會提供一個數據對象類,它實際上是存儲在多個表中的數據的組合。
數據層本身的結構可以處理不同的數據庫實現。
我已經使用已經讓我在運行時需要,而無需重新編譯SQL,MySQL數據庫,XML文件存儲和編譯測試數據之間切換,在過去的一個工廠模式。
編輯 您的應用程序數據層是您的應用程序代碼之間的接口,例如,業務邏輯和GUI以及您的數據庫。
業務邏輯將觸發數據層以使用字符串更新數據庫。
在你的例子中,數據層包含你的更新函數。
您可以驗證字符串,如果太長截斷它,然後更新數據庫(通過存儲過程調用或例如直寫),該函數內,如果你的願望。
實際上,您將有許多字符串必須限制在相同的長度,因此建議您使用單獨的函數執行驗證以保存重複的代碼。
另外,您可能希望驗證/截斷字符串,並在不將數據寫入數據庫的情況下通知用戶/調用代碼。
本質上,雖然這是由您的應用程序數據層代碼執行的,它可能封裝在類庫/ dll中,而不是留給數據庫來處理,也不是業務邏輯(除了對任何錯誤事件/反饋反饋)。
假設我在問題中提到的函數是_in_數據層。或者說,你是說截斷應該發生在數據層內? –
如果您的插入功能位於數據層,而不是應用程序業務邏輯或數據庫存儲過程,那麼是的。看到我編輯的答案。 – ChrisBD
+1 - 我同意這 – ChrisBD
恐怕簡單地拋出一個異常會導致稍後出現問題,因爲懶惰的編程......也就是說,我期望使用這個函數的程序員很可能會忘記用長字符串進行測試。 –
@Protectorone在這種情況下,他們會很高興你拋出異常,當然!如果你沒有,他們永遠不會知道他們的字符串已被截斷! – Widor