Behandeln Sie die Geschäftslogik für eine Reihe von Entitäten in einer Java-Klasse

Behandeln Sie die Geschäftslogik für eine Reihe von Entitäten in einer Java-Klasse

Einführung

Die Logik für eine einzelne Entität sollte das Verhalten für die Entität definieren, aber ich bin verwirrt darüber, wo die Verarbeitung für die Liste oder den Satz von Entitäten geschrieben werden soll. Ich habe den Inhalt zusammengefasst, den ich untersucht habe, um ein solches Zögern zu lösen.

Gemeinsame Programme

Ich habe oft die Verarbeitung für Listen und Sätze von Entitäten in Service und Controller geschrieben.

HogeController.java


@Controller
public class HogeController {
  private final HogeService service;

  HogeController(HogeService service) {
   this.service = service;
  }  

  @RequestMapping("hoge")
  public String xxx(Model model) {
    List<ShoppingCartItem> cartItems = new ArrayList<>();
    Integer total = cartItems.stream().mapToInt(ShoppingCartItem::subtotal()).sum();
    model.addAttribute("total", total);
    return "hoge/hoge";
  }
}

Ich denke das ist in Ordnung. Wenn Sie diesen Prozess jedoch in den Controller schreiben und denselben Prozess in einem anderen Controller ausführen möchten, wird der Code wahrscheinlich kopiert und die Wartung wird schwierig, wenn Änderungen an der Logik vorgenommen werden. Ist sichtbar.

Erstellen Sie eine Klasse, die eine Menge darstellt

Wenn Sie also eine Klasse erstellen, die eine Menge darstellt, wie unten gezeigt, können Sie die Logik an einer Stelle einschränken.

ShoppingCartItems.java


public class ShoppingCartItems {
  private List<ShoppingCartItem> items = new ArrayList<>();
  public void addItem(ShoppingCartItem item) {
    items.add(item);
  }
  public Integer total() {
     return items.stream().mapToInt(ShoppingCartItem::subtotal()).sum();
 }
}

Jetzt haben Sie eine Methode, um den Gesamtbetrag in einer Klasse zu berechnen. Dies ist jedoch immer noch unpraktisch. Dies liegt daran, dass Sie nicht jedes ShoppingCartItem abrufen können. ~~ Hirntod ~~ Es ist in Ordnung, Getter zu definieren, aber hier sind einige nützliche Techniken.

Erweitern Sie die Verwendung von erweiterten Anweisungen anstelle von List

Es gibt eine erweiterte for-Anweisung als Syntax, mit der Sie jedes ShoppingCartItem abrufen. Es wäre schön, wenn Sie es so nennen könnten!

ShoppingCartItems shoppingCartItems = new ShoppingCartItems();
for (ShoppingCardItem item : shoppingCartItems) {
  // doSomething
}

Um dies zu erreichen, ist es besser, die Schnittstelle "Iterable " zu implementieren.

ShoppingCartItems.java


public class ShoppingCartItems implements Iterable<ShoppingCartItem> {
  private List<ShoppingCartItem> items = new ArrayList<>();
  //Kürzung
  @Override
  public Iterator<Asking> iterator() {
    return items.iterator();
  }

  @Override
  public void forEach(Consumer<? super Asking> action) {
    items.forEach(action);
  }

  @Override
  public Spliterator<Asking> spliterator() {
    return items.spliterator();
  }
}

Für die drei Methoden, die in der Iterable-Schnittstelle implementiert werden sollen, können Sie die Methode des in der Klasse enthaltenen Felds "Elemente" der Auflistungsklasse aufrufen. Jetzt können Sie eine erweiterte for-Anweisung schreiben.

Ich möchte es mit dem JSTL forEach-Tag verwenden

Ich möchte so schreiben.

HogeController.java


@Controller
public class HogeController {
  @GetMapping("hoge")
  public String hoge(Model model) {
    model.addAttribute("shoppingCartItems", new ShoppingCartItems());
    return "hoge";
  }
}

hoge.jsp


<c:forEach items="${shoppingCartItems}" var="shoppingCartItem">
<%-- do something --%>
</c:forEach>

Abschließend ohne Verwendung von JSTL. Nur die folgenden Variablen können auf das Attribut items im JSTL forEach-Tag festgelegt werden.

Diese Grenze ist ziemlich streng. Da ich mich diesmal mit Listen beschäftige, denke ich, dass ich den Sammlungstyp implementieren werde, aber ich persönlich wollte den Sammlungstyp vermeiden, da es viele unnötige Methoden gibt. Diesmal habe ich den Iterator-Typ unter der Annahme implementiert, dass die Schleife nur einmal gedreht wird.

ShoppingCartItems.java


public class ShoppingCartItems implements Iterable<ShoppingCartItem>, Iterator<ShoppingCartItem> {
  private List<ShoppingCartItem> items = new ArrayList<>();
  //Kürzung
  private int cursor = 0;
 
  @Override
  public boolean hasNext() {
    if (cursor < items.size()) {
      return true;
    }
    return false;
  }

  @Override
  public ShoppingCartItem next() {
    if (!hasNext()) {
      throw new NoSuchElementException();
    }
    return items.get(cursor++); //Wenn Sie es nicht erhöhen, wird es eine Endlosschleife ☆ 彡
  }
}

Sie können jetzt eine Instanz der ShoppingCartItems-Klasse im items-Attribut des JSTL forEach-Tags angeben.

Ich möchte die Stream-API verwenden

Sie können es verwenden, indem Sie die Feldstrommethode für Elemente als Delegierungsmethode für diese ShoppingCartItems definieren. Wenn Sie andere Methoden benötigen, können Sie in dieser Klasse eine Delegierungsmethode definieren, die sofort verwendet werden kann. Es wird jedoch nicht empfohlen, Methoden zu definieren, die unnötige Vorgänge in Ihrer Geschäftslogik ausführen.

ShoppingCartItems.java


public Stream<ShoppingCartItem> stream() {
  return items.stream();
}

Erstens besteht der Zweck des Erstellens einer Klasse für die Behandlung von Sammlungen darin, Manipulationen an der Sammlung zu verhindern und den Kohäsionsgrad zu erhöhen. Wenn Sie zu viele Methoden definieren, erfüllt dies nicht Ihren Zweck. Stellen Sie vor dem Definieren einer Methode sicher, dass Sie sie wirklich benötigen.

schließlich

Ich denke, es ist üblich, Operationen auf Mengen, insbesondere Operationen im Zusammenhang mit Geschäftslogik, in die Service-Klasse zu schreiben. In Zukunft möchte ich in Betracht ziehen, eine Klasse mit einer Menge als Feld zu definieren, um die Geschäftslogik für die Menge an einem Ort zu beschränken.

Recommended Posts

Behandeln Sie die Geschäftslogik für eine Reihe von Entitäten in einer Java-Klasse
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
Was ist eine Klasse in der Java-Sprache (3 /?)
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist eine Klasse in der Java-Sprache (2 /?)
Erstellen einer Matrixklasse in Java Teil 1
Messen Sie die Größe eines Ordners mit Java
Eine Sammlung einfacher Fragen für Java-Anfänger
Stellen Sie mit vim die Popup-Anzeige für die Java-Sprache ein.
Ursache ist nicht sichtbar, wenn Methoden anderer Klassen in Java aufgerufen werden
Schreiben einer Klasse, die in Java bestellt werden kann Ein kleines Standard-Memo
Durchsuchen Sie Klassenobjekte in Kotlin (anstelle der Java-Klasse name.class).
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
Verwendung von Abstract Class und Interface in Java richtig
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
Eine kurze Erklärung eines Labyrinthspiels, das in Java für Cousins der Grundschule erstellt wurde
[Für Anfänger] Erläuterung von Klassen, Instanzen und Statik in Java
Eine kurze Erklärung der fünf Arten von Java Static
[Java] Struktur der Auflistungsklasse festlegen (zu HashSet und TreeSet)
Aktivieren Sie die Zelle A1 jeder Excel-Datei mit Java
[MQTT / Java] Implementierte eine Klasse, die Pub / Sub von MQTT in Java ausführt
Ich habe Randoop untersucht, einen JUnit-Testklassengenerator für Java.
Ich habe einen RESAS-API-Client in Java erstellt
[Java] Komparator der Collection-Klasse
Suchen Sie eine Teilmenge in Java
Zusammenfassung der Java Math Klasse
Java-Implementierung von Tri-Tree
Lassen Sie uns eine TODO-App in Java 4 erstellen. Implementierung der Buchungsfunktion
Ich kann in IntelliJ keine Java-Klasse mit einem bestimmten Namen erstellen
Lassen Sie uns eine TODO-App in Java 6 erstellen. Implementierung der Suchfunktion
Lassen Sie uns eine TODO-App in Java 8 erstellen. Implementierung von Bearbeitungsfunktionen
Mechanismus und Merkmale der in Java häufig verwendeten Collection-Implementierungsklasse
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Verwandeln Sie ein Array von Strings in eine Liste von Ganzzahlen in Java
Untersuchen Sie die Liste der Zeitzonen-IDs, die in der Java ZoneId-Klasse verfügbar sind
Rufen Sie die öffentliche URL der privaten Datei von Flickr in Java ab
Erstellen einer Klasse für eine Matrix in Java Teil 2 - Über eine Matrix (lineare Algebra) -
Erstellen wir eine TODO-Anwendung mit Java 1 Kurze Erläuterung von MVC
[Java] Gibt eine japanische Namensdatei im Dateinamen im HTTP-Header zurück
Lassen Sie uns eine TODO-App in Java 5 erstellen. Schalten Sie die Anzeige von TODO um
Wie man über Klassengestaltung (Division) in einem Geschäftssystem nachdenkt (1)
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
Erzielen Sie die exklusive Kontrolle über Datasets in einer Java-Umgebung mit mehreren Threads (WAS für z / OS-Umgebung) des IBM Mainframes
Denken Sie an eine Java-Update-Strategie
Verschiedene Methoden der Java String Klasse
3 Implementieren Sie einen einfachen Interpreter in Java
[Java] Memo zum Benennen von Klassennamen
Ich habe ein PDF mit Java erstellt.
Eine Liste der rawValues für UITextContentType.
Liste der Java-Objekte sortieren
Behandeln Sie Ihre eigenen Anmerkungen in Java
StringBuffer- und StringBuilder-Klasse in Java
Java (Klassentyp für Feld verwenden)
Ein einfaches Beispiel für Rückrufe in Java
Liste der in Java 9 hinzugefügten Mitglieder