Gérer la logique métier pour un ensemble d'entités dans une classe Java

Gérer la logique métier pour un ensemble d'entités dans une classe Java

introduction

La logique d'une seule entité doit définir le comportement de l'entité, mais je ne sais pas où écrire le traitement pour la liste ou l'ensemble d'entités. J'ai résumé le contenu que j'ai étudié pour résoudre une telle hésitation.

Programmes communs

J'ai souvent écrit des traitements pour des listes et des ensembles d'entités en service et de contrôleur.

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";
  }
}

Je pense que c'est bien. Cependant, si vous écrivez ce processus dans le contrôleur, lorsque vous souhaitez effectuer le même processus dans un autre contrôleur, le code sera probablement copié et la maintenance sera difficile lorsque des modifications sont apportées à la logique. Est visible.

Créer une classe qui représente un ensemble

Par conséquent, si vous créez une classe qui représente un ensemble comme indiqué ci-dessous, vous pouvez limiter la logique à un seul endroit.

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();
 }
}

Vous avez maintenant une méthode pour calculer le montant total dans une classe. Cependant, cela n'est toujours pas pratique. En effet, vous ne pouvez pas récupérer chaque ShoppingCartItem. ~~ Mort cérébrale ~~ Il est normal de définir Getter, mais voici quelques techniques utiles.

Autoriser les instructions étendues à être utilisées au lieu de List

Il existe une instruction for étendue en tant que syntaxe que vous utiliserez pour récupérer chaque ShoppingCartItem. Ce serait bien si vous pouviez l'appeler ainsi!

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

Pour y parvenir, il est préférable d'implémenter l'interface ʻIterable `.

ShoppingCartItems.java


public class ShoppingCartItems implements Iterable<ShoppingCartItem> {
  private List<ShoppingCartItem> items = new ArrayList<>();
  //réduction
  @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();
  }
}

Pour les trois méthodes qui doivent être implémentées dans l'interface Iterable, vous pouvez appeler la méthode du champ «articles» de la classe de collection contenue dans la classe. Vous pouvez maintenant écrire une instruction for étendue.

Je veux l'utiliser avec la balise JSTL forEach

Je veux écrire comme ça.

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>

En conclusion, sans utiliser JSTL. Seules les variables suivantes peuvent être définies sur l'attribut items dans la balise JSTL forEach.

Cette limite est assez stricte. Puisque je travaille avec des listes cette fois, je pense que je vais implémenter le type Collection, mais je voulais personnellement éviter le type Collection car il existe de nombreuses méthodes inutiles. Donc, cette fois, j'ai implémenté le type Iterator en supposant que la boucle ne tourne qu'une seule fois.

ShoppingCartItems.java


public class ShoppingCartItems implements Iterable<ShoppingCartItem>, Iterator<ShoppingCartItem> {
  private List<ShoppingCartItem> items = new ArrayList<>();
  //réduction
  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++); //Si vous ne l'incrémentez pas, il bouclera indéfiniment ☆ 彡
  }
}

Vous pouvez maintenant spécifier une instance de la classe ShoppingCartItems dans l'attribut items de la balise JSTL forEach.

Je souhaite utiliser l'API Stream

Vous pouvez l'utiliser en définissant la méthode de flux de champ d'éléments comme méthode de délégation à ce ShoppingCartItems. Si vous avez d'autres méthodes dont vous avez besoin, vous pouvez définir une méthode de délégation dans cette classe et elle sera prête à être utilisée. Cependant, nous vous déconseillons de définir des méthodes qui effectuent des opérations inutiles dans votre logique métier.

ShoppingCartItems.java


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

En premier lieu, le but de la création d'une classe de gestion des collections est d'empêcher la falsification de la collection et d'augmenter le degré de cohésion. Si vous définissez trop de méthodes, cela ne servira pas votre objectif. Avant de définir une méthode, assurez-vous que vous en avez vraiment besoin.

à la fin

Je pense qu'il est courant d'écrire des opérations sur des ensembles, en particulier des opérations liées à la logique métier, dans la classe Service. À l'avenir, j'aimerais envisager de définir une classe qui a un ensemble en tant que champ comme un moyen de confiner la logique métier de l'ensemble à un seul endroit.

Recommended Posts

Gérer la logique métier pour un ensemble d'entités dans une classe Java
Un examen rapide de Java appris en classe
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
Qu'est-ce qu'une classe en langage Java (3 /?)
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce qu'une classe en langage Java (2 /?)
Création d'une classe de matrice dans Java Partie 1
Mesurer la taille d'un dossier avec Java
Une collection de questions simples pour les débutants Java
Définissez un affichage contextuel pour le langage Java avec vim.
La cause n'est pas visible lors de l'appel de méthodes d'autres classes en java
Ecrire une classe qui peut être ordonnée en Java Un petit mémo standard
Parcourir les objets de classe dans Kotlin (au lieu de Java class name.class)
Ecrire une classe en Kotlin et l'appeler en Java
Remarque sur l'initialisation des champs dans le didacticiel Java
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
Utilisation correcte de la classe abstraite et de l'interface en Java
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
Une brève explication d'un jeu de labyrinthe fait à Java pour les cousins du primaire
[Pour les débutants] Explication des classes, des instances et des statiques en Java
Une explication rapide des cinq types de statique Java
[Java] Définit la structure de la classe de collection (à propos de HashSet et TreeSet)
Activez la cellule A1 de chaque feuille de fichier Excel avec Java
[MQTT / Java] Implémentation d'une classe qui fait Pub / Sub de MQTT en Java
J'ai étudié Randoop, un générateur de classe de test JUnit pour Java.
J'ai créé un client RESAS-API en Java
[Java] Comparateur de la classe Collection
Rechercher un sous-ensemble en Java
Résumé de la classe Java Math
Implémentation Java de tri-tree
Créons une application TODO en Java 4 Implémentation de la fonction de publication
Je ne peux pas créer une classe Java avec un nom spécifique dans IntelliJ
Créons une application TODO en Java 6 Implémentation de la fonction de recherche
Créons une application TODO en Java 8 Implémentation des fonctions d'édition
Mécanisme et caractéristiques de la classe d'implémentation Collection souvent utilisés en Java
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Convertir un tableau de chaînes en une liste d'entiers en Java
Examinez la liste des ID de fuseau horaire disponibles dans la classe Java ZoneId
Obtenez l'URL publique du fichier privé de Flickr en Java
Création d'une classe pour une matrice en Java Partie 2-A propos d'une matrice (algèbre linéaire) -
Créons une application TODO avec Java 1 Brève explication de MVC
[Java] Renvoie un fichier de nom japonais dans le nom de fichier dans l'en-tête HTTP
Créons une application TODO en Java 5 Changer l'affichage de TODO
Comment penser la conception de classe (division) dans un système d'entreprise (1)
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
Bénéficiez d'un contrôle exclusif des ensembles de données dans un environnement Java multithread (environnement WAS pour z / OS) du mainframe IBM
Pensez à une stratégie de mise à jour Java
Diverses méthodes de la classe Java String
3 Implémentez un interpréteur simple en Java
[Java] Mémo pour nommer les noms de classe
J'ai créé un PDF avec Java.
Une liste de rawValues pour UITextContentType.
Trier la liste des objets Java
Gérez vos propres annotations en Java
Classe StringBuffer et StringBuilder en Java
java (utilisez le type de classe pour le champ)
Un exemple simple de rappels en Java
Liste des membres ajoutés dans Java 9