Comment gérer le type auquel j'ai pensé en écrivant un programme Java pendant 2 ans

Comment gérer le type que je pense en Java

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.

Préface

Conclusion

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.

table des matières

Qu'est-ce que le typage statique?

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.

Comment gérer le typage 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.

Donnez du sens aux données.

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`.

Lors de l'utilisation du type primitif tel quel

String phoneNumber = "000-0000-0000";

Lors de l'utilisation d'un type défini par vous-même

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

Programmation sécurisée basée sur des contrats.

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;
  }
}

Donner des restrictions et un sens au comportement

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];
  }
}

De côté

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;
}

à la fin

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.

Recommended Posts

Comment gérer le type auquel j'ai pensé en écrivant un programme Java pendant 2 ans
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
J'ai essayé de créer un programme en Java qui résout le problème du voyageur de commerce avec un algorithme génétique
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
À propos de la procédure pour que Java fonctionne
[Introduction à Java] Comment écrire un programme Java
Comment interagir avec un serveur qui ne plante pas l'application
Déclarez une méthode qui a une valeur de retour Java avec le type de données de valeur de retour
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
[Java] Comment tester s'il est nul dans JUnit
[Java] (pour MacOS) Méthode de définition du chemin de classe
J'ai essayé de casser le bloc avec java (1)
Jusqu'à ce que vous exécutiez un programme Java avec le SDK AWS local sur Windows
(Java) Comment implémenter equals () pour une classe avec des éléments de valeur ajoutés par héritage
Programme de régime avec préprocesseur (comment gérer la taille i-appli)
java: Comment écrire une liste de types génériques [Note]
Comment traiter Aucun modèle de demande interactive
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
Comment faire un MOD pour Slay the Spire
[Azure] J'ai essayé de créer une application Java gratuitement ~ Se connecter avec FTP ~ [Débutant]
[Java] Comment rompre une ligne avec StringBuilder
Comment gérer l'erreur yaml.scanner.ScannerError: lors de la recherche du jeton suivant apparu lors de la création d'un environnement Rails avec Docker
Je souhaite créer une annotation générique pour un type
Java: Une histoire qui m'a mis mal à l'aise quand on m'a appris à comparer des chaînes avec des égaux sans raison.
Je veux écrire une boucle qui fait référence à un index avec l'API Stream de Java 8
Comment initialiser par lots des tableaux avec Java que je ne savais pas quand j'étais débutant
Un mémo du programme que vous pouvez réaliser que la probabilité de lancer des dés est d'environ 1/6
Implémentation d'une API forte pour "Je veux afficher ~~ à l'écran" avec un simple CQRS
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
Comment faire une capture d'écran avec l'émulateur Android Studio
Programme Java pour redimensionner une photo dans un carré avec des marges
J'ai essayé de moderniser une application Java EE avec OpenShift.
Comment créer une image de conteneur légère pour les applications Java
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
Comment gérer l'erreur ERREUR: lors de l'exécution de gem ... (Gem :: FilePermissionError)
À propos du comportement lors de la création d'un mappage de fichiers avec Java
A étudié comment appeler des services avec Watson SDK pour Java
Une histoire de malentendu sur l'utilisation du scanner Java (mémo)
[Java] J'ai réfléchi aux mérites et aux utilisations de "interface"
Ce n'est pas un gros problème si vous comprenez que j'étais accro à recevoir du courrier avec Java Mail depuis Exchange Online
Comment gérer l'événement où Committee :: InvalidRequest se produit en comité pendant le test de téléchargement de fichier Rspec
Mécanisme de conversion vers une langue que le navigateur peut reconnaître
J'ai réfléchi à la manière d'utiliser correctement WillSet de Swift.
Je veux revenir à l'écran précédent avec kotlin et java!
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Comment implémenter un travail qui utilise l'API Java dans JobScheduler