Les modèles de conception GoF sont également masqués dans les bibliothèques Java que vous utilisez le plus souvent. Il est facile d'oublier le travail quotidien chargé, mais de temps en temps, profitons du beau design qui peut être considéré comme une sorte d'art.
Main.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
//Créer une instance de GSON
Gson gson = new GsonBuilder()
.setFieldNamingStrategy(new MyFieldNamingStrategy())
.create();
//Convertir des objets Java en chaînes JSON
String json = gson.toJson(new ExampleBean());
//production
System.out.println(json);
}
}
MyFieldNamingStrategy.java
import com.google.gson.FieldNamingPolicy;
import com.google.gson.FieldNamingStrategy;
import java.lang.reflect.Field;
public class MyFieldNamingStrategy implements FieldNamingStrategy {
@Override
public String translateName(Field field) {
//Des variables membres"_"Se débarrasser de
String fieldName = FieldNamingPolicy.IDENTITY.translateName(field);
if (fieldName.startsWith("_")) {
fieldName = fieldName.substring(1);
}
return fieldName;
}
}
ExampleBean.java
public class ExampleBean {
//Au début des variables membres"_"Est attaché
private String _firstField = "value";
private String _secondField = "vaule";
}
//Au début des variables membres"_"Est pris
{"firstField":"value","secondField":"vaule"}
Il s'agit d'une scène dans laquelle un objet Java est converti en une chaîne JSON à l'aide de la bibliothèque Gson. Lorsque vous le regarderez à nouveau, vous serez ravi de l'interface qui semble à la fois simple et personnalisable.
Gson est une bibliothèque open source créée par Google qui convertit les objets Java <=> JSON entre eux. J'utilise cette bibliothèque Gson pour convertir la classe ʻExampleBean` en JSON.
La classe ʻExampleBean` a probablement été écrite par un programmeur C ++ ou Objective-C. Inhabituel en Java, les variables membres sont préfixées par "\ _" (trait de soulignement). Cependant, je ne veux pas ajouter "\ _" au JSON généré cette fois.
Gson est conçu pour définir FieldNamingStrategy
sur GsonBuilder
comme logique pour déterminer le nom de champ (nom de clé JSON) lors de la conversion d'un objet Java en JSON. Dans le "Template Method pattern" que j'ai écrit dans l'article précédent, c'était un mécanisme pour hériter de la classe parente afin de personnaliser la fonction. Cette fois, j'ai défini une instance de la classe. Il semble y avoir une esthétique de conception en utilisant le moins possible l'héritage dans la personnalisation des fonctionnalités. Explorons ensemble.
Le code au début utilise le modèle Strategy, mais pensons d'abord à ce à quoi ressemblerait le design sans le modèle Strategy, comme si vous étiez le concepteur de la bibliothèque Gson.
Ce que je veux faire, c'est ne pas ajouter "\ _" lors de la conversion d'une classe qui a "\ _" dans le nom du champ en JSON. On suppose qu'il existe de nombreuses classes à convertir et que les champs ne peuvent pas être renommés en refactorisant les classes.
L'héritage de classe est la première chose dont nous parlons dans la programmation orientée objet, alors essayons de concevoir avec l'héritage. Implémentons la logique qui détermine le nom du champ en héritant de la classe Gson
[^ 1].
MyGson.java
public class MyGson extends Gson {
@Override
protected String translateFieldName(Field field) {
//Au début du nom du champ"_"Si est attaché, la chaîne de caractères supprimée est renvoyée.
// "_"S'il n'y en a pas, renvoyez-le tel quel.
}
}
Main.java
...
public class Main {
public static void main(String[] args) {
//Créer une instance de GSON
Gson gson = new MyGson();
//Convertir des objets Java en chaînes JSON
String json = gson.toJson(new ExampleBean());
//production
System.out.println(json);
}
}
C'est rafraîchissant que ce à quoi je m'attendais ... La classe MyGson
implémente la logique pour traduire les noms de champs en remplaçant la méthode translateFieldName
de la classe parent. La méthode surchargée est appelée à partir de la classe parent Gson
lors de la création d'une chaîne JSON. Cette méthode est le "modèle de méthode de modèle" que j'ai écrit dans l'article précédent. C'est plus simple et plus facile à comprendre que vous ne pouvez l'imaginer.
Dans cette situation, vous ne pouvez pas vous empêcher de penser: "C'est une victoire écrasante pour le modèle de méthode de modèle. Je n'avais pas de modèle de stratégie."
Cependant, les noms de champs ne sont pas les seuls éléments que Gson peut personnaliser. En regardant Gson's Javadoc, il existe de nombreux autres points personnalisables en plus des noms de champs.
Etc.
Si vous effectuez toutes ces personnalisations avec l'héritage de classe parent, vous avez des problèmes. Autrement dit, la combinaison de fonctionnalités explosera.
Par exemple, supposons que vous utilisez une classe de Gson1
qui remplace la fonction de 1 ci-dessus, Gson2
qui remplace la fonction de 2 et Gson3
qui remplace la fonction de 3.
1 fonction | 2 fonctions | 3 caractéristiques | |
---|---|---|---|
Classe Gson1 | ○ | ||
Classe Gson2 | ○ | ||
Classe Gson3 | ○ |
Dans cette situation, lorsque vous avez besoin des nouvelles fonctionnalités 1 et 2, vous aurez besoin d'une classe Gson12
qui remplace les deux méthodes. Le code source est dupliqué car le contenu de la méthode est exactement le même que celui décrit respectivement dans «Gson1» et «Gson2».
1 fonction | 2 fonctions | 3 caractéristiques | |
---|---|---|---|
Classe Gson1 | ○ | ||
Classe Gson2 | ○ | ||
Classe Gson3 | ○ | ||
Classe Gson12 | ○ | ○ |
De plus, si vous avez besoin des fonctions 1 et 3, vous avez également besoin de la classe Gson13
, et si vous avez besoin des fonctions 1, 2 et 3, vous devez créer la classe Gson123
.
1 fonction | 2 fonctions | 3 caractéristiques | |
---|---|---|---|
Classe Gson1 | ○ | ||
Classe Gson2 | ○ | ||
Classe Gson3 | ○ | ||
Classe Gson12 | ○ | ○ | |
Classe Gson13 | ○ | ○ | |
Classe Gson123 | ○ | ○ | ○ |
... |
De cette façon, si vous essayez de le résoudre par ** héritage de la classe Gson
, vous vous retrouverez avec la pire conception, où vous aurez besoin d'autant de classes qu'il y a de combinaisons de fonctions et le code source est dupliqué **.
En tant qu'autre méthode utilisant l'héritage, il est possible d'hériter de la classe ʻExampleBean qui se convertit en JSON et d'implémenter chaque méthode telle que
translateFieldName` ici. Cependant, il rencontre toujours le même problème que ci-dessus, et cela va à l'encontre de la philosophie de spécification Gson de pouvoir convertir POJO (objet Java ordinaire) en JSON en premier lieu.
Maintenant, appliquons le modèle de stratégie. Veuillez revoir [le premier](# cet art) pour le code source et le résultat de l'exécution.
Le déroulement de ce modèle de stratégie est le suivant.
GsonBuilder
définit MyFieldNamingStrategy
sur Gson
MyFieldNamingStrategy # translateName
est appelé lors de la traduction des noms de champs dans Gson # toJson
Le fait est que le processus de conversion des noms de champ est délégué à «MyFieldNamingStrategy» plutôt que directement dans la classe «Gson». En faisant cela, ** la classe principale (Gson
) et la classe logique de conversion ( XXXStrategy
) peuvent être séparées **. La séparation facilite le remplacement ou la réutilisation de la logique en un clin d'œil. beau!
La définition du GoF du modèle de stratégie est «Définir une famille d'algorithmes, encapsuler chacun d'eux et les rendre interchangeables. Le modèle de stratégie permet aux clients de modifier indépendamment les algorithmes qu'ils utilisent. [^ 2] ". La "famille d'algorithmes" correspond ici à des fonctions telles que la conversion des noms de champs (classe XXXStrategy
).
De nombreux experts ont également commenté l'évaluation du modèle de stratégie.
Hiroshi Yuki
Dans le modèle Stratégie, la partie qui implémente l'algorithme peut être échangée en un clin d'œil. Le modèle de stratégie est un modèle qui permet de changer facilement d'algorithme (stratégies, stratégies, stratégies) et de résoudre le même problème de différentes manières.
["Introduction aux modèles de conception appris en langage Java"](https://www.amazon.co.jp/ Introduction aux modèles de conception appris en langage Java-Yuki-Hiroshi / dp / 4797327030 /)
lang_and_engine
Quand il s'agit d'un algorithme quelque peu complexe, un programmeur normal découpera et agrégera cette partie. Il doit également être compatible au cas où il serait remplacé par un autre algorithme.
C'est le vrai plaisir d'un programmeur de pouvoir profiter d'un plaisir intellectuel rien qu'en regardant quelques lignes de code sans avoir à se rendre au musée.
Si vous êtes un ingénieur qui sympathise avec l'art du modèle de stratégie, veuillez contacter le responsable du recrutement de notre société (Qualysite Technologies Co., Ltd.). Contactez SVP!
Dans l'exemple ci-dessus, la classe FieldNamingStrategy
a été utilisée pour convertir le nom du champ dans Gson, mais vous pouvez également déterminer le nom en JSON en annotant simplement les variables membres de la classe à convertir. Ceci est pratique lorsqu'il y a peu de classes à convertir.
ExampleBean.java
public class ExampleBean {
@SerializedName("firstField")
private String _firstField = "value";
@SerializedName("secondField")
private String _secondField = "vaule";
}
[^ 1]: La classe Gson est déclarée finale et ne peut pas être héritée. En supposant que vous êtes le concepteur de Gson, vous êtes en train de réfléchir au type de design que vous devriez créer. [^ 2]: ["Modèle de conception à réutiliser dans l'orientation objet"](https://www.amazon.co.jp/%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% AB% E3% 81% 8A% E3% 81% 91% E3 % 82% 8B% E5% 86% 8D% E5% 88% A9% E7% 94% A8% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83 % 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3-% E3% 82% AC% E3% 83% B3% E3% 83% 9E-% E3% 82% A8% E3% 83% AA% E3% 83% 83% E3% 82% AF / dp / 479731126 / ref = sr_1_1? = 1495503419 & sr = 8-1 & mots-clés =% 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% AB% E3% 81% 8A% E3% 81% 91% E3% 82% 8B% E5% 86% 8D% E5% 88% A9% E7% 94% A8% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% À partir de 91% E3% 82% BF% E3% 83% BC% E3% 83% B3)
Recommended Posts