[JAVA] Pourquoi le code était-il pénible à lire?

introduction

Bonsoir. Je fais maintenant partie d'une équipe de maintenance système héritée avec VB à l'avant, Java 1.4 sur le serveur et CVS sur l'outil de gestion de version (mais je ne dis pas que c'est sous contrôle). Nous sommes ici.

Il n'est pas rare de recevoir une demande du service d'assistance qui reçoit une demande d'un utilisateur et lit le code pour enquête. Cette fois, j'ai commencé par demander "Pourquoi ai-je eu cette erreur quand j'ai fait ça?", Et j'ai lu le code VB de façon un peu inhabituelle.

Comme je n'ai presque pas d'expérience VB, j'ai regardé le code pour le moment, mais c'était trop "je ne parle pas du langage ...". Cependant, si vous vous plaignez simplement, il semble que quelqu'un quelque part sera en colère si vous n'êtes pas productif, et cela semble utile pour la reconfirmation, y compris l'auto-admonition que "c'est difficile à comprendre", donc cet article J'aimerais écrire.

Chacun n'est pas un gros problème, et il semble que je puisse le faire moi-même, mais j'ai réalisé une fois de plus que s'ils se chevauchent, la lisibilité et la maintenabilité seront terribles.

supposition

Partie 1. Agitation situationnelle

Il n'y a pas d'informations positives

Il n'y a pas de document de définition des exigences, de document de conception ou de code de test, et personne ne sait "ce qui est juste", ni l'utilisateur qui a fait la demande, ni le service d'assistance qui a reçu la demande, ni les membres sur le terrain. .. Personne ne sait même si l'erreur est correcte. Donc, vous recherchez vraiment "pourquoi avez-vous cette erreur?" (À ce stade, cela semblait très amusant)

Il n'y a pas d'environnement d'exécution

Il n'y a aucune sortie qui semble être utile dans le journal de l'application et il n'y a aucun environnement qui peut être débogué comme Visual Studio. Il semble que l'environnement puisse être utilisé si vous postulez et obtenez l'autorisation, mais je me souviens qu'il a fallu 3 semaines entre la demande de l'ID utilisateur de l'environnement interne et son obtention, donc pour le moment j'ai ouvert le code source avec un éditeur de texte Je vais le lire.

Des rumeurs qui me mettent mal à l'aise

Il semble que le développement initial remonte à environ 10 ans, et j'entends des rumeurs selon lesquelles il semble qu'il y ait eu une grande flamme à ce moment-là. J'ai entendu dire que toutes les personnes impliquées dans le développement initial, sans parler de la personne qui a écrit cette source, ont quitté l'entreprise. Eh bien, j'ai un mauvais pressentiment.

Partie 2. Code source Première impression d'anxiété

Méthode longue

Les méthodes que vous devriez lire dans la partie principale sont d'environ 600 lignes et environ 200 lignes, respectivement. Eh bien, c'est encore une catégorie courte pour moi, qui a été sur le terrain où des milliers de lignes de méthodes sont encombrées car il est interdit de faire des méthodes ...! (Cependant, il y avait beaucoup de commentaires et de documents sur le site de milliers de lignes, et de nombreux membres comprenaient exactement la structure des données.)

Il y a 12 nids

Le côté gauche du centre était Sukasuka. J'aime les nids peu profonds à moins qu'il n'y ait une raison particulière, et je ne pouvais penser à aucune raison pour laquelle je devais en faire 12 couches ...

Partie 3. Bienvenue dans de merveilleuses variables

Drapeaux de quelque chose déclaré l'un après l'autre

boolean ariFlg;
boolean flg;
boolean checkFlg;
boolean okFlg;

Même si le nom de la variable est un peu long, il est plus facile à lire s'il est plus facile d'imaginer quand le drapeau pour ce qui sera vrai. J'aimerais que vous ajoutiez au moins un commentaire. À propos, certains drapeaux n'étaient utilisés nulle part.

Un drapeau de quelque chose à jouer avec le déni ou ou ou et

if (!flg || okFlg && !checkflg) {
    if (!ariFlg) {
    } 
}

Bien sûr, il s'agit en fait d'une méthode d'imbrication 12 fois et de 600 lignes, donc c'est beaucoup plus compliqué. Personnellement, je n'aime pas utiliser le déni sans discernement ni combiner des drapeaux qui sont utilisés à des fins différentes ici et là, car cela peut être très déroutant.

Compteur de boucles qui semble avoir une intention

for (int k = 0; k < list.size(); k++) {
    for (int h = 0; h < list.size(); h++) {
        for (int g = 0; g < keys.size(); g++) {
        }
    }
}

Les compteurs de boucle ne sont pas classés par ordre alphabétique, et ils ne semblent pas être un acronyme pour quoi que ce soit, et ils peuvent ou non avoir des conditions de fin.

Quelque chose comme un compteur de boucles

int ii;
for (int i = 0; i < list.size(); i++) {
    if (Expression conditionnelle) {
        ii = i;
        map.put(ii, i);
    }
}

i et ii ... Je pense que c'est un processus en boucle imbriquée, mais la clé / valeur de la carte semble être ii et i. Qu'est-ce que c'est?

Un nom aimable qui permet de comprendre facilement ce qui sera inclus

int mainasuIchi = -1;

Je ne pensais pas que c'était "Mainasuichi" en caractères romains, mais quand je l'ai vu pour la première fois, j'ai pensé que c'était une sorte de mot anglais. J'avais peur que ce ne soit pas une constante et ne contienne pas -2 ou -3, mais par conséquent ce n'était pas le cas. C'était -1 jusqu'à la fin.

Une dénomination aimable qui permet de comprendre facilement ce qui sera inclus (je ne dis pas qu'il sera saisi)

arrLst.put(key, value);  //arrLst est un type HashMap. Bien sûr, ce commentaire n'est pas réellement disponible.

Je pense qu'il est plus facile de comprendre s'il y a moins de variables dont vous devez vous soucier dans une seule méthode. C'est une méthode qui comporte des centaines de lignes, et je ne peux pas la suivre sans spécifications, documents de conception et environnement de débogage ... Un super ingénieur n'est-il pas un problème comme ça?

Numéro magique classique

int[] checkNum = {0, 1, 2, 3};
int[] kubun = {1, 2, 3};

Je suis plutôt heureux de rencontrer quelque chose que je connais.

Mal orthographié

String maccingMsg;

Peut-être que si quelque chose correspond à quelque chose, mettez un message ici. N'importe qui peut faire une faute d'orthographe. Cependant, quand j'ai rencontré ceci après avoir vu diverses variables de confusion, "N'est-ce pas juste une faute d'orthographe, n'y a-t-il pas un matchingMsg? Je pense que j'ai fait ceci pour faire un autre type en plus de cela?" Je suis devenu mal à l'aise et je cherchais le code source avec correspondance.

Partie 4. Commentaires qui alimentent l'anxiété

De loin le plus moelleux

//Mettre à 0
//Faire plus
//C'est une erreur
//Confirmer
//Compter
//vérifier

Pourquoi? quelle? Je ne sais pas, donc j'ai peur de plonger dans le prochain nid. Bien sûr, c'est une méthode compacte, il est facile d'imaginer que vous vérifiez cela dans une classe ou une méthode, c'est votre propre outil, et je pense qu'il y a des commentaires comme celui-ci. Cependant, je pense qu'il est prudent de l'éviter dans un système compliqué et à grande échelle où les membres sont remplacés parce qu'il s'agit d'un produit de sortie et que l'on sait qu'il sera maintenu pendant de nombreuses années à venir. J'ai eu l'expérience d'être en flammes et de me précipiter vers "doit bouger quand même", mais si vous faites un peu attention aux commentaires et aux noms de variables, vous serez sauvé en cas de bogue, et par conséquent il ne se propagera pas.

La première chose que tu veux savoir si c'est un mensonge

//Processus lorsque la variable a est 10 et la variable b est 20
if (a == 10) {
    //En traitement
}

La variable b n'est pas jugée. L'imbrication est toujours en cours dans le processus, alors le ferons-nous plus tard? Ou cela signifie-t-il que la variable b est 20? Le commentaire est-il faux? Je me demande s'il y a un bogue qui n'a pas été implémenté comme commenté et que la variable b n'a pas été vérifiée.

Des choses qui vous font réfléchir un instant

//OK s'il n'y en a qu'un OK

Je comprends, je comprends. Peut-être que c'est OK de vérifier quelque chose et s'il y en a un qui est OK. Je ne me trompe pas. Je ne me trompe pas.

Ce n’est pas un mensonge, mais une chose de mauvaise humeur.

for (Expression conditionnelle) {
    //Si flg est vrai, l'exécution du processus
    if (!flg) {
        continue;
    }

    //En traitement
} 

"Si flg est faux, ce sera négatif avec!, Donc ce sera vrai et continuer, et si flg est vrai ,! Vous penserez à l'agonie. Si c'est Nest, Nest, Nest ,,,, je suis plein de tête et je veux tout jeter et faire une sieste dans un hamac de prairie.

en conclusion

Dans un projet auquel j'ai participé pendant un moment, j'ai pensé une fois que c'était très bien parce que le wiki disait: "Une erreur est le résultat du fait que le responsable fait de son mieux à ce moment-là. Ne le blâmez pas." .. La première entreprise dans laquelle je suis entré a été de fournir une formation en interne, et j'ai principalement fabriqué des produits en interne et des projets contractuels. Cependant, si j'étais une entreprise qui ne m'avait pas donné de formation et qui était soudainement ignorée par les clients et n'avait pas de suivi ni de critiques ... j'aurais peut-être écrit un code pire, et je faisais déjà un travail sans rapport avec l'informatique. peut être. C'était pénible quand je le lisais, mais cette fois j'ai rencontré ce genre de code, qui m'a fait écrire un article, et ça m'a aussi donné une chance de penser la lisibilité à ma manière. Soyons productifs!

Recommended Posts

Pourquoi le code était-il pénible à lire?
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch
Mémorandum pour nettoyer le code Ruby
Code utilisé pour connecter Rails 3 à PostgreSQL 10
[Ruby] Code pour afficher le jour
Lisez la documentation officielle de Dagger2 pour comprendre les bases
À propos du fait que le code pour lire le membre de la structure C (tableau Char) qui fonctionnait dans swift 2.3 dans swift 3 ne fonctionnait pas
J'étais accro à NoSuchMethodError dans Cloud Endpoints
J'ai lu le code lisible, alors prends note
J'étais accro au record du modèle associé
Pour implémenter, écrivez le test puis codez le processus
[Code Golf] Dégonflez le code et soumettez-le à AtCoder [Compressed Golf]
J'étais accro au réglage de laradock + VSCode + xdebug
Publier le code de coupon utilisé sur le point de terminaison spécifié
Corrigez le code de caractère en Java et lisez à partir de l'URL
Ce à quoi j'étais accro avec l'API REST Redmine
Essayez de passer au traitement asynchrone via MQ sans changer le code
Contribué à Gradle et a été nommé dans la note de publication
L'histoire à laquelle j'étais accro lors de la création de STS
Comment appliquer le format de code C à partir de la ligne de commande