5

文字列から番組のシーズンとエピソード番号に本質的に一致するシステムを実装する良い方法を見つけるのに苦労してきました。現在の作業コードはhttps://github.com/huddy/tvfilenameで確認できます

私は現在このライブラリを書き直しており、一致がどのように発生するかを実装するためのより良い方法が必要です。現在、基本的には次のように機能します。

その中にクラス (ハンドラーと呼ばれる) を含むフォルダーがあり、すべてのハンドラーは、match() と呼ばれるメソッドを保証するためのインターフェイスを実装するクラスです。存在する場合、この match メソッドは、(多数ある) そのハンドラ クラスのプロパティに格納されている正規表現を使用して、シーズンとエピソードの照合を試みます。

クラスは、プロパティに格納された配列に各ハンドラーをインスタンス化することにより、これらすべてのハンドラーをロードします。true を返す最初のものは、一致したシーズンとエピソードを含む結果セットで返されます。

私はこの方法があまり好きではありません。それは私にとって一種のハッキーであり、デザインパターンが役立つことを願っています。私の最終的な目標は、ベストプラクティスを使用してこれを行うことであり、どれを使用すべきか疑問に思いましたか?

存在する他の問題は次のとおりです。

  • 複数のハンドラーが文字列に一致する可能性があるため、貪欲なものが最初に一致しないようにする必要があります。正規表現パターンの一部が貪欲でなければならないため、これが解決可能かどうかはわかりませんが、おそらくスコアシステム、何かこれは、一致が正しい可能性の割合を示していますが、実際にこれを実装する方法はわかりません。

  • これらすべてのハンドラーをインスタンス化することが良い方法であるかどうかはわかりませんが、速度は重要ですが、ベスト プラクティスを使用し、デザイン パターンに固執して、優れた拡張可能で保守可能なコードを作成することが私の究極の優先事項です。ハンドラークラスは、正規表現マッチング以外のことを行う場合があることに注意してください。一般的な単語などを削除して、一致する文字列を準備する場合があります。

どんな助けにも乾杯 ビリー

4

4 に答える 4

2

正規表現ごとにクラスを作成するのは非常に非効率的です。ここではクラスとデータを混同しています。すべての正規表現を構成配列または別のクラスまたは XML ファイルに格納できますが、問題ではありません。次に、単一のメソッドですべての正規表現を受け入れ、それらを反復処理してマッチングを実行できます。季節が常に一致するとは限らない場合[1]、名前付きサブパターンを使用できます-それはその問題を解決します.

パターンの問題の順序については、最も具体的なものからより一般的なものまで、すべてのパターンを好みの順序に並べることができます。

于 2012-07-01T18:29:20.370 に答える
1

このパターンを適応させて、複雑なケース分析を PHP に実装できます。それは多かれ少なかれあなたがやってきたことです。すべてのケースを定義し、ケースがいつ適用されるかを示す条件を実装し、そのケース内にいるときに問題を解決する方法を実装します。このパターンを使用すると、複数のケースが当てはまる場合にどうするかを決めることができます (1 つを選択する、別のケースよりも 1 つを優先する、または何でも好きなように)。

また、S01E01 のように、形式にもっと適切な名前を付けていただければ幸いです。

SddEdd
SnnEnn
SDigitDigitEDigitDigit
STwoDigitsETWoDigits

format1、format2 の代わりに。ケースの条件と解決の両方にオブ​​ジェクト インスタンスを使用するようにパターンを少し変更することもできます。そのため、単一のクラス new RegexpCase("S(?:\d{ 2})E(?:\d{2})"); そして、そのケースを解決するためのクラスを持つ単なる正規表現ではない他のすべてのケース。

于 2012-07-03T00:25:52.887 に答える
0

必要なパラメーターに基づいて、パターンの順序を優先する必要があると思います。2番目の回答は本当にあなたの質問にうまく答えていると思います.また、あなたはあなたのコードで良い仕事をしているようです.それはかなりよく書かれているようです.

于 2012-07-04T07:18:38.823 に答える
0

個人的には、このインスタンスでは個別のクラスを使用することを好みます。その方法を採用すると (つまり、本当に文字列を操作する必要がある場合)、コード ベースははるかに柔軟になります。Zend が Zend_Validate と Zend_Filter を実装する方法を見ると、現在の実装と非常によく似たアプローチがあります (クラスで ->validate() と ->filter() を実行しているプロパティをループします)。

私はこれに似た構造を持つでしょう:

  • アプリ_テレビ_マッチ
  • App_Tv_Match_Abstract
  • App_Tv_Match_Collection
  • App_Tv_Match_SXXEXX
  • App_Tv_Match_SeasonXEpisodeX

(しかし、あなたの命名はクラスにとっていらいらするかもしれません)。

ただし、要約すると、次のような設定になります。

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

そして、私の App_Tv_Match_Collection クラスには、一致クラスが挿入されます。コレクション クラスは、一致クラスを使用して並べ替えと一致を処理します。Match クラスの "returnOnMatch" に true のフラグが立てられていた場合、一致した場合は試行を中止してこれを返します (つまり、貪欲でないもの)。しかし、returnOnMatch クラスが一致しなかった場合は、最も優先度の高いものを返します (どちらかソート、またはコレクション クラスの単純なループを使用します)。

于 2012-07-20T09:23:00.237 に答える