[JAVA] À propos de l'utilité des monades dans une perspective orientée objet

Revenons à l'orientation objet.

Cette fois, j'écrirai sur la programmation fonctionnelle dans une perspective orientée objet.

Qu'est-ce qu'un "objet" orienté objet?

Il y a beaucoup de controverse à ce sujet, mais je trouve exact de deviner la traduction de «objet» pour les objets.

La cible (objet) est une valeur

Cela signifie que l'objet lui-même est également une valeur. Un exemple simple est présenté ci-dessous en ** Java **.

public class Foo {
    private int value;
    Foo (v) {
        this.value = v;
    }
    public add_foo (v) {
        this.value += v;
    }
}

public class Test_Foo {
    public static void main (String[] args) {
        Foo foo = new Foo(5);
    }
}

Foo foo = new Foo(5); Pour expliquer un petit rond-point, Le type de la variable foo est Foo et une instance de Foo est assignée à foo. Ce sera.

Cette instance, la valeur, non?

Pour être précis, il doit s'agir d'un pointeur et stocke l'instance au point.

Envisagez d'appeler une méthode de valeur

Peut-être que je le fais bien en Java. Un exemple est lorsque vous utilisez une chaîne de caractères, La fonction renvoie le résultat directement, mais n'est-il pas possible de gérer les chaînes de manière pratique?

Ajouter une méthode à une valeur primitive

Le sujet est le suivant. Ajoutons une méthode à la valeur 3. Comment puis-je le faire? En Java, héritez de la classe écrite comme suit et ajoutez des méthodes, L'idée est d'utiliser la méthode ajoutée,

public class IFT {
    private int v;
    IFT (int v) {
        this.v = v;
    }
    public int value () {
        return v;
    }
}

Avec javascript, vous pouvez écrire comme ça.

class MonoInt {
  constructor (v) {
    this.v = v;
  }
  static of (v) {
    return new MonoInt(v);
  }
  get join () {
    return this.v;
  }
  map (f) {
    return MonoInt.of(f(this.v));
  }
  bind (f) {
    return this.map(f).join;
  }
}
MonoInt.of(3).map(v => v + 3).join; // 6
MonoInt.of(5).bind(v => Monoint.of(v * 8)).join; // 40

Une fonction de flèche, λ (lambda), qui peut être utilisée à partir de Java8, etc. est sortie. À ce stade, MonoInt prend une seule valeur et écrit le code à la condition qu'il ne fasse référence à aucune valeur de l'extérieur et ne l'ajoute pas.

Les objets peuvent être interprétés comme une sphère

Un objet a une ** valeur ** appelée propriété et est un concept d'implémentation d'une ** transformation naturelle ** appelée méthode. Et si l'objet lui-même est également une valeur, si vous modifiez le code ci-dessus comme suit ...


class Foo {
  constructor (v) {
    this.value = v;
    this.key = "foo";
  }
  get oo () {
    return this.v;
  }
  set oo (v) {
    this.v = v;
  }
  resetKey (v) {
    this.key = "foo" + v;
  }
}

class Fix {
  constructor (v) {
    this.v = v;
  }
  static of (v) {
    return new Fix(v);
  }
  get join () {
    return this.v;
  }
  map (f) {
    return Fix.of(f(this.v));
  }
  bind (f) {
    return this.map(f).join;
  }
  re (f) {
    this.map(f);
    return this;
  }
  assign (o) {
    return this.re(v => Object.assign(v, o));
  }
}

Fix.of(new Foo(5)).map(foo => foo.oo).map(v => v + 3).join
// 8

Fix.of(new Foo(5)).re(foo => foo.oo += 3).assign(["bar", "baz"])).join
/*
Foo {
  "0": "bar",
  "1": "baz",
  value: 8,
  key: "foo"
}
*/

Une fonction qui gère l'objet en masse même lorsque la méthode de l'objet ne renvoie rien J'ai pu mettre en œuvre ** re **. Cela nous permet d'implémenter ** assign **, qui peut déléguer Object.assign.

Si vous ajoutez une méthode qui utilise re, map et bind en interne à l'aide du corps Fix ou d'une classe qui hérite de Fix, vous pouvez exécuter la méthode comme si l'objet l'avait à l'origine. ..

À ce stade, le corps d'objet affecté n'a pas besoin d'avoir cette méthode.

Monad n'est pas difficile

Pour être précis, il semble que les monades qui peuvent effectuer endo (redo) soient dites des monades supplémentaires. C'est pratique, j'aimerais donc l'intégrer de plus en plus.

Si vous avez des corrections ou des suggestions, nous vous répondrons sincèrement. Merci de rester avec nous jusqu'à la fin.

Recommended Posts

À propos de l'utilité des monades dans une perspective orientée objet
Résumons la grammaire Java 8 du point de vue des ingénieurs iOS
Comment écrire Scala du point de vue de Java
Langage Java du point de vue de Kotlin et C #
À propos de la gestion de Null
À propos des instances Java
À propos de la description de Docker-compose.yml
De l'habitude de créer des objets de valeur pour une compréhension orientée objet
À propos du comportement de ruby Hash # ==
À propos des bases du développement Android
À propos du rôle de la méthode initialize
Pensez aux 7 règles d'Optionnel
À propos du niveau de journalisation de java.util.logging.Logger
Comparaison des types sûrs à tolérance nulle, à tolérance nulle et à tolérance nulle du point de vue de la sécurité nulle
Un oncle orienté objet avec 25 ans d'histoire orientée objet parle d'une prescription pour la conception orientée objet
[Challenge CircleCI from 0] Apprenez les bases de CircleCI
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
À propos du fonctionnement de next () et nextLine ()
Comparer les éléments d'un tableau (Java)
L'histoire de RxJava souffrant de NoSuchElementException
À propos de l'affichage initial de Spring Framework
À propos du traitement de BigDecimal (avec réflexion)
À propos du nombre de threads de Completable Future
Trouvez la différence à partir d'un multiple de 10
Le contenu de useBodyEncodingForURI a-t-il changé par rapport à Tomcat8?
À propos de la vitesse de récupération des valeurs depuis HashMap
Pensez à la combinaison de Servlet et Ajax
À propos du guide de démarrage officiel de Spring Framework
A propos de l'ordre de description des propriétés système Java
À propos de l'idée des classes anonymes en Java
À propos de next () et nextLine () de la classe Scanner
Un record de travail à domicile pendant environ deux mois pour un ingénieur diagnostiqué avec une pneumonie virale.