2012-06-27 182 views
5

我一直在努力尋找實現我的系統實際上是由一個字符串演出季和劇集數相匹配的好方法,你可以在這裏看到當前工作代碼:https://github.com/huddy/tvfilename這是我的PHP應用程序的正確設計模式?

我目前正在重寫此庫,並想要一個更好的方式來實現匹配如何發生,目前基本上它的工作方式是:

有一個文件夾中有類(稱爲處理程序),每個處理程序是一個類,實現一個接口,以確保方法稱爲match();存在,此匹配方法使用存儲在該處理程序類(其中有很多)的屬性中存儲的正則表達式來嘗試匹配季節和情節。

該類加載所有這些處理程序通過實例化每個存儲在屬性中的數組,當我想嘗試匹配某些字符串時,該方法會遍歷這些調用match()的對象;然後返回true的第一個返回結果集中的季節和它匹配的情節。

我真的不喜歡這樣做,這對我來說有點不好,我希望設計模式能夠幫助,我的最終目標是使用最佳實踐來做到這一點,我想知道我是哪一種應該使用?

存在的其他問題是:

  • 一個以上的處理器可以匹配的字符串,所以他們必須在爲了防止更貪心的孩子第一個匹配的,不知道這是可解因爲一些正則表達式模式必須是貪婪的,但可能是一個評分系統,它顯示了匹配的正確性的百分比,但我不知道如何實際實現這一點。

  • 我不是如果實例化所有這些處理程序是一種很好的方法,速度很重要,但是使用最佳實踐並堅持設計模式來創建良好的,可擴展和可維護的代碼是我的最終優先事項。值得一提的處理器類有時做其他事情不僅僅是正則表達式匹配,他們有時預習的串,除去常用詞等匹配

乾杯任何幫助 比利

+1

您可以結帳[Horde Routes](http://dev.horde.org/routes/)。 –

+0

你在想這個。您的貪婪問題可以通過將數組從最貪婪到最貪婪的順序輕鬆解決,並且您的正則表達式都可以在一個類中。我沒有看到比這更直接或更乾淨的方法。 –

回答

2

創建一類每個正則表達式效率非常低,你在這裏將數據與數據混淆。您可以將所有正則表達式存儲在配置數組或單獨的類或XML文件中 - 無關緊要。然後一個方法可以接受所有正則表達式,遍歷它們並執行匹配。 如果一個賽季不總是匹配[1],您可以使用命名的子模式 - 可以解決這個問題。

至於你的模式問題的順序,你可以簡單地把所有模式按你喜歡的順序 - 從最具體的模式到更一般的模式。

1

你可以修改這個pattern to implement complex case analysis到PHP。這或多或少是你一直在做的。您定義所有案例,實施一個條件,說明何時適用案件,以及當您處於案件中時如何解決問題。該模式將允許您決定如果適用多個案例(選擇一個,優先於另一個,或任何您想要的),該怎麼做。

我也想成爲一個好主意,如果你命名你的財產以後格式更好像S01E01

SddEdd 
SnnEnn 
SDigitDigitEDigitDigit 
STwoDigitsETWoDigits 

,而不是格式1,FORMAT2。 您也可以稍微修改該模式以針對案例的條件和解決方案使用對象實例,因此您將能夠使用單個類處理所有RegExps案例 new RegexpCase(「S(?:\ d {2})E(?:\ d {2})「); 以及所有其他不僅僅是用類來解決這種情況的正則表達式。

0

我認爲你需要一個基於你想要的參數的模式順序的偏好順序。 我認爲第二個答案真的很好地回答你的問題。你似乎也很好地處理了你的代碼。看起來相當不錯的代碼

0

我個人更喜歡在這個實例中使用單獨的類,你的代碼庫會如果你採取這種方法(即,如果你真的需要操縱字符串),它會更加靈活。如果你看看Zend如何實現Zend_Validate和Zend_Filter,他們有一個非常類似於當前實現的方法(在類上運行 - > validate()和 - > filter()屬性循環)。

我會有類似這樣的結構:

  • App_Tv_Match
  • App_Tv_Match_Abstract
  • App_Tv_Match_Collection
  • App_Tv_Match_SXXEXX
  • App_Tv_Match_SeasonXEpisodeX

(你的命名可能成爲irritat然而,這些課程)。

然而,在抽象我會類似於這樣的設置:

Abstract Class App_Tv_Match_Abstract 
{ 
    protected $_returnOnMatch = false; 
    protected $_priority  = 1; 
} 

而且我App_Tv_Match_Collection類將有匹配類注射 - 那麼集合類將使用匹配類處理排序和匹配。如果Match類有「returnOnMatch」標記爲true,那麼如果匹配,我會停止嘗試並返回這個(即非貪婪的),但是如果沒有returnOnMatch類匹配,那麼我會返回具有最高優先級的使用排序或集合類中的簡單循環)。

相關問題