Dans notre entreprise, nous créerons un exemple d'application pour environ janvier dans le cadre de la formation des nouveaux ingénieurs. L'échelle de l'application exemple est d'environ 6 à 7 écrans, et pendant la période de création, un ingénieur senior qui s'est engagé quotidiennement dans la gestion de la configuration et est devenu un éducateur effectuera une révision du code.
Dans cet article, je vais reprendre et présenter certains des contenus mis en évidence lors de la révision du code, et décrire ce que j'ai pensé après la révision du programme comme un point d'amélioration à partir de l'année prochaine.
Ci-dessous, nous décrirons les informations qui reposent sur la situation au moment où l'examen est effectué.
Les composants tels que le langage de programmation et le serveur utilisés dans l'exemple d'application sont les suivants. Les informations de version sont omises.
-** Langage de programmation ** Java
** Serveur J2EE ** Glassfish
** Framework Web ** Apache Wicket
J'utilise Subversion. Vesion est la suivante.
svnadmin --version
svnadmin,Version 1.7.14 (r1542130)
Date et heure de compilation: Nov 20 2015, 19:25:09
Obtenez le code source de Subversion sur SonarQube Check quotidiennement. Lors de la réalisation de l'examen, les résultats de l'analyse statique seront également appelés informations de référence.
J'ai souligné ce qui suit.
logger
au lieu d'utiliser System.out
. ** **System.out
pour sortir le journal. @Override
public void getDelItem(TestDTO dto) {
System.out.println("###Flow dto.getItemNumber() = " + dto.getItemNumber());
getItemPrimitive().delItem(dto);
}
** Les raisons ne sont pas bonnes **
J'utilise System.out.println
pour le débogage, mais puisque System.out.println
est sorti vers Server.log du serveur AP (Glassfish), démarre, arrête et arrête le serveur AP lui-même. Il est mélangé avec des informations d'erreur.
Selon la chaîne de caractères de sortie, le système de surveillance des journaux peut mal fonctionner.
** Bon exemple ** Utilisez logger pour spécifier le niveau de journal et sortir le journal.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private Logger logger = LoggerFactory.getLogger(this.getClass());
...
@Override
public void getDelItem(TestDTO dto) {
logger.info("###Flow dto.getItemNumber() = " + dto.getItemNumber());
getItemPrimitive().delItem(dto);
}
La bibliothèque Logger gère la destination de sortie du journal dans le fichier de paramètres. En fonction des paramètres, vous pouvez effectuer une sortie uniquement vers le fichier journal, une sortie uniquement vers la console, une sortie vers le fichier journal et la console, etc. Si vous utilisez Logger, vous pouvez conserver la sortie du journal pour le débogage, mais vous pouvez modifier le fichier de paramètres afin que l'environnement de production ne génère pas le journal.
À partir de Wicket 1.5x, il est recommandé que le processus d'initialisation soit implémenté dans onInitialize () au lieu du constructeur.
/**
*Constructeur
*
* @param paramètres d'entrée paramètres
*/
public PracticeMyPage(PageParameters params) {
super(params);
super.renderJavaScriptFile("PracticeMyPage.js");
add(new AbstractMyPage("MyPagePanel", params) {
@Override
protected AbstractMyPageMediator getMyPageMediator() {
return kikakuMyPageMediator;
}
});
String serverDate = DateUtil.dateTimeToStr(DateUtil.getSystemDate());
this.setBodyOnLoad("setServerDate('" + serverDate + "');");
}
** Les raisons ne sont pas bonnes **
Ceci est dû au fait qu'il existe de nombreuses restrictions sur l'ordre d'implémentation, telles que le constructeur doit d'abord appeler super ()
.
** Bon exemple **
/**
*Constructeur
*
* @param paramètres d'entrée paramètres
*/
public PracticeMyPage(PageParameters params) {
super(params);
}
/**
*Processus d'initialisation
**/
@Override
public void onInitialize() {
super.renderJavaScriptFile("PracticeMyPage.js");
PageParameters params = super.getPageParameters();
add(new AbstractMyPage("MyPagePanel", params) {
@Override
protected AbstractMyPageMediator getMyPageMediator() {
return kikakuMyPageMediator;
}
});
String serverDate = DateUtil.dateTimeToStr(DateUtil.getSystemDate());
this.setBodyOnLoad("setServerDate('" + serverDate + "');");
//Parent à l'initialisation()L'appel peut être à la fin du processus
super.onInitialize();
}
Depuis Java7, vous pouvez utiliser l'opérateur diamant. Certains codes sont écrits en Java6 ou antérieur, et certains codes n'utilisent pas l'opérateur diamant, mais si vous en créez un nouveau, utilisons-le activement.
List<String> strings = new ArrayList<String>();
Map<String,List<Integer>> map = new HashMap<String,List<Integer>>();
List<String> strings = new ArrayList<>();
Map<String,List<Integer>> map = new HashMap<>();
** Supplément ** Les caractéristiques liées à l'opérateur diamant comprennent: Lorsque Java est mis à niveau, il peut être implémenté avec une nouvelle syntaxe, alors collectez régulièrement des informations.
[Nouvelle version de Java 8 Nouvelles fonctionnalités (14) Autres nouvelles fonctionnalités (1) - Utilitaires utiles, génériques améliorés | My Navi News](https://news.mynavi.jp/article/20140311-s_java8/ 14) En Java8, le paramètre type de la méthode peut également être omis.
Java var memo (Java var Memo de Hishidama) Java 10 a introduit la variable var.
Je pense qu'il existe de nombreux modèles dans lesquels la description de la source source de détournement reste telle quelle, mais les variables qui n'ont pas besoin d'être des variables membres sont définies comme des variables membres.
public class AbstractRegistItem extends BaseNewUIPanel {
/** Form */
private HImForm<Void> form = null;
/**Code produit*/
private HImTextField<String> code = null;
/**Nom du produit*/
private HImTextField<String> syouhin = null;
/**Quantité/unité*/
private HImTextField<String> num = null;
......
}
** Les raisons ne sont pas bonnes **
Si la définition et l'utilisation des variables sont séparées, la lisibilité du programme diminuera.
** Bon exemple **
public class AbstractRegistItem extends BaseNewUIPanel {
/**
*Processus d'initialisation de la page
*/
private void initPage(PageParameters params) {
/** Form */
HImForm<Void> form = new HImForm<>("form", this);
//1ère zone de texte
HImTextField txtItemName = new HImTextField<>("txtItemName");
form.add(txtItemName);
this.add(form);
...
}
Veillez à inclure la clause par défaut dans l'instruction switch.
switch(dto.getSelectedValue()){
case "1":
sbSql.append("UPD_DATE DESC ");
break;
case "2":
sbSql.append("UPD_DATE ASC ");
break;
case "3":
sbSql.append("ITEM_NUMBER DESC ");
break;
case "4":
sbSql.append("ITEM_NUMBER ASC ");
break;
}
** Les raisons ne sont pas bonnes **
Dans la phase de maintenance après la mise en œuvre, il n'est pas possible de déterminer si l'absence de clause par défaut est une omission de mise en œuvre ou si elle est intentionnelle.
D'après mon expérience, le bogue de l'implémentation manquante de la clause par défaut apparaît parfois, ce qui est un triste souvenir.
** Bon exemple **
switch(dto.getSelectedValue()){
case "1":
sbSql.append("UPD_DATE DESC ");
break;
case "2":
sbSql.append("UPD_DATE ASC ");
break;
case "3":
sbSql.append("ITEM_NUMBER DESC ");
break;
case "4":
sbSql.append("ITEM_NUMBER ASC ");
break;
default:
//C'est proche du cas, mais lève une exception si la valeur ne peut jamais être définie.
throw new llegalArgumentException("dto.getSelectedValue() is illegal...");
}
Supprimez les instructions d'importation inutilisées car elles seront bruyantes pendant la phase de maintenance après l'implémentation.
Eclipse sur Windows vous permet d'organiser les raccourcis importés ctrl + shift + o
.
Pour les noms de variables, utilisez le cas de chameau spécifié dans la norme de codage, sauf s'il existe des restrictions sur le cadre.
private String SelectedValue = "";
private String selectedValue = "";
Sélectionner la variable cible> Clic droit> Convertir
pour afficher une liste des processus de conversion standard pouvant être exécutés dans Eclipse.Supprimez la ligne de commentaire du programme. Les raisons pour lesquelles vous devez le supprimer sont les suivantes.
Supprimez les variables inutilisées. C'est aussi parce qu'il provoque du bruit lors de l'enquête sur le programme. SonarQube émet l'avertissement suivant.
Remove this unused "selLineCnt" private field.
Si, pour une raison quelconque, vous devez quitter la variable, vous pouvez supprimer l'avertissement en donnant @SuppressWarnings (" non utilisé ")
.
Ceci est un point HTML. Une paire d'attributs d'étiquette peut être ajoutée à la balise d'entrée. S'il y a des informations qui peuvent être étiquetées, donnez-leur une étiquette et cliquez sur l'étiquette pour vous concentrer sur l'attribut d'entrée.
<th colspan="2">
<p class="disp-ic"><img height="13" width="23" class="ic-required" alt="Obligatoire" src="/web2/jp/images/ic-must.gif"></p>
Code produit
<div class="letter-control">(Moins de 20 caractères demi-largeur)</div>
</th>
<td>
<span class="cstm-tx">
<span class="cstm-tx-bg">
<input wicket:id="txtCode" type="text" maxlength="20" rel="Moins de 20 caractères demi-largeur" class=" w100 noticeTip ime-actv" id="txtCode" name="c1-29" tabindex="40" />
</span>
</span>
</td>
<th colspan="2">
<p class="disp-ic">
<img height="13" width="23" class="ic-required" alt="Obligatoire" src="/web2/jp/images/ic-must.gif">
</p>
<!--Ajouter une étiquette au code produit-->
<label for="c1-29">Code produit</label>
<div class="letter-control">(Moins de 20 caractères demi-largeur)</div>
</th>
<td>
<span class="cstm-tx">
<span class="cstm-tx-bg">
<input wicket:id="txtCode" type="text" maxlength="20" rel="Moins de 20 caractères demi-largeur" class=" w100 noticeTip ime-actv" id="txtCode" name="c1-29" tabindex="40" />
</span>
</span>
</td>
Décrivez vos réflexions à travers l'examen du programme. Cela s'appelle aussi un simple souci.
Les revues de programmes devraient le faire pour les anti-modèles. J'ai senti qu'il y avait peu d'occasions d'enseigner qu'il valait mieux écrire comme ça. Je pense que si vous procédez à la mise en œuvre avec Pair Pro et Mob Pro et expliquez la partie que vous ne comprenez pas le sens de la mise en œuvre, vous aurez l'occasion d'enseigner le système des meilleures pratiques. Aussi, je pense, "Laquelle des meilleures pratiques et anti-modèles est plus rapide à se développer?", Mais aucune réponse n'a été donnée pour le moment.
C'était une grande réalisation pour moi personnellement. Je pense que l'outil d'analyse statique est le meilleur outil pour les anti-modèles d'auto-apprentissage. Dans la formation pour les nouveaux arrivants, le contenu de l'avertissement est traduit en japonais pour certaines personnes [Comment utiliser le plug-in SpotBugs Eclipse - document spotbugs 4.0.0-beta4](https://spotbugs.readthedocs.io/ja/latest/eclipse J'ai installé .html), mais je ne sais pas quoi faire en regardant le contenu de l'avertissement. J'ai donc décidé de ne pas le voir. J'étais dans une situation de `. Dans ce cas, il peut être nécessaire d'apprendre à lire le contenu de l'avertissement, à mémoriser le vocabulaire lié au traitement de l'information et à apprendre à vérifier si vous ne comprenez pas.
L'application d'entraînement est créée en détournant le code du service qui est réellement en fonctionnement et en le convertissant en un squelette. En raison des circonstances au cours du développement, il y a eu des cas où la qualité était stable et d'autres non stables, et l'examen a souligné que la source de détournement n'était pas bonne. Pour ce qui est de l'enseignement de l'idéal, j'ai pensé qu'il valait mieux améliorer la qualité de l'application de formation.
Lors de la formation de l'année prochaine, j'aimerais profiter des points d'échec de cette année et effectuer un meilleur examen. J'ai fait plusieurs fois paire pro et mob pro, mais j'aimerais augmenter un peu plus le nombre.
c'est tout.