[JAVA] Examiner les points pour la formation des nouveaux employés 2019

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.


Informations préalables

Ci-dessous, nous décrirons les informations qui reposent sur la situation au moment où l'examen est effectué.

À propos de l'exemple d'application

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

Outil de gestion de la configuration

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

Outil d'analyse statique

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.


Points de révision du programme

J'ai souligné ce qui suit.


** Remplacez par logger au lieu d'utiliser System.out. ** **

   @Override
	public void getDelItem(TestDTO dto) {
		System.out.println("###Flow dto.getItemNumber() = " + dto.getItemNumber());
		getItemPrimitive().delItem(dto);
	}
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.


Le traitement d'initialisation du guichet est implémenté dans ʻonInitialize () `au lieu du constructeur de la classe Page et de la classe Panel.

À 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 + "');");
    }
 /**
     *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 Java 7, vous pouvez utiliser l'opérateur diamant.

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<>();

Définissez uniquement les variables nécessaires en tant que variables membres.

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

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

      ...
   }

L'instruction switch définit la clause par défaut.

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

	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...");
	}

Supprimer les instructions d'importation inutilisées

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.


Utilisez la casse camel pour les noms de variables sauf s'il y a des restrictions

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 = "";

Supprimer la ligne commentée du programme

Supprimez la ligne de commentaire du programme. Les raisons pour lesquelles vous devez le supprimer sont les suivantes.


Supprimer les variables inutilisées

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é ").


Déterminez si des balises d'étiquette peuvent être ajoutées aux balises d'entrée

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>

Penser à effectuer une revue de programme

Décrivez vos réflexions à travers l'examen du programme. Cela s'appelle aussi un simple souci.


Dois-je enseigner les meilleures pratiques ou l'anti-pattern?

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.


Il existe un niveau où vous ne comprenez pas le contenu d'avertissement de l'outil d'analyse statique.

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.


Créez un mauvais programme en détournant un mauvais programme.

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.


finalement

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.

Recommended Posts

Examiner les points pour la formation des nouveaux employés 2019
Points de révision du code
Points pour la refactorisation (si instruction)