Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de façade

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.

Cet art

import org.apache.http.client.fluent.Request;
import java.io.IOException;
...

String html = null;
try {
    html = Request.Get("http://www.qualysite.co.jp/")
        .connectTimeout(1000)
        .socketTimeout(1000)
        .execute()
        .returnContent()
        .asString();
} catch (IOException e) {
  ...
}

C'est une scène pour obtenir la source (HTML) de l'URL spécifiée par l'argument, mais quand je la regarde à nouveau, je suis fascinée par la beauté de l'interface qui est intuitivement transmise.

Points d'appréciation

Il est facile de regarder l'interface fluide, mais les concepteurs disent: "C'est une telle décoration. Les gens formidables ne le comprennent pas [^ 1]". Le point d'appréciation ici est la beauté fonctionnelle qui résume la routine de connexion HTTP, qui comporte de nombreuses étapes, d'une manière simple et facile à comprendre. Profitons-en ensemble ci-dessous.

Lorsque vous n'utilisez pas le motif de façade

Le code au début est un exemple d'utilisation du client HTTP le plus célèbre de Java Apache HttpComponents HttpClient. La version 4.3, sortie en 2013, a ajouté une interface comme celle du début à cette bibliothèque.

Avant cela, vous deviez écrire du code avec de nombreuses étapes pour obtenir le même résultat:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
...

String html = null;

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://www.qualysite.co.jp/");

//Demander des paramètres
RequestConfig requestConfig = RequestConfig.custom()
    .setSocketTimeout(1000)
    .setConnectTimeout(1000)
    .build();
httpGet.setConfig(requestConfig);

CloseableHttpResponse response = null;
try {
  response = httpClient.execute(httpGet);

  //Acquisition de contenu(L'objet Entity contient du contenu)
  HttpEntity entity = response.getEntity();

  //Obtenir la source du contenu
  html = EntityUtils.toString(entity, StandardCharsets.UTF_8);

  //Consommation d'entité
  EntityUtils.consume(entity);
} catch(IOException e) {
  ...
} finally {
  try {
    if (response != null) {
      //Réponse close
      response.close();
    }
  } catch (IOException e) {
    ...
  }
}

Le codage est un problème superficiel avec un tel code. Le vrai problème est qu'il est facile de faire des erreurs lors de l'écriture de code. C'est une erreur de ** devoir effectuer un certain nombre d'étapes dans l'ordre du début à la fin d'une connexion HTTP ** et ** il est difficile de dire quelle étape vous devez effectuer ** Ce sera la cause.

En particulier,

//Consommation d'entité
EntityUtils.consume(entity); //Ferme en interne InputStream

Ou

//Réponse close
response.close(); //Ferme la connexion HTTP en interne

Ne provoque pas d'erreur lors de la construction ou de l'exécution, donc si vous ne comprenez pas comment il est construit, vous oublierez facilement de l'écrire. Il n'est pas courant de dire «l'entité doit être consommée» ou «la réponse doit être fermée». Cet oubli d'écrire provoque une fuite de ressources.

De plus, puisque CloseableHttpClient implémente l'interface Closeable, il est possible d'écrire httpClient.close ();. Est-il acceptable de ne pas appeler la méthode qui ferme HttpClient comme ça? Il n'est pas appelé dans Source d'exemple officielle, donc je pense que ce n'est pas nécessaire, mais je suis inquiet.

HttpClient offre de nombreuses fonctionnalités à un bas niveau et est utilisé dans de nombreuses bibliothèques, mais il n'est pas beau d'utiliser ce code tel quel dans les cas où ce n'est pas nécessaire.

Lors de l'utilisation du motif de façade

Le code au début utilise le modèle Facade. Regardons à nouveau avec des commentaires.

import org.apache.http.client.fluent.Request;
import java.io.IOException;
...

String html = null;
try {
  html = Request.Get("http://www.qualysite.co.jp/")
    .connectTimeout(1000) //Demander des paramètres
    .socketTimeout(1000)  //Demander des paramètres
    .execute()
    .returnContent()      //Acquisition de contenu->Réponse close->Consommation d'entité
    .asString();          //Obtenir la source du contenu
} catch (IOException e) {
  ...
}

Il convient de noter la méthode Response # returnContent. Avec cette méthode unique, Acquisition de contenu-> Reponse close-> Consommation d'entité, qui est un processus qui utilise plusieurs objets ** doit être exécuté **, ** dans l'ordre **, ** collectivement ** Peut être traité.

Cette méthode fait trois choses, mais le fait est que le nom de la méthode est returnContent. Le concepteur de classe ne voulait probablement pas que l'utilisateur de classe soit au courant du processus de fermeture de la réponse et de la consommation d'entité. Parce qu'il n'est pas inclus dans la méthode. Cependant, si vous imaginez plus loin, il semble que vous puissiez voir le message caché «Il ne s'agit pas simplement de renvoyer une référence à l'objet Content» où il dit «returnContent» au lieu de «getContent».

Façade signifie «devant le bâtiment». Le but du modèle de façade est de montrer à l'utilisateur uniquement la façade du bâtiment, c'est-à-dire de rassembler les interfaces encombrées de plusieurs classes et de les montrer au minimum. Pas étonnant que je trouve l'interface élégante, mais c'est la beauté mesurée par le designer.

Commentaires d'experts sur le modèle de façade

De nombreux experts ont également commenté le motif de la façade. (Je l'ai souligné en gras.)

Hiroshi Yuki

Un programmeur "est doué pour appeler cette classe avant d'appeler cette classe. Vous devez vous inscrire auprès de cette classe avant d'appeler cette méthode." Lorsque vous parlez à, cela suggère que nous devons introduire le rôle de façade. ["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

** Lorsque vous appelez plusieurs classes **, rassemblez-les dans une méthode standard afin de ne pas avoir à vous souvenir de l'ordre d'appel. La méthode est, pour ainsi dire, un manuel de procédures pour l'utilisation de plusieurs classes. De Liste de 23 modèles de conception GoF à utiliser en Java

finalement

C'est le vrai plaisir d'un programmeur de pouvoir jouir d'un plaisir intellectuel en regardant simplement une seule ligne de code sans avoir à se rendre au musée.

Si vous êtes un ingénieur qui sympathise avec l'art du modèle de façade, veuillez contacter notre personnel de recrutement (Qualysite Technologies Co., Ltd.)!

Article associé

Créer une instance

Simplifiez l'interface

Laissez-le à une autre classe

URL de référence

[^ 1]: une des citations qui apparaît dans Mobile Suit Gundam. Quand Char lui a demandé que Ziong n'avait pas de jambes, le mécanicien a répondu: "C'est une telle décoration. Les gens formidables ne le savent pas." ([Ziong](ttps: //ja.wikipedia.org/wiki/Ziong) --Wikipedia)

Recommended Posts

Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de façade
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle abstrait Factory
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de constructeur
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèles d'adaptateur
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèles de stratégie
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de méthode de modèle
Modèles de conception appris avec Java et PHP (résumé)
Apprenez le modèle de conception "Façade" avec Python
Modèle de conception #Facade
Modèle de façade en Java
Docker. Définir les commandes fréquemment utilisées sur un alias "avec explication"
[Mis à jour de temps en temps] Résumé des modèles de conception en Java
Développons quelque chose de proche de celui intégré avec TDD ~ Design pattern ~
Résumé du chapitre 2 de l'introduction aux modèles de conception appris en langage Java
Chapitre 4 Résumé de l'introduction aux modèles de conception appris en langage Java
Résumé du chapitre 3 de l'introduction aux modèles de conception appris en langage Java
Résumé du modèle de conception Java GoF