Nous avons résumé le contenu de LT annoncé dans le passé à weekend engineer.
Cela fait deux ans que j'ai commencé à programmer, j'ai donc résumé ce à quoi je fais habituellement attention lors de la programmation, je peux le mettre à jour de temps en temps.
S'il est utilisé dans un moule, vous perdez. On peut dire que la puissance des langages à typage statique ne peut être utilisée qu'en maîtrisant la puissance des types.
Le typage statique signifie que dans un programme écrit dans un langage de programmation, les types de valeurs telles que les variables, les arguments de sous-programme et les valeurs de retour sont déterminés à l'avance, par exemple au moment de la compilation, avant que le programme ne soit exécuté. C'est la nature du système de typage.
Wikipedia | Typage statiqueQue
Les langages dynamiquement typés tels que JavaScript vérifient le type lors de l'exécution du programme.
const str = 10;
const length = (str) => {
return str.length;
}
length(str);
// =>undefined est retourné.
En comparaison, les langages typés statiquement vérifient les types avant de les exécuter. Au niveau du code, il est différent du langage typé dynamiquement en ce qu'il déclare les types de variables, les arguments formels de fonction et les valeurs de retour.
Integer str = 10;
Integer length(String str) {
return str.length();
}
System.out.println(length(str));
// =>Au moment de la compilation,En d'autres termes, une erreur se produit avant l'exécution.
Récemment, les éditeurs donnent parfois des avertissements même dans des langages à typage dynamique tels que JavaScript, mais je pense que cela est largement dû à la technologie d'analyse de la syntaxe statique.
Le typage statique présente des inconvénients. Il est difficile de spécifier le type de la variable à l'avance. Il est également difficile de transtyper (convertir le type de la variable).
Je sais tout. Je l'ai fait aussi. Mais j'ai récemment réalisé que cela indique que ** je suis moi-même habitué à taper **. Les langages à typage statique rendent la frappe plus agressive. Définissez, ** je me rends compte que les avantages ne viennent que lorsque j'utilise le type **.
Ci-dessous, j'écrirai spécifiquement comment utiliser le type.
Vous pouvez exprimer plus dans votre programme en utilisant vos propres types définis qu'en utilisant des types primitifs tels que String
et ʻInt`.
String phoneNumber = "000-0000-0000";
PhoneNumber phoneNumber = new PhoneNumber("000-0000-0000");
Si vous utilisez simplement le type String
, vous savez seulement que la variable est une chaîne.
A partir de la variable de type PhoneNumber comme dans le deuxième exemple, vous pouvez prédire quel type de chaîne de caractères est stockée, et vous pouvez également imaginer quel type de méthode peut être appelé. Dans ce cas, je ne pense pas pouvoir appeler quoi que ce soit, mais lol
Les détails de la programmation des contrats sont plus détaillés dans les articles suivants.
Ce que je veux dire ici, c'est que nous pouvons garantir que "parce que c'est une chaîne sous la forme d'un numéro de téléphone, pas seulement une chaîne, il peut se comporter sans lever d'exception pour une commande donnée". Cela signifie qu'il y a des mérites.
Dans la classe suivante, lors de la création d'une instance de la classe PhoneNumber, il vérifie s'il s'agit d'une "chaîne de caractères de format de numéro de téléphone avec un trait d'union" et lève une exception. Paradoxalement, une variable de type PhoneNumber toujours " Le type peut garantir que les données ont une "chaîne de caractères de format de numéro de téléphone avec tirets".
/**
*Classe représentant un numéro de téléphone.
* String
*/
class PhoneNumber {
private static final Pattern pattern =
Pattern.compile("^0\\d{2,3}-\\d{1,4}-\\d{4}$");
private final String value;
/**
*Renvoie une instance d'un nouveau type de numéro de téléphone basé sur le numéro de téléphone avec trait d'union spécifié dans l'argument.
* @numéro de téléphone de valeur param
* @return Instance de type de numéro de téléphone
* @jette IllegalArgumentException Si l'argument est autre chose qu'un numéro de téléphone avec trait d'union
*/
PhoneNumber(String value){
Objects.requireNonNull(value);
if (!value.matches(pattern)) {
throw new IllegalArgumentException();
}
this.value = value;
}
String getValue() {
return this.value;
}
}
Différentes méthodes et fonctions sont définies pour les types fournis par des langages tels que le type String. En avez-vous vraiment besoin?
Est-il approprié de pouvoir récupérer le code des caractères ou inverser l'ordre des chaînes de caractères du numéro de téléphone? Osez définir le type du numéro de téléphone en limitant les opérations sur les variables et en évitant les erreurs. C'est aussi pour.
Au contraire, cela peut augmenter le comportement. On suppose que vous obtenez le code local du numéro de téléphone. Lors de la substitution d'un numéro de téléphone pour une variable de type String et de son utilisation, le programme sera le suivant.
String phoneNumber = "000-0000-0000";
String cityCode = phoneNumber.split("-")[1];
Si vous définissez le comportement de retour du code local au type PhoneNumber, le programme sera comme suit.
PhoneNumber phoneNumber = new PhoneNumber("000-0000-0000");
String cityCode = phoneNumber.getCityCode();
class PhoneNumber {
private final String value;
//Abréviation
String getCityCode() {
return value.split("-")[1];
}
}
J'ai écrit le code source assez verbeusement jusqu'à présent, mais en réalité le code utilise les annotations Lombok et Bean Validation. Peut être simplifié.
/**
*Classe représentant un numéro de téléphone.
* String
*/
@Value
class PhoneNumber {
@NotNull
@Pattern(regexp="^0\\d{2,3}-\\d{1,4}-\\d{4}$");
private final String value;
}
Jusqu'à présent, j'ai écrit sur une unité assez micro (numéro de téléphone), mais je ne pense pas qu'il soit nécessaire de fabriquer un moule dans cette unité.Faire un moule dans une unité qui nécessite de la cohérence est un gros avantage. Dans cet article, toutes les valeurs d'entrée de l'écran sont définies comme un type et utilisées comme argument de la logique de calcul. Restrictions et garanties par type et constructeur J'espère pouvoir continuer à utiliser cette méthode.