0. Définition du mode interprète:
Compte tenu d'une langue, définissez une représentation de sa grammaire et définissez un interprète qui utilise la représentation pour interpréter les phrases dans la langue. Appartient au mode comportemental.
Le mode interprète est très peu utilisé dans le développement réel du système car il peut entraîner des problèmes tels que l'efficacité, les performances et la maintenance.
Le diagramme de classe générale du mode interprète est illustré sur la figure.
1. Avantages du mode interprète
L'interprète est un simple outil d'analyse de syntaxe. Son avantage le plus important est son expansion. La modification des règles de syntaxe est simplement de modifier l'expression non terminale correspondante. Si vous développez la syntaxe, il vous suffit d'ajouter une classe non terminale.
2. Inconvénients du mode interprète
Le modèle d'interprète entraînera l'expansion de la classe: chaque syntaxe doit produire une expression non terminale. Lorsque les règles de syntaxe sont relativement complexes, un grand nombre de fichiers de classe peuvent être générés, ce qui demande beaucoup de problèmes à la maintenance.
Le modèle d'interprète adopte une méthode d'appel récursive: chaque expression non terminale ne se soucie que des expressions liées à elle-même. Chaque expression doit connaître le résultat final et doit être une couche non revêtue par couche. Qu'il s'agisse d'un langage orienté vers le processus ou d'un langage orienté objet, la récursivité est utilisée dans des conditions nécessaires, ce qui conduit à un débogage très complexe. Pensez-y, si nous voulons dépanner une erreur de syntaxe, devons-nous déboguer un par un, jusqu'à la plus petite unité de syntaxe?
Problème d'efficacité: Le mode interprète utilise beaucoup de boucles et de récursivité, l'efficacité est un problème qui ne peut pas être ignoré, en particulier lorsqu'il est utilisé pour analyser la syntaxe complexe et longue. L'efficacité est insupportable.
3. Utilisez des scénarios de mode interprète
Des problèmes répétés peuvent être utilisés avec le mode interprète: par exemple, plusieurs serveurs d'applications génèrent un grand nombre de journaux chaque jour, et les fichiers journaux doivent être analysés et traités. Étant donné que les formats de journal de chaque serveur sont différents, les éléments de données sont les mêmes. Selon l'interprète, les expressions Terminator sont les mêmes, mais les expressions non terminales doivent être formulées. Dans ce cas, le problème peut être résolu une fois pour tout à travers un programme.
Un scénario où une syntaxe simple doit être expliquée: Pourquoi est-ce simple? Regardez les expressions non terminales. Plus il y a de règles grammaticales, plus la complexité est élevée et les appels récursifs sont nécessaires entre les classes (voir la pile dans notre exemple), ce qui n'est généralement pas compliqué. Pensez-y, quel genre de patience et de confiance avez-vous besoin pour résoudre les problèmes lorsque vous appelez plusieurs classes. Par conséquent, le mode interprète est généralement utilisé pour analyser les jeux de caractères standard comparatifs, tels que l'analyse de syntaxe SQL, mais cette partie est progressivement remplacée par des outils spécialisés. Dans certains environnements commerciaux spéciaux, le modèle d'interprète sera également utilisé. L'exemple que nous venons de faire est un environnement commercial, et il existe de nombreux exemples d'opérations de modèle maintenant. De nombreuses institutions commerciales sont en mesure de fournir une grande quantité de données pour l'analyse.
4. Exemples simples
/ ** * Déclarer une opération d'interprétation abstraite * / Interface interface publique {public void interprét (contexte de contexte); // En fait, il peut y avoir un type renvoyé pour définir l'objet de données interprété} la classe publique XMLSaxInterpreter implémente l'interpréteur {@Override public void interprét (context context) {System.out.println ("xml sax interpréter:" + context.getData ()); }} classe publique XMLDomInterpreter implémente l'interprète {@Override public void interprét (context context) {System.out.println ("xml Dom Interpreter:" + context.getData ()); }} / ** * Contient des informations en dehors de l'interprète * / Classe publique Context {Private String Data; public String getData () {return data; } public void setData (String data) {this.data = data; }} Public Class test {public static void main (String [] args) {context context = new context (); context.setData ("un morceau de données XML"); Nouveau xmlSaxInterpreter (). Interpréter (contexte); new xmldominterpreter (). interpréter (contexte); }}5. Notes sur le mode interprète
Essayez de ne pas utiliser le mode interprète dans des modules importants, sinon la maintenance sera un gros problème. Dans le projet, vous pouvez utiliser des langages de script tels que Shell, JRuby et Groovy pour remplacer le mode interprète pour compenser les lacunes des langues compilées Java. Nous utilisons JRuBy pour le traitement du calcul dans le projet analytique d'une banque, en évitant le fonctionnement à quatre caractères en mode interprète et en fonctionnant bien dans tous les aspects de l'efficacité et des performances.