[JAVA] Wertobjekt in 3 Minuten

Angenommener Leser

Gemeinsame Klassen und ihre Probleme

Gemeinsame Klasse

Erstellen wir eine Klasse mit einer objektorientierten Sprache wie Java oder Python. Im folgenden Beispiel wird die Aufgabe als Klasse dargestellt, wobei der Name der Aufgabe, die Punkte und die Frist als Felder gespeichert werden. Dies ist eine allgemeine Klasse, die String- und Int-Typen verwendet.

Task.java


String taskName;
int point;
Date dueDate;
...

Das Halten einer Getter / Setter-Methode für jedes Feld, das Sie halten, ist ebenfalls ein gängiges Implementierungsmuster.

Task.java


    public Point getPoint() {
        return point;
    }
    public void setPoint(Point point) {
        this.point = point;
    }
    ...

Eine kurze Zusammenfassung der Merkmale "gemeinsamer" Klassen.

--Felder werden mit von der Sprache bereitgestellten Typen wie int und Date deklariert --getter / setter Methode ist implementiert

Was ist los mit so einer allgemeinen Klasse?

Häufige Klassenprobleme

Ich habe bereits zwei Funktionen erwähnt, aber allgemeine Klassen haben große Probleme damit. Das heißt, obwohl es sich um eine Klasse handelt, die zum Erstellen von Geschäftsanwendungen vorhanden ist, ** "hat sie eine Struktur, die Werte und Operationen zulässt, die gegen Geschäftsregeln verstoßen" **. Werfen wir einen Blick auf den tatsächlichen Quellcode.

Probleme im Code zu sehen

Betrachten Sie als Beispiel ein Feld namens Punkt in der vorherigen Klasse. Nehmen wir an, es gibt eine Geschäftsregel, wonach "Punkte zwischen 0 und 1000 liegen sollten". Da die Punkte in der Task-Klasse jedoch als int-Typ deklariert sind, kann dies auch durchgeführt werden.

task.setPoint(-2000);

Ein Punkt, der gegen die Geschäftsregel -2000 verstößt, wird festgelegt. Wenn Sie dies ermöglichen, ist es anfälliger für Fehler in Ihrer Geschäftslogik. Darüber hinaus ist es aus Sicht der Geschäftsregeln ein logischer Fehler, und da als Programm kein Fehler auftritt, wird es schwierig, ** zu finden, was ein großes Problem darstellt.

Da der Int-Typ und der Date-Typ die Geschäftsregeln einzelner Anwendungen nicht kennen, ist es natürlich nicht möglich, Handlungen zu verhindern, die gegen die Geschäftsregeln verstoßen. Darüber hinaus kann durch Zulassen der Setter-Methode jeder Wert von außen frei eingestellt werden.

So lösen Sie das Problem: Versuchen Sie es mit Wertobjekten.

Um das Wertobjekt auf meine eigene Weise zu erklären, ist es ** "eine Klasse, die die Regeln von Einheiten und Werten ausdrückt, die im Geschäft verwendet werden" **.

Wertobjekt, das im Code betrachtet werden soll

Wenn Sie sich den tatsächlichen Code ansehen, können Sie ihn irgendwie sehen. Die Punkte sind die folgenden zwei Punkte.

Ursprünglich war es ein Setter für den Typ int und "alles kann gesetzt werden", aber der Setter, der die Geschäftsregeln ignoriert, wird nicht verwendet. Oder besser gesagt, mach es nicht. Im Wertobjekt müssen Sie eine Methode erstellen, die den Wert basierend auf der Geschäftsregel festlegt.

Wenn beispielsweise die add-Methode aufgerufen wird, wird canAdd als nächstes aufgerufen und geprüft, ob ein Wert, der der Geschäftsregel widerspricht (ein anderer Wert als 0 bis 10000), übergeben wird. Wenn es kein Problem gibt, wird eine neue Point-Instanz so wie sie ist erstellt, und wenn es ein Problem gibt, wird eine Ausnahme ausgelöst, sodass kein Wert festgelegt wird, der gegen die Geschäftsregeln verstößt.

Point.java


public class Point {

    static final int MIN = 0;
    static final int MAX = 10000;

    int value;

    public Point(int value) {
        if (value < MIN) throw new
                IllegalArgumentException("Ungerechtigkeit:" + MIN + "Weniger als");
        if (value > MAX) throw new
                IllegalArgumentException("Ungerechtigkeit:" + MAX + "Über-");
        this.value = value;
    }

    Point add(Point other) {
        if (!canAdd(other)) throw new
                IllegalArgumentException("Illegal: die Summe ist" + MAX + "das ist alles");
        int added = addValue(other);
        return new Point(added);
    }

    boolean canAdd(Point other) {
        int added = addValue(other);
        return added <= MAX;
    }

    private int addValue(Point other) {
        return this.value + other.value;
    }
}

Das erstellte Wertobjekt Point wird deklariert und in der ursprünglichen Task-Klasse verwendet.

Task.java


//Nur Punkte werden in Wertobjekte geändert
String taskName;
Point point;    //Ursprünglich[int point;]
Date dueDate;

Im Gegensatz zu den zuvor erwähnten "allgemeinen" Klassen können Sie sich auch durch Betrachten der Wertobjekte leicht einen Überblick über Geschäftsregeln verschaffen. Auf diese Weise ist das Wertobjekt eine sehr praktische Entwurfsmethode, die nicht nur das Einmischen von Fehlern verhindert, sondern auch zum Verständnis der Spezifikationen beiträgt, indem die Geschäftsregeln als Klassen ** ausgedrückt werden. Bitte benutzen Sie es das nächste Mal.

Vorsichtsmaßnahmen

Dieser Artikel beschreibt die "Wertobjekte", die im domänengesteuerten Design angezeigt werden, berührt jedoch nicht alle strengen Definitionen und Merkmale von Wertobjekten, sondern gibt nur einen Überblick. Bitte beachten Sie.

Verweise

[Auf dem Gebiet nützliche Prinzipien des Systemdesigns ~ Objektorientierte praktische Techniken, die Änderungen einfach und sicher machen] https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E5%8E%9F%E5%89%87-%E5%A4%89%E6%9B%B4%E3%82%92%E6%A5%BD%E3%81%A7%E5%AE%89%E5%85%A8%E3%81%AB%E3%81%99%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%8A%80%E6%B3%95-%E5%A2%97%E7%94%B0-%E4%BA%A8/dp/477419087X)

Recommended Posts

Wertobjekt in 3 Minuten
Punkte beim Zuordnen von Wertobjekten in MyBatis
G1 Müllabfuhr in 3 Minuten
Java Stream API in 5 Minuten
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
Kontinuierliche Inspektion in 5 Minuten mit SonarQube
Anfangswert, wenn die Spring-Anforderung keine Eigenschaft des Formularobjekts enthält
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft
In der Sitzung registriertes Objekt muss serialisierbar sein
Schlüssel vom Wert in Java Map umkehren
"Hallo Welt!" Mit Kotlin + CLI in 5 Minuten
Unveränderlich (unveränderlich) Listet die Objektkonvertierungsfunktion in Java8 auf
spring-data-jpa @Query gibt ein benutzerdefiniertes Objekt zurück
Verstehe in 5 Minuten !! Wie man Docker benutzt