2012-06-27 16 views
5

He estado luchando para encontrar una buena manera de poner en práctica mi sistema que coincide esencialmente la temporada y el número de episodio de un show de una cadena, se puede ver el código actual de trabajo aquí: https://github.com/huddy/tvfilename¿Cuál es el patrón de diseño correcto para mi aplicación PHP?

Actualmente estoy reescribiendo este biblioteca y quiere una manera más agradable de implementar cómo ocurre la coincidencia, actualmente esencialmente la forma en que funciona es:

Hay una carpeta con clases (llamados manejadores), cada controlador es una clase que implementa una interfaz para garantizar una método llamado match(); existe, este método de coincidencia usa la expresión regular almacenada en una propiedad de esa clase de controlador (de la que hay muchas) para intentar hacer coincidir una temporada y un episodio.

La clase carga todos estos controladores instanciando cada uno en una matriz almacenada en una propiedad, cuando quiero probar y hacer coincidir algunas cadenas, el método itera sobre estos objetos llamando a match(); y el primero que devuelve verdadero se devuelve en un conjunto de resultados con la temporada y el episodio coincidentes.

Realmente no me gusta esta forma de hacerlo, es un poco raro para mí, y espero que un patrón de diseño pueda ayudar, mi objetivo final es hacer esto usando las mejores prácticas y me pregunto cuál ¿debería usar?

Los otros problemas que existen son:

  • Más de un manejador podría coincidir con una cadena, por lo que tienen que estar en una orden para evitar los más codiciosos juego en primer lugar, no estoy seguro si esto es solucionable como algunos de los patrones de expresiones regulares tienen que ser codiciosos, pero posiblemente un sistema de puntuación, algo que muestra un porcentaje de la probabilidad de que el partido sea correcto, aunque no tengo idea de cómo implementarlo.

  • No estoy si crear una instancia de todos esos controladores es una buena forma de hacerlo, la velocidad es importante, pero usar las mejores prácticas y seguir patrones de diseño para crear código bueno, extensible y mantenible es mi máxima prioridad. Vale la pena señalar las clases de controlador a veces hacen otras cosas que el juego acaba de expresiones regulares, a veces preparar la cadena que se corresponde con la eliminación de las palabras comunes, etc.

Saludos para cualquier ayuda Billy

+1

Puede consultar [Rutas de la Horda] (http://dev.horde.org/routes/). –

+0

Estás pensando demasiado en esto. Su problema de avaricia puede resolverse fácilmente ordenando la matriz de menos codiciosos a los más codiciosos, y sus expresiones regulares pueden ser todas en una sola clase. No veo un enfoque más directo o más limpio que eso. –

Respuesta

2

Creación de una clase de cada expresión regular es muy ineficiente, estás confundiendo clases con datos aquí. Puede almacenar todas las expresiones regulares en una matriz de configuración o una clase separada o archivo XML, no importa. Entonces, un único método podría aceptar todas las expresiones regulares, iterar a través de ellas y realizar coincidencias. En caso de que una temporada no siempre coincida [1], puede usar subpatrones con nombre, eso resolvería ese problema.

En cuanto a su problema de orden de patrones, puede simplemente colocar todos los patrones en su orden preferido, desde los más específicos hasta los más generales.

1

Puede adaptar este pattern to implement complex case analysis a PHP. Es más o menos lo que has estado haciendo. Usted define todos los casos, implementa una condición que indica cuándo se aplica el caso y cómo resolver el problema cuando se encuentra dentro de ese caso. El patrón le permitirá decidir qué hacer si se aplican múltiples casos (elija uno, dé una preferencia sobre otra, o lo que quiera).

También sería una buena idea si usted designó a su somthing formatos más agradable como por S01E01

SddEdd 
SnnEnn 
SDigitDigitEDigitDigit 
STwoDigitsETWoDigits 

en lugar de formato1, formato2. También podría modificar un poco el patrón para usar instancias de objeto tanto para la condición como para la resolución del caso, para que pueda manejar todos los casos RegExps con una única clase new RegexpCase ("S (?: \ d {2}) E (?: \ d {2}) "); y todos los otros casos que no son solo expresiones regulares con una clase para resolver ese caso.

0

Creo que necesita un orden de preferencia para su orden de patrones en función del parámetro que desee. Creo que la segunda respuesta realmente responde bien a su pregunta.También parece que está haciendo un buen trabajo con su código.Parece bastante bien -escrito

0

Personalmente preferiría utilizar clases separadas en esta instancia, su código base será sea ​​mucho más flexible si toma ese enfoque (es decir, si realmente necesita manipular la cadena). Si nos fijamos en cómo Zend implementa Zend_Validate y Zend_Filter, tienen un enfoque muy similar a la implementación actual (ciclo sobre una propiedad que se ejecuta -> validate() y -> filter() en las clases).

tendría una estructura similar a esto:

  • App_Tv_Match
  • App_Tv_Match_Abstract
  • App_Tv_Match_Collection
  • App_Tv_Match_SXXEXX
  • App_Tv_Match_SeasonXEpisodeX

(Su nombramiento puede convertirse irritat sin embargo, para las clases).

Sin embargo, en el resumen que tendría una configuración similar a esto:

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

Y mi clase App_Tv_Match_Collection tendría las clases partidos inyectaron - la clase de colección sería entonces manejar la clasificación y comparación utilizando las clases de partido. Si una clase Match tuviera marcado "returnOnMatch" como verdadero, si dejara de intentarlo devolvería este (es decir, para los no codiciosos); sin embargo, si no coinciden las clases returnOnMatch, entonces devolvería la que tenga la prioridad más alta (ya sea usando clasificación, o un simple bucle en la clase de colección).

Cuestiones relacionadas