[JAVA] Über die Nützlichkeit von Monaden aus einer objektorientierten Perspektive

Kehren wir von der Objektorientierung zurück.

Dieses Mal werde ich über funktionale Programmierung aus einer objektorientierten Perspektive schreiben.

Was ist ein objektorientiertes "Objekt"?

Es gibt viele Kontroversen darüber, aber ich finde es richtig, die Übersetzung von "Objekt" für Objekte zu erraten.

Das Ziel (Objekt) ist ein Wert

Dies bedeutet, dass das Objekt selbst auch ein Wert ist. Ein einfaches Beispiel ist unten in ** Java ** gezeigt.

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); Um einen kleinen Kreisverkehr zu erklären, Der Typ der Variablen foo ist Foo, und eine Instanz von Foo wird foo zugewiesen. Es wird sein.

Diese Instanz, der Wert, richtig?

Um genau zu sein, sollte es ein Zeiger sein und die Instanz am Punkt speichern.

Erwägen Sie den Aufruf einer Wertemethode

Vielleicht mache ich es gut in Java. Ein Beispiel ist das Bedienen einer Zeichenfolge. Die Funktion gibt das Ergebnis direkt zurück, aber ist es nicht möglich, Zeichenfolgen bequem zu handhaben?

Fügen Sie einem primitiven Wert eine Methode hinzu

Das Thema ist dies. Fügen wir dem Wert 3 eine Methode hinzu. Wie kann ich es tun? Erben Sie in Java die wie folgt geschriebene Klasse und fügen Sie Methoden hinzu: Die Idee ist, die hinzugefügte Methode zu verwenden,

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

Mit Javascript können Sie so schreiben.

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

Eine Pfeilfunktion, λ (Lambda), die von Java8 usw. verwendet werden kann, ist herausgekommen. Zu diesem Zeitpunkt nimmt MonoInt nur einen Wert und schreibt den Code unter der Bedingung, dass er nicht auf einen Wert von außen verweist und ihn nicht hinzufügt.

Objekte können als eine Kugel interpretiert werden

Ein Objekt hat einen ** Wert **, der als Eigenschaft bezeichnet wird, und ist ein Implementierungskonzept einer ** natürlichen Transformation **, die als Methode bezeichnet wird. Und wenn das Objekt selbst auch ein Wert ist, wenn Sie den obigen Code wie folgt ändern ...


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"
}
*/

Eine Funktion, die das Objekt in großen Mengen verarbeitet, auch wenn die Methode des Objekts nichts zurückgibt Ich konnte ** re ** implementieren. Dies ermöglicht es uns, ** assign ** zu implementieren, das Object.assign delegieren kann.

Wenn Sie eine Methode hinzufügen, die intern re, map und bind verwendet, indem Sie den Fix-Body oder eine Klasse verwenden, die Fix erbt, können Sie die Methode so ausführen, als ob das Objekt sie ursprünglich hätte. ..

Zu diesem Zeitpunkt muss der zugewiesene Objektkörper nicht über diese Methode verfügen.

Monade ist nicht schwer

Um genau zu sein, scheinen die Monaden, die Endo (Redo) ausführen können, zusätzliche Monaden zu sein. Es ist praktisch, deshalb möchte ich es immer mehr integrieren.

Wenn Sie Korrekturen oder Vorschläge haben, werden wir aufrichtig antworten. Vielen Dank, dass Sie bis zum Ende bei uns bleiben.

Recommended Posts

Über die Nützlichkeit von Monaden aus einer objektorientierten Perspektive
Lassen Sie uns die Java 8-Grammatik aus der Sicht der iOS-Ingenieure zusammenfassen
Wie schreibe ich Scala aus der Perspektive von Java
Java-Sprache aus der Sicht von Kotlin und C #
Über den Umgang mit Null
Über Java-Instanzen
Informationen zur Beschreibung von Docker-compose.yml
Aus der Gewohnheit, Wertobjekte für ein objektorientiertes Verständnis zu schaffen
Über das Verhalten von Ruby Hash # ==
Über die Grundlagen der Android-Entwicklung
Informationen zur Rolle der Initialisierungsmethode
Denken Sie an die 7 Regeln von Optional
Informationen zur Protokollebene von java.util.logging.Logger
Vergleich von null-toleranten, null-toleranten und null-toleranten sicheren Typen aus der Perspektive der Null-Sicherheit
Ein objektorientierter Onkel mit 25 Jahren objektorientierter Geschichte spricht von einem Rezept für objektorientiertes Design
[Herausforderung CircleCI von 0] Lernen Sie die Grundlagen von CircleCI
Was ist ein Test? ・ Über die Wichtigkeit eines Tests
Informationen zur Funktionsweise von next () und nextLine ()
Vergleichen Sie Elemente eines Arrays (Java)
Die Geschichte von RxJava, das unter NoSuchElementException leidet
Informationen zur ersten Anzeige von Spring Framework
Über die Behandlung von BigDecimal (mit Reflexion)
Über die Anzahl der Threads von Completable Future
Finden Sie den Unterschied von einem Vielfachen von 10
Hat sich der Inhalt von useBodyEncodingForURI von Tomcat8 geändert?
Informationen zur Geschwindigkeit beim Abrufen von Werten aus HashMap
Denken Sie an die Kombination von Servlet und Ajax
Über den offiziellen Startleitfaden für Spring Framework
Informationen zur Beschreibungsreihenfolge der Java-Systemeigenschaften
Über die Idee anonymer Klassen in Java
Informationen zu next () und nextLine () der Scannerklasse
Eine Aufzeichnung über die Arbeit von zu Hause aus für etwa zwei Monate für einen Ingenieur, bei dem eine virale Lungenentzündung diagnostiziert wurde.