Comment résoudre les problèmes d'expression en Java

Qu'est-ce que le problème d'expression?

http://maoe.hatenadiary.jp/entry/20101214/1292337923

Comment puis-je ajouter de nouveaux types de données et de nouvelles fonctions dans un langage à typage statique sans recompilation?

C'est le problème. Si vous concevez une classe sans réfléchir,

  1. Structure de données facile à ajouter mais opération difficile à ajouter
  2. Facile à ajouter des opérations mais difficile d'ajouter des structures de données Il est facile de devenir l'un ou l'autre. La prise de conscience du problème du problème d'expression est de savoir comment ajouter des structures de données et des opérations.

Solution Java

Haskell, OCaml, Scala, etc. sont déjà connus pour leurs solutions utilisant des fonctions de langage avancées (?), Mais il est montré que le problème d'expression peut également être résolu avec les fonctions du langage Java.

  1. Comment utiliser le sous-typage + la covariation de la valeur de retour
  2. Comment utiliser le sous-typage + les génériques

Il existe les deux méthodes ci-dessus. Cet article présente deux méthodes.

exemple

Prenons d'abord un simple interprète comme exemple. Notez que Lombok est utilisé pour la simplification du code.

import lombok.AllArgsConstructor;
import lombok.Data;

interface Exp {
    int eval();
}

@Data
@AllArgsConstructor
class Add<E extends Exp> implements Exp {
    private E e1;
    private E e2;

    @Override
    public int eval() {
        return e1.eval() + e2.eval();
    }
}

@Data
@AllArgsConstructor
class Lit implements Exp {
    private int x;

    @Override
    public int eval() {
        return x;
    }
}

L'endroit où le champ de la classe Add est un paramètre de type appelé E est une erreur.

Ajouter une opération

Ajoutez une opération d'impression à cette classe.

interface ExpP extends Exp {
    String print();
}

class LitP extends Lit implements ExpP {

    LitP(int x) {
        super(x);
    }

    @Override
    public String print() {
        return String.valueOf(getX());
    }
}

class AddP<E extends ExpP> extends Add<E> implements ExpP {

    AddP(E e1, E e2) {
        super(e1, e2);
    }

    @Override
    public String print() {
        return getE1().print() + " + " + getE2().print();
    }
}

J'ai pu ajouter la classe existante sans aucun problème.

Ajouter une classe

Ajoutez une classe qui représente Sub (soustraction).

@Data
@AllArgsConstructor
class Sub<E extends Exp> implements Exp {
    private E e1;
    private E e2;

    @Override
    public int eval() {
        return e1.eval() - e2.eval();
    }
}

class SubP<E extends ExpP> extends Sub<E> implements ExpP {

    SubP(E e1, E e2) {
        super(e1, e2);
    }

    @Override
    public String print() {
        return getE1().print() + " - " + getE2().print();
    }
}

Dans les deux cas, des opérations peuvent être ajoutées / des classes peuvent être ajoutées sans modifier la classe existante. La classe qui les utilise est la suivante.

public class Main {

    public static void main(String[] args) {
        new Add<Exp>(new Lit(1), new Lit(3)).eval();
        new Sub<Exp>(new Lit(1), new Lit(3)).eval();

        new AddP<ExpP>(new LitP(1), new LitP(3)).print();
        new SubP<ExpP>(new LitP(1), new LitP(3)).print();
    }
}

Dans les situations où une extensibilité élevée est requise (devrait étendre à la fois la structure et le fonctionnement des données), je pense qu'il vaut la peine de se souvenir de ce modèle de conception (nom inconnu?). Si vous êtes également intéressé par la méthode «utilisant le sous-typage + covariation de la valeur de retour», veuillez vous référer aux références suivantes. (* Le contenu de cet article est le pakuri rond du papier suivant)

Les références

Wang, Yanlin, and Bruno C. D. S. Oliveira. "The expression problem, trivially!." Proceedings of the 15th International Conference on Modularity. ACM, 2016.

Recommended Posts

Comment résoudre les problèmes d'expression en Java
Essayez de résoudre un problème FizzBuzz restreint en Java
Comment apprendre JAVA en 7 jours
Essayez une expression If en Java
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Comment concaténer des chaînes avec Java
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Essayez de résoudre Project Euler en Java
Comment faire une conversion de base en Java
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
Comment obtenir la date avec Java
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
Comment obtenir la longueur d'un fichier audio avec Java
Je souhaite envoyer un e-mail en Java.
Comment afficher une page Web en Java
Deuxième décoction: essayez une expression If en Java
Comment obtenir une classe depuis Element en Java
Comment utiliser l'API Java avec des expressions lambda
Comment masquer les champs nuls en réponse en Java
Je veux ForEach un tableau avec une expression Lambda en Java
Comment créer un fichier exécutable dans Maven
Comment écrire Java String # getBytes dans Kotlin?
[Java] Essayez de résoudre le problème de Fizz Buzz
Comment rendre une image partiellement transparente avec le traitement
Comment appeler des fonctions en bloc avec la réflexion Java
Comment créer un environnement Java en seulement 3 secondes
[Java] Comment omettre le constructeur privé dans Lombok
Comment entrer / sortir des fichiers mainframe IBM en Java?
[Java] J'ai essayé de résoudre le problème de rang B de Paiza
Comment créer un URI de données (base64) en Java
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment convertir un fichier en tableau d'octets en Java
Résumé de la mise en œuvre des arguments par défaut en Java
Comment mettre l'ancien Java (série 8) dans macOS 10.15 Catalina
[Rails] Comment afficher les images dans la vue
Remarques sur l'utilisation des expressions régulières en Java
Comment abaisser la version java
Comment désinstaller Java 8 (Mac)
Java - Comment créer JTable
Comment utiliser java Facultatif
Comment réduire les images Java
Comment rédiger un commentaire java
Comment utiliser la classe Java
[Java] Comment utiliser removeAll ()
[Java] Comment afficher les Wingdings
Comment utiliser Java Map
Comment définir des constantes Java
Comment utiliser les variables Java