In unserem Unternehmen werden wir im Rahmen der Schulung für neue Ingenieure für etwa Januar eine Beispielanwendung erstellen. Der Umfang der Beispielanwendung beträgt ca. 6-7 Bildschirme. Während des Erstellungszeitraums führt ein leitender Ingenieur, der sich täglich dem Konfigurationsmanagement verschrieben hat und Pädagoge geworden ist, eine Codeüberprüfung durch.
In diesem Artikel werde ich einige der Inhalte aufgreifen und vorstellen, auf die während der Codeüberprüfung hingewiesen wurde, und beschreiben, was ich nach der Durchführung der Programmüberprüfung als Verbesserungspunkt ab dem nächsten Jahr dachte.
Im Folgenden werden die Informationen beschrieben, die auf den Umständen beruhen, unter denen die Überprüfung durchgeführt wurde.
Folgende Komponenten wie die Programmiersprache und der Server werden in der Beispielanwendung verwendet. Versionsinformationen werden weggelassen.
-** Programmiersprache ** Java
** J2EE-Server ** Glassfish
** Web Framework ** Apache Wicket
Ich benutze Subversion. Vesion ist wie folgt.
svnadmin --version
svnadmin,Version 1.7.14 (r1542130)
Zusammenstellungsdatum und -zeit: Nov 20 2015, 19:25:09
Holen Sie sich den Quellcode von Subversion auf SonarQube Check täglich. Bei der Durchführung der Überprüfung werden die statischen Analyseergebnisse auch als Referenzinformationen bezeichnet.
Ich habe auf Folgendes hingewiesen.
@Override
public void getDelItem(TestDTO dto) {
System.out.println("###Flow dto.getItemNumber() = " + dto.getItemNumber());
getItemPrimitive().delItem(dto);
}
** Gründe nicht gut ** Ich verwende "System.out.println" zum Debuggen, aber da "System.out.println" in das Server.log des AP-Servers (Glassfish) ausgegeben wird, starten und stoppen Sie den AP-Server selbst. Es wird mit Fehlerinformationen gemischt. Abhängig von der Ausgabezeichenfolge kann das Protokollüberwachungssystem fehlerhaft funktionieren.
** Gutes Beispiel ** Verwenden Sie den Logger, um die Protokollebene anzugeben und das Protokoll auszugeben.
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);
}
Die Logger-Bibliothek verwaltet das Protokollausgabeziel in der Einstellungsdatei. Abhängig von den Einstellungen können Sie nur in die Protokolldatei ausgeben, nur in die Konsole ausgeben, sowohl in die Protokolldatei als auch in die Konsole ausgeben und so weiter. Wenn Sie Logger verwenden, können Sie die Einstellungsdatei so ändern, dass die Produktionsumgebung das Protokoll nicht ausgibt, auch wenn Sie die Protokollausgabe zum Debuggen belassen.
Ab Wicket 1.5x wird empfohlen, den Initialisierungsprozess in onInitialize () anstelle des Konstruktors zu implementieren.
/**
*Konstrukteur
*
* @param params Eingabeparameter
*/
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 + "');");
}
** Gründe nicht gut **
Dies liegt daran, dass die Implementierungsreihenfolge vielen Einschränkungen unterliegt, z. B. muss der Konstruktor zuerst "super ()" aufrufen.
** Gutes Beispiel **
/**
*Konstrukteur
*
* @param params Eingabeparameter
*/
public PracticeMyPage(PageParameters params) {
super(params);
}
/**
*Initialisierungsprozess
**/
@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 + "');");
//Übergeordnetes Element beim Initialisieren()Der Anruf kann am Ende des Prozesses sein
super.onInitialize();
}
In Java7 können Sie den Diamantoperator verwenden. Einige Codes sind in Java6 oder früher geschrieben, und einige Codes verwenden nicht den Diamantoperator. Wenn Sie jedoch einen neuen erstellen, verwenden wir ihn aktiv.
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<>();
** Ergänzung ** Zu den mit dem Diamantoperator verbundenen Funktionen gehören: Wenn Java aktualisiert wird, kann es mit einer neuen Syntax implementiert werden. Sammeln Sie daher regelmäßig Informationen.
[Neue Version von Java 8 Neue Funktionen (14) Weitere neue Funktionen (1) - Nützliche Dienstprogramme, verbesserte Generika | Meine Navi-Nachrichten](https://news.mynavi.jp/article/20140311-s_java8/ 14) In Java8 kann der Typparameter der Methode ebenfalls weggelassen werden.
Java var memo (Hishidamas Java var memo) Java 10 führte die Variable var ein.
Ich denke, dass es viele Muster gibt, in denen die Beschreibung der Umleitungsquellenquelle unverändert bleibt, aber Variablen, die keine Mitgliedsvariablen sein müssen, werden als Mitgliedsvariablen definiert.
public class AbstractRegistItem extends BaseNewUIPanel {
/** Form */
private HImForm<Void> form = null;
/**Produktcode*/
private HImTextField<String> code = null;
/**Produktname*/
private HImTextField<String> syouhin = null;
/**Menge/Einheit*/
private HImTextField<String> num = null;
......
}
** Gründe nicht gut **
Wenn die Definition und Verwendung von Variablen getrennt sind, verringert sich die Lesbarkeit des Programms.
** Gutes Beispiel **
public class AbstractRegistItem extends BaseNewUIPanel {
/**
*Seiteninitialisierungsprozess
*/
private void initPage(PageParameters params) {
/** Form */
HImForm<Void> form = new HImForm<>("form", this);
//1. Textfeld
HImTextField txtItemName = new HImTextField<>("txtItemName");
form.add(txtItemName);
this.add(form);
...
}
Stellen Sie sicher, dass die default-Klausel in der switch-Anweisung enthalten ist.
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;
}
** Gründe nicht gut **
In der Wartungsphase nach der Implementierung kann nicht festgestellt werden, ob das Fehlen der Standardklausel eine Unterlassung der Implementierung darstellt oder ob dies absichtlich erfolgt.
Nach meiner Erfahrung tritt manchmal der Fehler auf, dass die Standardklausel nicht implementiert wurde, was eine traurige Erinnerung ist.
** Gutes Beispiel **
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:
//Es liegt nahe am Fall, löst jedoch eine Ausnahme aus, wenn der Wert niemals festgelegt werden kann.
throw new llegalArgumentException("dto.getSelectedValue() is illegal...");
}
Löschen Sie nicht verwendete Importanweisungen, da diese während der Wartungsphase nach der Implementierung verrauscht sind. Mit Eclipse unter Windows können Sie Verknüpfungen wie Strg + Umschalt + O-Importe organisieren.
Verwenden Sie für Variablennamen den im Codierungsstandard angegebenen Kamelfall, es sei denn, das Framework unterliegt Einschränkungen.
private String SelectedValue = "";
private String selectedValue = "";
Löschen Sie die Kommentarzeile des Programms. Die Gründe, warum Sie es löschen sollten, sind folgende.
Nicht verwendete Variablen löschen. Dies liegt auch daran, dass es bei der Untersuchung des Programms Rauschen verursacht. SonarQube gibt die folgende Warnung aus.
Remove this unused "selLineCnt" private field.
Wenn Sie die Variable aus irgendeinem Grund verlassen müssen, können Sie die Warnung unterdrücken, indem Sie "@SuppressWarnings (" unused ")" angeben.
Dies ist ein HTML-Punkt. Dem Eingabe-Tag können zwei Beschriftungsattribute hinzugefügt werden. Wenn Informationen beschriftet werden können, geben Sie ihr eine Beschriftung und klicken Sie auf die Beschriftung, um sich auf das Eingabeattribut zu konzentrieren.
<th colspan="2">
<p class="disp-ic"><img height="13" width="23" class="ic-required" alt="Verpflichtend" src="/web2/jp/images/ic-must.gif"></p>
Produktcode
<div class="letter-control">(Innerhalb von 20 Zeichen halber Breite)</div>
</th>
<td>
<span class="cstm-tx">
<span class="cstm-tx-bg">
<input wicket:id="txtCode" type="text" maxlength="20" rel="Innerhalb von 20 Zeichen halber Breite" 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="Verpflichtend" src="/web2/jp/images/ic-must.gif">
</p>
<!--Fügen Sie dem Produktcode ein Etikett hinzu-->
<label for="c1-29">Produktcode</label>
<div class="letter-control">(Innerhalb von 20 Zeichen halber Breite)</div>
</th>
<td>
<span class="cstm-tx">
<span class="cstm-tx-bg">
<input wicket:id="txtCode" type="text" maxlength="20" rel="Innerhalb von 20 Zeichen halber Breite" class=" w100 noticeTip ime-actv" id="txtCode" name="c1-29" tabindex="40" />
</span>
</span>
</td>
Beschreiben Sie Ihre Gedanken durch die Programmüberprüfung. Es wird auch nur eine Sorge genannt.
Programmüberprüfungen sollten dies für Anti-Patterns tun. Ich hatte das Gefühl, dass es nur wenige Möglichkeiten gab zu lehren, dass es besser ist, so zu schreiben. Ich denke, wenn Sie mit der Implementierung mit Pair Pro und Mob Pro fortfahren und den Teil erklären, dass Sie die Bedeutung der Implementierung nicht verstehen, haben Sie die Möglichkeit, das Best-Practice-System zu unterrichten. Ich denke auch: "Welche der besten Praktiken und Anti-Muster lässt sich schneller entwickeln?", Aber es wurde derzeit keine Antwort gegeben.
Dies war eine große Erkenntnis für mich persönlich. Ich denke, das statische Analysetool ist das beste Tool für selbstlernende Anti-Patterns. In der Schulung für Neulinge wird der Warninhalt für einige Personen ins Japanische übersetzt Verwendung des SpotBugs Eclipse-Plug-Ins - Dokument spotbugs 4.0.0-beta4 Ich hatte .html) installiert, weiß aber nicht, was ich tun soll, wenn ich mir den Inhalt der Warnung ansehe. Also habe ich beschlossen, es nicht zu sehen. Ich war in einer Situation von `. In diesem Fall denke ich, dass es notwendig ist, zu lehren, wie man den Inhalt der Warnung liest, das Vokabular in Bezug auf die Informationsverarbeitung auswendig zu lernen und zu lernen, wie man prüft, ob man es nicht versteht.
Die Trainingsanwendung wird erstellt, indem der Code des tatsächlich in Betrieb befindlichen Dienstes umgeleitet und in ein Skelett konvertiert wird. Aufgrund der Umstände während der Entwicklung gab es Fälle, in denen die Qualität stabil und einige nicht stabil waren, und die Überprüfung ergab, dass die Umleitungsquelle nicht gut war. In Bezug auf das Unterrichten des Ideals dachte ich, es wäre besser, die Qualität der Trainingsanwendung zu verbessern.
Im Training des nächsten Jahres möchte ich die diesjährigen Fehlerpunkte nutzen und eine bessere Überprüfung durchführen. Ich habe mehrmals Pair Pro und Mob Pro gemacht, aber ich möchte die Anzahl etwas weiter erhöhen.
das ist alles.