El modo intérprete del zen del modo diseño

1. Definición del modo intérprete

El modo de intérprete es un esquema que analiza de acuerdo con la gramática especificada. Raramente se usa en proyectos actuales. Su definición es la siguiente:
dado un lenguaje, define una representación de su gramática y define un intérprete, que interpreta El procesador usa esta representación para interpretar oraciones en el lenguaje.

Clase general de patrón de intérprete:

(1) AbstractExpression-abstract interprete

La tarea de interpretación específica se completa con cada clase de implementación, y el intérprete específico se completa con TerminalExpression y Non-terminalExpression

(2) Expresión terminal-expresión-terminal

Para lograr la operación de interpretación asociada con los elementos de la gramática, generalmente solo hay una expresión de terminal en un modo de intérprete, pero hay varias instancias correspondientes a terminales diferentes. Específicamente, nuestro ejemplo es la clase Var-Expression. Cada terminal en la expresión genera un objeto VarExpression en la pila.

(3) Expresión no terminal-expresión no terminal

Cada regla en la gramática corresponde a una expresión no terminal. Específicamente, nuestro ejemplo es que las reglas de suma y resta corresponden a las dos clases AddExpression y SubExpression. Las expresiones no terminales aumentan según la complejidad de la lógica. En principio, cada regla gramatical corresponde a una expresión no terminal.

(4) Rol contexto-ambiente

Específico a nuestro ejemplo es usar Hash-Map en su lugar.

Segundo, la aplicación del modo intérprete

1. Ventajas del modo intérprete

El intérprete es una herramienta de análisis gramatical simple. Su ventaja más obvia es su escalabilidad. Para modificar las reglas gramaticales, solo necesita modificar la expresión no terminal correspondiente. Si extiende la gramática, solo necesita agregar la clase de símbolo no terminal.

2. Desventajas del modo intérprete

(1) El modo de intérprete causará expansión de clase

Cada gramática debe producir una expresión no terminal. Cuando las reglas gramaticales son más complicadas, se puede generar una gran cantidad de archivos de clase, lo que causa muchos problemas de mantenimiento.

(2) El modo de intérprete utiliza un método de llamada recursiva

Cada expresión no terminal solo se preocupa por las expresiones relacionadas con sí misma, y ​​debe despegarse capa por capa. Ya sea que se trate de un lenguaje orientado a procesos o un lenguaje orientado a objetos, la recursión se usa bajo las condiciones necesarias, lo que conduce a la depuración Es muy complicado Piénselo, si desea solucionar un error gramatical, ¿queremos depurar con un punto de interrupción hasta la unidad gramatical más pequeña?

(3) Problemas de eficiencia

Debido a que el modo de intérprete usa muchos bucles y recursividad, la eficiencia es un problema que no se puede ignorar, especialmente cuando se usa para analizar gramáticas complejas y largas, la eficiencia es insoportable.

3. Escenas utilizadas en modo intérprete

(1) Problemas repetidos pueden usar el modo intérprete

Por ejemplo, varios servidores de aplicaciones generan muchos registros todos los días y los archivos de registro deben analizarse y procesarse. Debido a que el formato de registro de cada servidor es diferente, pero los elementos de datos son los mismos, según el intérprete, las expresiones de terminal son todas iguales Pero las expresiones no terminales deben formularse. En este caso, el problema se puede resolver de una vez por todas a través de procedimientos.

(2) Una gramática simple necesita explicación

¿Por qué es simple?
Mirando las expresiones no terminales, cuantas más reglas gramaticales, mayor será la complejidad y las llamadas recursivas entre clases. Piense qué tipo de paciencia y confianza necesita para solucionar problemas cuando llame entre varias clases. Por lo tanto, el modo de intérprete se usa generalmente para analizar más juegos de caracteres estándar, como el análisis de sintaxis SQL, pero esta parte se reemplaza gradualmente por herramientas especiales.

4. Notas sobre el modo intérprete

Intente no utilizar el modo de intérprete en módulos importantes, de lo contrario el mantenimiento será un gran problema. En el proyecto, puede usar shell, JRuby, Groovy y otros lenguajes de secuencias de comandos para reemplazar el modo de intérprete para compensar la falta de lenguajes compilados de Java. Utilizamos JRuby para el procesamiento de cálculos en el proyecto analítico de un banco, evitando las cuatro operaciones del modo intérprete, y el rendimiento y el rendimiento son buenos en todos los aspectos.

3. Mejores prácticas

El modo de intérprete se usa muy raramente en el desarrollo real del sistema, ya que causará problemas como la eficiencia, el rendimiento y el mantenimiento. En general, se puede encontrar en proyectos de marcos grandes y medianos, como algunas herramientas de análisis de datos, herramientas de diseño de informes, Herramientas informáticas científicas, etc. Si encuentra "un tipo particular de problema ocurre con bastante frecuencia", al prepararse para usar el modo de intérprete, puede considerar los kits de herramientas de análisis de código abierto como Expression4J, MESP, Jep, etc. Y es muy fácil de usar, y la eficiencia no es mala. No hay ningún problema en la implementación de la mayoría de las operaciones matemáticas. No hay necesidad de escribir un intérprete desde cero.
Ejemplo de código:
https://github.com/developers-youcong/DesignPatternPractice/tree/master/Interpreter

Supongo que te gusta

Origin www.cnblogs.com/youcong/p/12724877.html
Recomendado
Clasificación