Je suis désolé pour le titre accrocheur ou de pêche m (_ _;) m En bref, je vais vous expliquer comment utiliser le modèle de méthode modèle de manière pratique. Il est difficile de diffuser la norme de codage à tous les membres du développement. Je me demande s'il y a beaucoup de choses qui ne vont pas, comme le manque de temps et de mauvaises révisions de code, différents niveaux de compétence, etc. Donc, si vous souhaitez partager et créer plusieurs logiques métier avec plusieurs personnes, considérez la classe sous-jacente qui force l'implémentation à adhérer aux conventions de codage.
--Java: JDK1.5 ou version ultérieure
Appliquer le nom de la méthode, l'argument et la valeur de retour à implémenter La seule règle, «Doit hériter de cette classe», applique le nom de la méthode et son rôle pour chaque classe de logique métier. Le point est le modèle de méthode de modèle.
La structure de la classe est la suivante. Classe DTO: FooInfoDto.java, BarInfoDto.java ビジネスロジック親クラス:Proces.java Classe de logique métier (partie de partage d'implémentation): ProcesHoge01.java, ProcesHoge02.java メインクラス(ビジネスロジック呼出し部分):Main.java
DTO "FooInfoDto" de la classe (INPUT) qui contient la valeur avant traitement, Créez un DTO "BarInfoDto" pour la classe (OUTPUT) qui contient les valeurs traitées. Comme il s'agit du même champ, INPUT et OUTPUT peuvent être le même DTO, mais il est plus facile à maintenir car il est préférable de séparer clairement la valeur conservée avant et après le traitement. C'est redondant, mais séparé.
FooInfoDto.java
package dto;
public class FooInfoDto {
private Integer id = null;
private String value = null;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
BarInfoDto.java
package dto;
public class BarInfoDto {
private Integer id = null;
private String value = null;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Étant donné que le nom de la méthode et son rôle ne peuvent être appliqués que par la règle selon laquelle «chaque logique métier hérite et implémente cette classe parente», il est facile de comprendre «quelle classe fait quel traitement?». Devenir. Le but des classes abstraites au lieu des interfaces est d'implémenter uniquement certaines parties de traitement dans chaque logique métier et d'agréger des parties communes dans cette classe parente.
Proces.java
package businesslogic;
import java.util.List;
import dto.BarInfoDto;
import dto.FooInfoDto;
public abstract class Proces {
protected abstract String getProcesName();
protected abstract void proces(List<FooInfoDto> input , List<BarInfoDto> output);
public void execute(List<FooInfoDto> in, List<BarInfoDto> out) {
System.out.println( getProcesName() + "Lancez le traitement." );
proces(in, out);
System.out.println( getProcesName() + "Le traitement est terminé." );
}
}
La "méthode getProcesName" donne le rôle de "renvoyer un nom descriptif pour indiquer ce que fait la classe". En définissant le modificateur sur "protected", vous pouvez l'empêcher d'être appelé par des classes en dehors du package.
La "méthode proces" est une méthode abstraite "pour implémenter le contenu de traitement réel de la logique métier". Encore une fois, définissez le modificateur sur "protected" afin qu'il ne puisse pas être appelé par des classes en dehors du package.
La "méthode execute" est la seule méthode qui peut être appelée du côté utilisateur, c'est-à-dire la classe principale (une classe en dehors du package businesslogic). Ici, vous pouvez appliquer le traitement du hook, l'ordre de traitement, etc.
La partie que les membres implémentent réellement.
ProcesHoge01.java
package businesslogic;
import java.util.List;
import dto.BarInfoDto;
import dto.FooInfoDto;
public class ProcesHoge01 extends Proces {
@Override
protected String getProcesName() {
return "Traitement Hoge01";
}
@Override
protected void proces(List<FooInfoDto> input, List<BarInfoDto> output) {
//Contenu de traitement Hoge réel
int index = 0;
for( FooInfoDto dto : input ) {
Integer tmpId = dto.getId()*10;
output.get(index).setId(tmpId);
String tmpValue = dto.getValue()+"_Hoge01";
output.get(index).setValue(tmpValue);
index++;
}
}
}
ProcesHoge02.java
package businesslogic;
import java.util.List;
import dto.BarInfoDto;
import dto.FooInfoDto;
public class ProcesHoge02 extends Proces {
@Override
protected String getProcesName() {
return "Traitement Hoge02";
}
@Override
protected void proces(List<FooInfoDto> input, List<BarInfoDto> output) {
//Contenu de traitement Hoge réel
int index = 0;
for( FooInfoDto dto : input ) {
Integer tmpId = dto.getId() + output.get(index).getId();
output.get(index).setId(tmpId);
String tmpValue = dto.getValue()+"_Hoge02";
output.get(index).setValue(tmpValue);
index++;
}
}
}
En fait, c'est la partie qui correspond à la classe du contrôleur. Ici, il est implémenté comme une classe facile à comprendre et exécutée simplement par la méthode main. J'ai laissé les packages par défaut, mais ce serait bien s'ils pouvaient être séparés des packages des classes de logique métier.
Main.java
import java.util.ArrayList;
import java.util.List;
import businesslogic.ProcesHoge01;
import businesslogic.ProcesHoge02;
import dto.BarInfoDto;
import dto.FooInfoDto;
public class Main {
public static void main(String[] args) {
//Liste DTO pour stocker les résultats du traitement
List<BarInfoDto> out = new ArrayList<BarInfoDto>();
//Préparer une liste DTO d'entrée à traiter
List<FooInfoDto> in = new ArrayList<FooInfoDto>();
for(int i=1 ; i<4 ; i++){
FooInfoDto dto = new FooInfoDto();
dto.setId(i);
dto.setValue(i+"Deuxième valeur");
//Défini dans la liste DTO d'entrée à traiter
in.add(dto);
//Définissez un objet DTO vide dans la liste DTO qui stocke le résultat du traitement
out.add(new BarInfoDto());
}
new ProcesHoge01().execute(in, out);
//Affichage des résultats
for(BarInfoDto dto : out) {
System.out.println( "-------------------------------" );
System.out.println( "ID après traitement> " + dto.getId() );
System.out.println( "Valeur après traitement> " + dto.getValue() );
}
new ProcesHoge02().execute(in, out);
//Affichage des résultats
for(BarInfoDto dto : out) {
System.out.println( "-------------------------------" );
System.out.println( "ID après traitement> " + dto.getId() );
System.out.println( "Valeur après traitement> " + dto.getValue() );
}
}
}
c'est tout.
Comment était-ce? Nous vous serions reconnaissants de bien vouloir nous faire part de vos opinions et de vos conseils. m (_ _) m
Je pense que vous pouvez faire de la classe principale une classe de façade avec un modèle de façade pour améliorer encore la lisibilité.
Recommended Posts