2011-02-28 73 views
5

下面是從數據庫規範化理論的一個概念:當一個非鍵字段是一個關於其他非關鍵領域其實功能「正常化」

第三範式受到侵犯。

對於函數/函數參數應用類似的概念是否合理?


考慮以下功能:

function validate(field, rule_name, rule_value); 

// Usage 

validate("password", "min_length", 6); 
validate("password", "matches_regex", "/^\S+$/"); 

在這個例子中的功能,第三個參數描述了第二,似乎沒有「態度」朝第一。這種感覺就像一種非規範化的功能。

我不知道我是否正在制定這個權利,但我可以注意到表名和表字段,數據庫中的類比以及函數名和函數參數。

如果這種類比是有道理的,那麼功能設計師是否會從DB歸一化理論中借鑑概念?

回答

3

對我來說,這個函數的確提出了某種「規則」概念,它是通過一個值進行參數化的。如果您可以擁有這樣的規則/值對列表並通過循環遍歷所有規則進行驗證,則可以使其更具通用性。

看着它的另一種方式,似乎沒有任何丟失,如果你解釋的功能如下:

function validate(field, rule); 

// Usage 

validate("password", MinLengthRule(6)); 
validate("password", RegExRule("/^\S+$/")); 
+0

我很高興你發佈這個,因爲現在我知道這不僅僅是我覺得這個功能有問題。但是,它是什麼讓它感覺不對?它違反了什麼「規則」? – 2011-02-28 16:55:53

+2

@Emanuil如果我想刺探它,原始函數會違反關注點分離:@ MadKeithV的方法允許'validate'函數注入其實際驗證行爲,這使得它具有高度可重用性。即使使用簡單的例子,原始文件也需要多個簽名來適應不同數據類型的規則。 – 2011-02-28 17:57:08

+0

@djacobson - 是的,謝謝,這實際上是我心中的想法。驗證成爲具有一個簽名的單個函數,「規則」變成了一個抽象,可以輕鬆擴展以處理任何「字段」字符串,並返回布爾值來表示字符串是否通過驗證。 – 2011-03-01 08:05:42

0

不同意。 6沒有描述min_length。只有兩者都能創造出有意義的東西。

垃圾字符並不意味着任何東西,直到你注意到它是一個正則表達式。

+2

事情是'rule_name'和'rule_value'有特殊的關係。 'rule_value'的解釋方式由'rule_name'的值決定。如您所見,該值在第一個用法示例中爲int,在第二個示例中爲正則表達式。 – 2011-02-28 16:18:07

1

使用戰略設計模式時,要考慮你的榜樣,對OOP變種。在這種情況下,對於規則名稱來說,自然(至少對我而言)是Rule類的一個屬性,這將支持您的想法。

+0

這是一個非常有趣的主題。 – 2011-02-28 17:29:23

+0

我看到@MadKeithV也考慮使用規則對象。 – Raedwald 2011-02-28 17:35:31