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.
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.
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.
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.
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.
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
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.)!
[^ 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