Conventions de codage Java lâches

Et cet article?

Il s'agit d'une norme de codage créée pour le développement en interne. J'ai moi-même été affligé par certaines conventions de codage involontaires créées par d'autres sociétés dans le passé, et je l'ai considérablement assouplie.

Dois-je suivre cet accord?

Il peut y avoir une idée qu'il s'agit d'une convention et qu'il devrait être respecté. Mais je n'aime pas ce genre d'idée simple. Si le but est de suivre les normes de codage, ce sera écrasant. Donc, à l'extrême, vous n'êtes pas obligé de suivre cette convention de codage. Alors pourquoi écrire? C'est parce que vous n'avez pas à hésiter si vous avez des règles. Si vous êtes sûr de vous, ignorez cette norme de codage (ou modifiez-la). Veuillez vous référer à cette norme de codage lorsque vous vous demandez quoi faire.

Guide d'utilisation

★ </ font>: Important. Cet accord ne doit pas être violé. S'il est raisonnable de violer, les conventions de codage doivent être modifiées. Cependant, vous devez être prêt à refactoriser toutes les sources à mesure que les conventions de codage changent. ◆ </ font>: Important. Si vous êtes convaincu que vous violez, mais c'est mieux! C'est le bon moment pour envisager de changer vos conventions de codage. ● </ font>: recommandé. Si vous n'êtes pas particulier à ce sujet, suivez-le pour le moment.

Convention de dénomination

Commun

● </ font> Idée de base

En gros, suivez le Google Java Style Guide (traduction japonaise non officielle).

★ </ font> Réfléchissez bien.

Une dénomination correcte signifie une définition concise et claire de ce que «c'est». C'est la conception du programme.

Si vous avez des difficultés à nommer

  • La conception du programme n'est ni concise ni claire
  • Je ne comprends pas les spécifications
  • Les coûts hérités sont trop élevés

Il peut y avoir un problème tel que. (= Le problème peut être détecté)

Si la dénomination est définie sur texte, cette alerte ne fonctionnera pas et la conception du programme se réduira de plus en plus.

Donnons un nom qui est juste, "Il n'y a que ça!"

★ </ font> En principe, il doit être en anglais. Les caractères japonais, romains et les codes mystérieux sont NG.

Le code mystérieux (ID d'écran, etc.) est NG car il n'est pas clair à première vue à quoi il se réfère. Romaji est simplement difficile à lire, donc NG. En japonais, il est difficile d'appuyer sur la touche pleine largeur / demi-largeur à chaque fois, c'est donc NG.

Bon exemple


public class Employee {
    public String name;
    private Decimal monthlyIncome;
}

mauvais exemple


public class Class002 {
    public String namae;
revenu mensuel décimal privé;
}

◆ </ font> N'utilisez pas d'abréviations autres que les plus courantes.

Parce qu'il faut du temps pour déchiffrer l'abréviation. Au contraire, il faut du temps pour faire une abréviation.

Object menuFlg; // NG:'Flg'Est FLaG? FLaGment?
String employeeNm; // NG:'Nm'Est le nom? NuMber?
SystemParameterDAO dao; // OK:'DAO'Est communément appelé DataAccessObject
DBConnection dbConnection; // OK:'DB'Fait généralement référence à DataBase

Si le nom est suffisamment long pour créer une abréviation inhabituelle, vous devez soupçonner que la conception du programme n'est pas appropriée. En outre, les variables avec une portée très étroite peuvent être plus faciles à voir si ce sont des abréviations, donc dans ce cas, c'est OK.

Bon exemple


public class Corporation {
    private List<Employee> employees;
    public List<String> getEmployeesNameList() {
        List<String> result = new ArrayList();
        employees.forEach(e -> result.add(e.getName());
        return result;
    }
}

mauvais exemple


public class Org {
    private List<String> corpEmpNmLst;
    public String getcorpEmpNmLst() {
        return corpEmpNmLst;
    }
}

En aparté, je suis mort une fois dans un projet avec une mystérieuse convention de romaji + abréviation de voyelle (GakuseiBango-> GKSIBNG).

Nom de la classe de package

● </ font> Nom de la classe de base

Fondamentalement, il suit le nom de la classe. Cependant, je voudrais que vous évitiez d'utiliser <SubClassName> Base de manière directe à cause des classes dérivées. La superclasse Developer devrait être ʻEmployee au lieu de DeveloperBase, et cette superclasse devrait être Person`.

Nom de la variable / constante / méthode

◆ </ font> Nom de la variable

Pour les valeurs booléennes, nommez-le de manière à ce que la signification de vrai / faux soit claire, comme ʻis-et has-`. La valeur booléenne «-Flag» est catégoriquement rejetée.

◆ </ font> nom de la méthode

Pour la méthode qui renvoie une valeur booléenne, reportez-vous au nom de variable mentionné ci-dessus.

Style de codage

★ </ font> Apparence

C'est au formateur de code d'écrire des retraits et {}, d'écrire plusieurs instructions sur une seule ligne, et ainsi de suite. C'est un gaspillage de ressources d'être distrait par cela pendant le codage.

◆ </ font> Nest

Approfondir le nid est généralement quelque chose de mal. À titre indicatif, si vous avez plus de 3 couches, vous devriez reconsidérer.

Bon exemple


public List<String> fizzBuzzList(List<Integer> themes) {
    List<String> result = new ArrayList<>();

    for(Integer theme: themes) {
        result.add(fizzBuzz(theme));
    }
    return result;
}

private String fizzBuzz(Integer theme) {
    Map<Integer, String> rule = new LinkedHashMap<>();
    rule.put(30, "FizzBuzzFizz");
    rule.put(15, "FizzBuzz");
    rule.put(5, "Buzz");
    rule.put(3, "Fizz");
    for(Integer ruleKey: rule.keySet()) {
        if(0 == theme % ruleKey) return rule.get(ruleKey);
    }
    return theme.toString();
}

mauvais exemple


public List<String> fizzBuzzList(List<Integer> themes) {
    List<String> result = new ArrayList<>();

    for(Integer theme: themes) {
        if(0 == theme % 3) {
            if(0 == theme % 5) {
                if(0 == theme % 2) {
                    result.add("FizzBuzzFizz"); 
                } else {
                    result.add("FizzBuzz"); 
            } else {
                result.add("Fizz");
            }
        } else if(0 == theme % 5) {
            result.add("Buzz");
        } else {
            result.add(theme.toString());
        }
    }
    return result;
}

◆ </ font> Le double refus est incompréhensible

Les humains ne sont pas assez intelligents pour comprendre le double déni. Le déni est un processus très coûteux pour les humains.

Bon exemple


public Boolean isActive(Boolean visible, Boolean enable) {
    return visible && enable;
}

mauvais exemple


public Boolean isNotInactive(Boolean invisible, Boolean notDisenable) {
    return !invisible && notDisenable;
}

◆ </ font> Opérateur logique Ne pas danser

Utilisez un opérateur logique par instruction, si possible, et au plus trois. Aucune autre opération logique n'est possible pour les humains.

mauvais exemple


Boolean isTooBad = (!(arg1.equals('1') && arg2 == 0) || arg0 > 30) ^ arg3.canRead(); 

◆ </ font> Le nombre magique est éliminé

Le nombre magique a ici une signification large et comprend une chaîne de caractères. Je ne comprends pas le sens, je ne peux pas le réparer et je ne connais pas l'étendue de l'influence. Bien sûr, à moins que la signification soit claire, telle que «0! = List.size ()».

Bon exemple


public Decimal getPrise(Item selectedItem, Campaign campaign) {
    return selectedItem.prise() * campaign.discountRate() * Constants.TAX_RATE;
}

mauvais exemple


public Decimal getPrise(Item selectedItem, Boolean campaign) {
    if(compaign) {
        return selectedItem.prise() * 0.8 * 1.08;
    } else {
        return selectedItem.prise() * 1.0 * 1.08;
    }
}

commentaire

Javadoc Attachez autant que possible aux classes et aux membres. À ce moment-là, utilisez les balises Javadoc de manière appropriée. En particulier, «@ param», «@ return», «@ throws» et «@ deprecated» sont requis selon les besoins. Au contraire, «@ author» et «@ since» ne sont pas requis séparément. Il ne sera de toute façon pas entretenu correctement. C'est une relique de l'époque où il n'y avait pas de système de gestion de version.

◆ </ font> Les commentaires inutiles sont détruits

Il y a trop de commentaires inutiles dans le monde. Veuillez détruire les commentaires suivants dès qu'ils sont trouvés.

  • Commenté et laissé la source avant la rénovation au cas où
  • Commentaires indiquant la plage de réparation (position de début / fin), la date de réparation, le réparateur, etc.
  • Description du traitement très simple // Remplacez 10 pour la variable a
  • Explication du traitement liée à la spécification // Ce traitement exprime le tableau yy sur la page nn de la spécification xxx

En particulier, si "Commenter juste au cas où" et "Réparer le commentaire de position" existent, je pense que l'effort d'investigation de la portée d'impact, l'effort de correction et le taux d'occurrence de bogue augmenteront de 1,5 à 4,0 fois par rapport au cas où ils n'existent pas.

● </ font> Commentaires de bienvenue

Les commentaires qui disent «quel était le but de l'écriture de ce processus (pourquoi)» ou «d'autres méthodes peuvent faire de même, mais pourquoi pas (pourquoi)» sont les bienvenus. À partir de ce commentaire, vous pouvez prédire le résultat attendu, et si le résultat de l'exécution ne correspond pas au résultat attendu, vous pouvez détecter qu'il s'agit d'un bogue.

Bon exemple


void createCurry(RetortCurry retortCurry) {
      //Réchauffez le curry chaud (Commentaire:"Chaud"Il est important de, et vous pouvez imaginer que vous devez changer le nombre de secondes en fonction de la puissance de la portée et de la capacité du curry)
      Microwave.execute(retortCurry, 180);
      //Compte tenu de l'apparence, placez-le sur une assiette (Explication: L'ordre de le mettre sur une assiette est"Cela semble bon"のためにこの順にしていることがわかる。Cela semble bonを無視すれば順番は崩してもよい)
      return new Dish().add(rice).add(retortCurry).add(fukujinzuke);
}

mauvais exemple


void createCurry(RetortCurry retortCurry) {
      //Mettez le curry dans la plage, réglez-le sur 180 secondes et exécutez-le (Explication: je ne connais pas le but, donc je ne sais pas si le nombre de secondes doit être changé même si la puissance de la plage ou la capacité du curry change)
      Microwave.execute(retortCurry, 180);
      //Placez le riz, le curry et le Fukujin-zuke dans une assiette (Explication: je ne sais pas quel est le but, donc je ne peux pas changer l'ordre)
      return new Dish().add(rice).add(retortCurry).add(fukujinzuke);
}