正常,健全的所有開發商都試圖保護的所有公共方法輸入(強制轉換爲適當的類型,驗證,消毒等)確保私有/受保護方法的輸入?
我的問題是:你在你的代碼確認(validate)還參數傳遞到保護/私有方法?在我看來,如果你正確地證實了公共方法的參數並從外部返回值(其他類,db,用戶輸入等等),那麼這是沒有必要的。
但我經常面臨的框架和應用程序(即prestashop命名之一),其中驗證通常在方法調用,方法體內重複,並再次爲securize返回值 - 我認爲,這是創建性能開銷和也是設計不好的標誌。
正常,健全的所有開發商都試圖保護的所有公共方法輸入(強制轉換爲適當的類型,驗證,消毒等)確保私有/受保護方法的輸入?
我的問題是:你在你的代碼確認(validate)還參數傳遞到保護/私有方法?在我看來,如果你正確地證實了公共方法的參數並從外部返回值(其他類,db,用戶輸入等等),那麼這是沒有必要的。
但我經常面臨的框架和應用程序(即prestashop命名之一),其中驗證通常在方法調用,方法體內重複,並再次爲securize返回值 - 我認爲,這是創建性能開銷和也是設計不好的標誌。
如果您堅持認爲公共API應該有防禦不良參數的實現,那麼您的標準不應該是方法的可見性,而應該是API的用戶是否直接調用該方法(或通過另一個推遲驗證的方式間接調用它)。這應該的方法
例子做驗證:
class A {
protected final function myMethodDefaultImplementation(...) {
/* subclasses can just call this method in their myMethod implementations */
/* should do validation */
...
}
protected abstract myMethod(...);
public function orderByDate() {
return $this->orderBy(ORDER_BY_DATE)
}
private function orderBy($crit) {
/* should do validation */
...
}
}
沒錯 - 如果你設計你的應用程序以及那麼它不應該是必要的。
對於受保護的,我想你應該對其進行驗證,因爲該方法可以在以後覆蓋或者從另一個類調用,你不能假定有效輸入方法。如果這是一個將被其他應用程序使用的組件,則尤其如此。
對於私人的,我認爲這是一種浪費,因爲你是在被傳遞到方法是什麼控制,使數據需要驗證您是否調用私有方法之前。
只有在最後可能的機會淨化輸入。我不明白OO語義如何使這個有任何不同。
例如,如果出於某種原因不能使用參數化查詢或ORM(ONY的例子,我可以在那一刻:)想,你會寫這樣的功能:
function getname($id) {
$id = intval($id);
mysql_query("SELECT * FROM users WHERE id = $id");
...
}
現在任何代碼都不可能調用這個函數並導致意想不到的結果。
爲什麼downvote?這是如何完成的。創建允許注入SQL的API是沒有意義的。更不用說這是完全**與公認的解決方案相同。 – 2010-05-20 19:11:35
我會說不要緊它是什麼類型的方法(公共,私有,保護),你採取每當需要不看知名度關鍵字適當的預防措施。
除非你使用正則表達式(你不應該是)你不會得到來自驗證了很多性能開銷。 – Andy 2010-05-17 15:07:49
我見過很糟糕的驗證,即。中提及的Prestashop他們有方法isTableOrIdentifier在他們的ORM,它使用正則表達式來檢查表/列名的有效性和字面上叫十倍的一個對象的內部(和想象現在進口幾百或幾千個對象) – 2010-05-17 15:29:17
如果你正在做一個適當的單元測試的級別,然後跳過一些私人成員的驗證會沒事的。總是有風險,但如果你的話;或評論者;對代碼的檢查表明,你的下游假設總是基於公衆成員所做的事情是正確的,然後是罰款。 – JoeGeeky 2010-05-17 18:40:35