[JAVA] Ich hasse diese Art von Code! Eine Sammlung von Anti-Mustern, die tatsächlich auf dem Feld zu sehen sind

Einführung

Der Inhalt ist wie im Titel angegeben, aber ich habe nicht die Absicht, die Person zu entfernen, die den Anti-Pattern-Code geschrieben hat. Es gibt auch ein Wort, das Code hasst und Menschen nicht hasst. [^ Code] [^ code]: Ich habe es wirklich gefunden, als ich es gegoogelt habe.

Anstelle eines solchen negativen Motivs schreibe ich mit einem positiven Motiv, um so viele Lehren wie möglich aus Anti-Mustern zu ziehen und voranzukommen.

Insgesamt gibt es viele alte Geschichten, daher hoffe ich, dass es heutzutage weniger solche Codes und Situationen gibt.

Umgebung

Inhalt

Verwenden des Oleore-Frameworks, das Struts1 erweitert

Wie viele von Ihnen vielleicht wissen, war Struts1 vor vielen Jahren nicht mehr unterstützt, daher habe ich zu diesem Zeitpunkt nur ein schlechtes Gefühl.

Es ist immer noch in Ordnung, Struts so zu verwenden, wie es ist, aber wie die Überschrift sagt, habe ich das Oleore-Framework verwendet, das Struts erweitert. In diesem Framework muss eine große Anzahl von Klassen erstellt werden, um die Verarbeitung einer Anforderung zu schreiben: Struts Action und FormBean, BLogic, die die Geschäftslogik beschreibt, BLogicInputBean für die Eingabe in BLogic, BLogicOutputBean für die Ausgabe , JSP und in einigen Fällen wurden auch DAO und DAO Bean benötigt, um an DAO übergeben zu werden. Außerdem sind struts-config, die Validierung von Struts, die Definition von Spring, die Änderung von sqlMap und die XML-Datei von iBATIS enthalten.

Insbesondere war es ein Rätsel, dass es notwendig war, viele Arten ähnlicher Bohnen zu erstellen, aber diese Bohnen mussten als Konvention des Frameworks erstellt werden, und obwohl der Inhalt fast gleich war, unterschieden sie sich als Arten, also die Bohnen Ich habe viel Zeit gebraucht, um die Nachfüllungen manuell zu schreiben. [^ bean] [^ bean]: Später erfuhr ich, dass es eine Bibliothek gibt, die den Inhalt von Bohnen kopiert, die ähnlich, aber unterschiedlich sind, was das etwas einfacher machte. Da diese "für jede Anforderung" erstellt werden, war es außerdem erforderlich, die obigen Angaben für jede Anzeigeanforderung, neue Registrierungs- / Aktualisierungsanforderung, Anforderung zum Aktualisieren einiger Elemente auf dem Bildschirm usw. zu erstellen. .. Wie auch immer, der Korrekturaufwand war groß, so dass die Produktivität sehr gering war.

Was soll ich machen

Zu dieser Zeit gab es nicht viele leistungsstarke Frameworks, um Struts zu ersetzen. Ich denke, es gab keine andere Wahl, als Struts in gewissem Maße zu übernehmen. Es ist jedoch ein Rätsel, dass ich es modifiziert habe, um die Erstellung einer großen Anzahl unnötiger Klassen in einfachen Streben zu erzwingen. Ich denke, ich hätte die einfachen Streben so verwenden sollen, wie sie sind. Ein kurzer Blick zeigt, dass es bei einem solchen Framework nicht darum geht, die Produktivität zu steigern, sondern darum, Dinge auch mit geringen Entwicklerfähigkeiten zu erledigen. [^ einfallen] [^ invade]: Referenz: Invasive Framework

Vielleicht haben sie einen solchen Rahmen angenommen und Neuankömmlinge mit niedrigen Stückpreisen beauftragt, um die Kosten zu senken. (Eigentlich gab es viele Neuankömmlinge) Wenn die Wahl dieses Rahmens aus diesem politischen Grund erfolgt, kann nicht mehr geholfen werden. Ich kann mir nur einen Weg vorstellen, damit umzugehen, indem ich weglaufe. Wenn Sie über ein hohes Maß an technischen Fähigkeiten verfügen, können Sie möglicherweise Ihr Bestes geben, wie der Referenzlink, aber ich konnte zu diesem Zeitpunkt nicht daran denken. Ich bin vielleicht kein anständiger Programmierer.

Derzeit gibt es keinen Grund, Struts für die Neuentwicklung zu wählen. Ich frage mich, ob Spring Boot doch gut ist.

Zügellose Kopierprogrammierung

Kopierprogrammierung ist das, was Sie am Ende haben, wenn Sie eine Funktion erstellen, die einer vorhandenen Funktion ähnlich ist. Sie kopieren den vorhandenen Code, fügen ihn ein und korrigieren nur den Unterschied. Ich kann nicht sagen, dass es großartig ist, weil ich es manchmal mache, und ich meine nicht, dass Kopierprogrammierung immer schlecht ist, aber ich muss darauf hinweisen, dass Kopierprogrammierung immer noch ihre Nachteile hat.

Die Kopierprogrammierung macht Ihnen Spaß, da Sie Funktionen auch mit Code, den Sie nicht gut verstehen, schnell implementieren können. Auf den ersten Blick sieht sie produktiver aus, aber während der Wartung. Sieh die Hölle. Wenn Änderungen vorgenommen werden, müssen Sie zunächst für alle kopierten Teile die gleiche Änderung vornehmen. Außerdem besteht die Gefahr, dass seltsame Fehler auftreten, wenn beim Kopieren keine Korrektur vorgenommen wird. Code, der sofort zusammengestellt wird, ohne den Inhalt durch Kopieren gut zu verstehen, ist sehr schwer zu lesen, daher ist die Überprüfung in der Regel schlampig, und es treten häufig Korrekturauslassungen auf. Fehlende Codekorrekturen sind ein Problem, aber fehlende Kommentare sind ebenfalls ein Problem. In gewissem Sinne kann es schlimmer sein als eine Codeauslassung, da eine Kommentarauslassung das Verhalten nicht beeinflusst.

Kopierprogrammierung ist in den Projekten, die ich gesehen habe, weit verbreitet, und ich vermute, dass der größte Teil der Codierung durch Kopierprogrammierung erfolgt ist. Das Projekt enthielt so viele Auslassungen, dass die Kommentare nicht mehr glaubwürdig waren. Das ist das gleiche wie kein Kommentar. Sie alle kennen den Schmerz, Code zu pflegen, der überhaupt keine Kommentare enthält.

Was soll ich machen

Wenn es der gleiche Prozess war, sollte es extrahiert und in einer Methode usw. geteilt worden sein, anstatt zu kopieren. Selbst wenn eine Korrektur auftritt, müssen Sie sie in diesem Fall nur an einer Stelle reparieren. Da sie nicht an erster Stelle kopiert wird, wird die Korrektur nicht ausgelassen. Wenn Sie jedoch ein Teil ändern, wirkt sich dies auf mehrere Teile aus. Sie sollten daher sorgfältig überlegen, ob das Teilen wirklich in Ordnung ist. [^ teilen] [^ share]: Referenz: [Sorgfältig teilen](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82% A4 /% E5% 85% B1% E6% 9C% 89% E3% 81% AF% E6% 85% 8E% E9% 87% 8D% E3% 81% AB /)

Kommentieren Sie die Korrekturen aus und lassen Sie sie alle

Es ist die Wurzel allen Übels. Es ist ein berüchtigter Typ, von dem Sie wahrscheinlich gehört haben. Es ist in Ordnung, vorübergehend zu kommentieren, aber ich sage hier, dass alle Korrekturen dauerhaft auskommentiert werden. Darüber hinaus musste das Projekt einen Kommentar zum Beginn der Änderung und einen Kommentar zum Ende der Änderung zum Zeitpunkt der Änderung einfügen. Es ist sehr ärgerlich, weil jedes Mal, wenn Sie eine Korrektur vornehmen, die Menge an Müll zunimmt. Es ist sehr schwer zu lesen und kann ein Geräusch für Ihre Suche sein. Der Code wird nur schmutzig, da alle Korrekturen erhalten bleiben. Wo es viele Korrekturen gibt, ist es zu chaotisch zum Lesen. Das Lesen von Code ist natürlich eine sehr häufige Aufgabe, und dies war auch eine der Ursachen für den Produktivitätsverlust. Das ist es, was es bedeutet, viel Schaden und keinen Gewinn zu haben.

Was soll ich machen

Es kann SVN oder Git sein, aber Sie sollten ein Versionsverwaltungssystem verwenden. [^ Version] [^ version]: Nun, es sei denn, Sie haben besondere Umstände, sollten Sie Git wählen. Mit einem Versionsverwaltungssystem müssen Sie dies überhaupt nicht tun. Derzeit wird kein Projekt ohne Verwendung eines Versionsverwaltungssystems entwickelt. …Aber es ist nicht………? In diesem Projekt war die Version, obwohl sie von SVN verwaltet wurde, die oben genannte Regel, sodass sie völlig unklar war ...

Eine große Menge Java-Code im JSP-Scriptlet

Es gab oft Fälle, in denen eine große Menge an Geschäftslogik in JSP geschrieben wurde. Es war sehr schwer zu lesen, da es eine Mischung aus HTML und Java war. Es gab auch einen Fall, in dem die in einer JSP-Datei beschriebene Codemenge zu groß war und ein Fehler auftrat [^ jsp_error], sodass die JSP auf einen Bildschirm aufgeteilt wurde, der ebenfalls schwer zu lesen war. Es ist in Ordnung, es in geeignete Einheiten zu unterteilen, aber in diesem Fall war es eine Methode, eine riesige JSP in zwei oder drei zu schneiden und den Dateinamen Seriennummern zuzuweisen. Was ist also die Unterteilung in geeignete Einheiten? Es war schwer zu sagen. [^ jsp_error]: Referenz: Ich möchte, dass Sie das Problem lösen, das nicht sofort ausgeführt werden kann, wenn das Kompilierungsergebnis 65535 Byte in einer Methode überschreitet, was eine Einschränkung von Java darstellt.

Um zu implementieren, dass sich die Bildschirmanzeige je nach Bedingung ändert, habe ich ehrlich gesagt alles mit bedingter Verzweigung geschrieben. Dies führte auch dazu, dass die Codemenge anschwoll und schwer lesbar wurde.

Was soll ich machen

Schreiben Sie Ihre Geschäftslogik in das Modell. Die Grundlagen von MVC. Wenn sich die Bildschirmanzeige abhängig von den Bedingungen ändert, sollten Sie Maßnahmen ergreifen, um zu verhindern, dass eine Datei groß wird, z. B. eine Unter-JSP erstellen und laden.

Übrigens glaube ich nicht, dass es jetzt viele neue Entwicklungen gibt, die JSP verwenden. Immerhin ist der Mainstream jetzt Thymeleaf.

Refactor nicht

Da der Code kein Stigma enthält, das nicht berührt wird, selbst wenn ein Problem mit dem Code vorliegt, wurde angenommen, dass Sie ihn nicht berühren sollten, es sei denn, es liegt ein Problem mit der Bedienung vor. Infolgedessen wurden kleinere Probleme nicht behoben, und die Anzahl stieg stetig an. Selbst wenn es eine Warnung gab, konnte diese nicht korrigiert werden, sodass die Warnung im Pool gesammelt wurde. Dies ist nicht sehr gut, da eine große Anzahl von Warnungen die wirklich problematischen Warnungen begraben wird.

Außerdem wurde eine große Anzahl von TODO-Kommentaren unbeaufsichtigt gelassen. Wenn es für längere Zeit als TODO belassen wird, ist es schwierig zu wissen, wie man damit umgeht. Es ist auch ein Hindernis, weil das TODO, das ich persönlich hinzugefügt habe, begraben wird.

Was soll ich machen

Ich hätte mir etwas Zeit nehmen sollen, um umzugestalten. Es klingt auf den ersten Blick richtig, es nicht zu tun, weil Sie keine Zeit haben, aber es ist nicht. Es gibt viel zu tun, daher ist es unwahrscheinlich, dass Sie auf natürliche Weise Zeit haben. Sie können keine Zeit haben, ohne die Idee, andere Aufgaben zu koordinieren, um Zeit zu gewinnen. Was nicht ist, ist Motivation, nicht Zeit. [^ Zeit] [^ Zeit]: Es stimmte, dass wir keine Zeit hatten, weil alle jeden Tag bis etwa 22:00 Uhr arbeiteten, unabhängig von der Jahreszeit, und es gelegentlich Feiertage gab. Es war jedoch insgesamt eine ineffiziente Entwicklungsmethode, einige Leute machten häufig eine Pause wegen schlechter körperlicher Verfassung, einige kamen etwa 30 Minuten lang nicht zurück, nachdem sie ihre Sitze verlassen hatten usw. Ich denke, es war möglich, Zeit zu finden, wenn ich wollte.

Es gibt auch eine Geschichte, die ich hasse, weil ich sie testen muss, wenn ich den Code berühre. Ich weiß das, aber es gibt Zeiten, in denen Sie testen und umgestalten müssen. Wenn ich den Code durch Beheben eines Fehlers oder Hinzufügen einer Funktion behebe, muss ich ihn trotzdem testen, sodass ich denke, dass ich auch Refactoring hätte entwickeln können und sollen. Es scheint, dass eine kleine Änderung durch Ausführen von UT garantiert werden kann, aber in diesem Projekt habe ich UT überhaupt nicht geschrieben. Als allererstes ...

Solange es jedoch eine Regel [Korrekturen auskommentieren und alle weglassen](#Korrekturen auskommentieren und alle weglassen) gibt, gibt es kein Refactoring oder Scheiße. Diese Regel muss mindestens um jeden Preis zerstört werden.

Ständige Krankheit

Im Allgemeinen ist es gut, feste Werte zu behandeln, die oft als Konstanten erscheinen, aber manchmal werden unverständliche Konstanten erstellt, ohne die Absicht zu verstehen.

public static final int INT_0 = 0;
public static final int INT_1 = 1;
//Das Gleiche geht weiter unten

Dies unterscheidet sich nicht von der Verwendung von Literalen. Es ist ein Rätsel, aber die Person, die dies geschrieben hat, hat möglicherweise durch falsche Bildung den Eindruck erweckt, dass es schlecht ist, Literale direkt zu verwenden. Ich wollte selbst an den Begriff konstante Krankheit denken, aber es scheint, dass einige Leute bereits darüber nachgedacht haben. Es ist genau so. [Quelle] "DIV-Krankheit" ist gleichbedeutend mit gefährlich, wenn Sie alles übertreiben

Was soll ich machen

Ich denke nicht, dass es notwendig ist, viel zu erklären, aber ich denke, dass Konstanten ursprünglich für Werte verwendet werden, die sich in Zukunft ändern könnten. Durch Definieren einer Konstante und Verweisen auf die Konstante, bei der der Wert benötigt wird, muss nur der Initialisierungsteil der Konstante geändert werden, auch wenn sich etwas ändert. Aufgrund der Art und Weise, wie es sich in Zukunft ändern kann, sollte der Name basierend auf der Art des Werts, den der konstante Name bedeutet, und basierend darauf, welche Art von Wert speziell enthalten ist, benannt werden. Benennen ist Unsinn. Hier ist ein einfaches Beispiel.

//Schlechtes Beispiel
public static final String LF = "\n";

//Gutes Beispiel
public static final String LINE_SEPARATOR = "\n";

Wenn es ein schlechtes Beispiel ist, werden Sie in Schwierigkeiten geraten, wenn es sich in Zukunft ändert. Wie im folgenden Beispiel gezeigt, nennen wir es so, dass es sich nicht seltsam anfühlt, selbst wenn sich der Wert ändert.

Wenn sich der Wert in Zukunft wahrscheinlich nicht ändern wird, können Sie ihn meiner Meinung nach so verwenden, wie er ist, ohne eine Konstante zwangsweise zu verwenden. Hier ist ein weiteres Beispiel.

public static boolean isEven(int num) {
    return num % 2 == 0;
}

Wie Sie sehen können, ist es ein Code, der bestimmt, ob die Zahl gerade ist. Ich verwende numerische Literale wie "2" und "0", aber in diesem Beispiel ist es unwahrscheinlich, dass sich diese Zahlen in Zukunft ändern werden. Daher glaube ich nicht, dass es ein besonderes Problem gibt, wenn Sie das Literal so verwenden, wie es ist.

Verwenden Sie keine erweiterte for-Anweisung

Ich habe oft gesehen, dass Code mit gewöhnlichen Anweisungen hart arbeitet, wobei erweiterte Anweisungen verwendet werden können. Wenn Sie keinen Schleifenzähler benötigen, verwenden Sie die erweiterte for-Anweisung. Es ist einfacher zu schreiben, hat weniger Platz für Fehler und ist leichter zu lesen. Ich kann mir keinen Grund vorstellen, es nicht zu benutzen, wenn es benutzt werden kann, aber Sie wissen wahrscheinlich nicht, dass es existiert. Es gibt so eine Person! ?? Sie könnten denken, aber ich denke, es ist normal. Aber wie ich am Anfang schrieb, habe ich nicht die Absicht, sie niederzuschlagen. Wenn Sie es nicht wissen, müssen Sie es von nun an wissen. Wenn Sie Java 8 oder höher verwenden, sollten Sie auch die Stream-API verwenden.

Die Funktions-ID wird im Klassennamen verwendet

Es ist üblich, Klassen einen Namen zu geben, der ihre Verantwortlichkeiten identifiziert, aber in einem Projekt wurden alle Klassen nach Feature-ID benannt. Dies ist ein Beispiel, über das ich richtig nachgedacht habe, aber zum Beispiel "AP060.java", "AP060BLogic.java", "AP060Bean.java" und so weiter. Damit habe ich keine Ahnung, was jede Klasse ist. Wenn Sie sich daran erinnern, welche Funktions-ID welche Funktion ist, ist dies überraschend in Ordnung. Ich fand die Menschen erstaunlich, erkenne aber im Allgemeinen, dass es sich um eine abnormale Namensregel handelt. wird gebraucht.

Was soll ich machen

Sie müssen dies auch nicht schreiben, sondern geben ihm einen Namen, der Ihnen sagt, was die Klasse ist. Name wichtig.

Der Code in der if-Anweisung ist zu lang

Ich habe auch oft Code gesehen, bei dem die Anzahl der Zeilen in einer if-Anweisung zu lang ist, um zu verstehen, was wo geschrieben steht. Hunderte von Zeilen und Verarbeitungen sind in der if-Anweisung geschrieben, und wenn ich denke, dass es vorbei ist, scheint es, dass ähnlicher Code diesmal endlos weitergeht. Die meisten Verzweigungsbedingungen sind dieselben, z. B. für die Neuregistrierung und Aktualisierung, aber es gibt viele Fälle, in denen die Werte unterschiedlich sind. Verwenden Sie die if-Anweisung nur für Unterschiede ...

Was soll ich machen

Ich habe ein wenig geschrieben, aber wenn es der gleiche Prozess ist, sollten Sie es aus der if-Anweisung und dem bedingten Zweig nur den Unterschied entfernen. Auch wenn es sich um einen aussagekräftigen bedingten Zweig handelt, ist es immer noch schmerzhaft, lang zu sein. In einem solchen Fall möchte ich die Lesbarkeit mit ein wenig Einfallsreichtum verfolgen, z. B. die Verarbeitung in der if-Anweisung für eine Methode ausschneiden und ihr einen leicht verständlichen Namen geben. .. In einigen Fällen möchten Sie möglicherweise überlegen, ob Sie Polymorphismus verwenden können, um den bedingten Zweig selbst zu entfernen.

Der Anwendungsbereich ist nutzlos weit

Ich sehe oft Code, der eine lokale Variable am Anfang einer Methode definiert, aber tatsächlich diese Variable verwendet. Wenn Sie dies in (älteren Versionen von) C nicht tun, wird ein Kompilierungsfehler angezeigt, aber Java hat diese Einschränkung nicht, sodass es keinen Sinn ergibt. Es macht es nur schwierig, den Definitionsteil der Variablen und den zu verwendenden Teil zu verstehen. Darüber hinaus gab es einige Variablen, die absichtlich als Felder definiert wurden, obwohl lokale Variablen ausreichend waren. Wenn es sich um ein Feld handelt, kann es mit anderen Methoden gelesen und geschrieben werden, sodass es schwierig ist, den Übergang des Werts zu verfolgen.

Was soll ich machen

Definieren wir lokale Variablen, wenn wir sie brauchen. Definieren Sie außerdem Variablen, die nur innerhalb einer Methode verwendet werden, als lokale Variablen und nicht als Felder. Nun, die IDE könnte Sie hier warnen.

Verlust der Ressourcenfreigabe aufgrund der Wiederverwendung von Variablen

Es ist ein Pseudocode, aber ich sehe oft Code wie diesen. Weißt du was los ist?

ResultSet rs = null;

try {
    for(HogeBean bean : beanList) {
        //Verarbeitung mit Bohnen...

        rs = stmt.executeQuery();

        //Verarbeitung mit rs...
    }
} finally {
    if(rs != null) {
        rs.close();
    }
}

Nun, wie Sie aus der Überschrift erraten können, wird die Ressourcenfreigabe nicht ordnungsgemäß durchgeführt. Da wir die Variable rs in der Schleife wiederverwenden, wird close () nur in der letzten richtig aufgerufen.

Was soll ich machen

Stellen Sie sicher, dass close () für alles aufgerufen wird, z. B. indem Sie try-finally in die for-Anweisung einfügen. Verwenden Sie außerdem Try-with-Resources für Java 7 und höher. Nun, ich denke, dies wird durch statische Analysewerkzeuge erkannt.

Einzug ist angemessen

Einrückung ist wichtig. Quellen mit richtigem Einzug sind wirklich schwer zu lesen. Besonders wenn if und for-Anweisungen verschachtelt sind. Ich habe oft schrecklichen Code gesehen, wie das Einrücken in einen leeren Raum oder das Nicht-Tun dort, wo es gebraucht wurde. Es war wirklich schwer in Kombination mit dem obigen [Der Code in der if-Anweisung ist zu lang] zu lesen (Der Code in der # if-Anweisung ist zu lang). Vielleicht ist auch die Person, die es geschrieben hat, verwirrt. Hunderte von Codezeilen sind der Schuldige ... Aber das ist nicht alles. Es gibt ein Problem [Kommentieren Sie die Korrekturen aus und lassen Sie sie alle](#Kommentieren Sie die Korrekturen und lassen Sie sie alle). Die meisten Mitglieder haben auskommentiert, indem sie "//" in die erste Zeile eingefügt haben. Wenn Sie dies jedoch tun, liegt der auskommentierte Code etwas zurück. Dies war auch eine Quelle der Verwirrung. Darüber hinaus möchte ich das Problem genauso gut beheben wie den Einzug, aber ich hatte das Gefühl, dass es aufgrund der im Kommentar ausgelassenen Regeln schwierig ist, das Problem zu beheben. Irgendwie waren mehrere Ursachen miteinander verflochten und es war schrecklich und ich konnte nur seufzen.

Was soll ich machen

Es ist ein tief verwurzeltes Problem, aber das erste, was wir tun müssen, ist, Regeln zum Auskommentieren zu beseitigen und Hunderte von Codezeilen zu reduzieren. Wenn ich das kann, wird der Einzug natürlich korrigiert.

Nutzloser StringBuffer

Ich habe oft Code gesehen, der StringBuffer anstelle von StringBuilder verwendet, um Zeichenfolgen zu verketten, bei denen keine Thread-Sicherheit erforderlich ist. Dies ist auch dasselbe wie [Erweiterte Anweisung nicht verwenden](# Erweiterte Anweisung nicht verwenden), und Sie kennen wahrscheinlich die Existenz von StringBuilder nicht. Nun, das hat keine Leistungsprobleme verursacht, also spielt es vielleicht keine Rolle.

Vergleichen von Wrapper-Klassen mit ==

Dies ist ein Problem, das zu bösen Fehlern führen kann. Da Referenzvergleiche zwischen Wrapper-Klassen durchgeführt werden, geben grundsätzlich verschiedene Instanzen "false" zurück, selbst wenn sie denselben Wert haben. Bis zu diesem Punkt ist es dasselbe, als würde man Strings nicht mit == vergleichen. Das Problem ist jedoch, dass einige Werte möglicherweise "true" zurückgeben. Insbesondere wenn die Werte -128 bis 127 sind, wird "true" zurückgegeben, auch wenn es sich um unterschiedliche Instanzen handelt, wenn sie denselben Wert haben. Es kann weh tun, den Code im Vergleich zu "==" freizugeben, nur weil er beim Testen mit einem kleinen Wert in Ordnung war. Achtung.

Was soll ich machen

Vergleichen wir mit equals und String. Ich denke übrigens, dass dieses Problem von statischen Analysetools erkannt wird.

In der Logik werden Würfe als geprüfte Ausnahmen deklariert, die niemals ausgelöst werden

Ich habe es gesehen. Es scheint in der Definition der Methode ausgelöst zu werden, aber die Ausnahmen, die niemals in der Logik ausgelöst werden können, werden als Würfe deklariert, so dass der Code für die Ausnahmebehandlung explosionsartig wächst ... Es war bereits sehr wuchernd, weil es eine wichtige Methode war, die von hier und da aufgerufen wurde. Die Ausnahme wird niemals ausgelöst. Der Code zur Behandlung von Ausnahmen, die niemals ausgelöst werden können, kann nur als Müll bezeichnet werden. Dies machte den Code wieder nutzlos aufgebläht. ~~ Ich wurde ohne Erlaubnis zerknittert und gelöscht. Es war viel Spaß. ~~

Was soll ich machen

Entwerfen Sie die Definition der Throws-Klausel sorgfältig. Stellen Sie sicher, dass die Ausnahme wirklich ausgelöst werden kann. Überprüfte Ausnahmen in Java können den Aufrufer dazu zwingen, Ausnahmen zu behandeln. Überlegen Sie zweimal, ob es wirklich angemessen ist, den Anrufer zu zwingen, die Ausnahme zu behandeln.

Andere (außer Code)

Verwendung von iBATIS

iBATIS ist ein praktischer OR-Mapper, wurde jedoch vor langer Zeit nicht mehr unterstützt, und seine Spezifikationen sind alt, z. B. die Rückgabe einer Raw-Typliste. Sie sollten zu den nachfolgenden MyBatis wechseln.

Im Konstruktionsdokument mit Excel werden die Inhalte vor der Änderung gruppiert und belassen

In Excel können Sie bestimmte Zeilen und Spalten gruppieren und die gruppierten Teile mit einem einzigen Klick ein- oder ausblenden. Diese Funktion wird verwendet, um den nicht korrigierten Inhalt in einem verborgenen Zustand zu belassen. Dies ist ein Ersatz, der viel Schaden und nur einen Gewinn hat. Erstens bleiben alle Änderungen erhalten, wodurch die Datei schwerer wird, die Anzeige länger dauert und die Produktivität verringert wird. Obwohl es normalerweise ausgeblendet ist, verursacht es Suchrauschen, da es vorhanden ist. Wenn sich beim Erstellen einer Seriennummer usw. mit der Funktion zum automatischen Ausfüllen eine Gruppe in der Mitte befindet, wird die Seriennummer auch im Inhalt erstellt. Es ist sehr beunruhigend. Es ist ähnlich wie [Korrigieren Sie die Korrekturen und lassen Sie sie alle](#Kommentieren Sie die Korrekturen und lassen Sie sie alle). Grundsätzlich kann es eine schlechte Idee sein, den Änderungsverlauf in der Datei selbst zu haben. Obwohl ich geschrieben habe, dass es einen Gewinn gibt, ist es außerdem praktisch, den Inhalt vor der Korrektur mit einem Klick durchsuchen zu können. Aber ich kann nur an die Vorteile denken, und es gibt noch mehr Nachteile.

Was soll ich machen

Ich denke, es wäre besser, die Version des Designdokuments mit SVN oder ähnlichem zu verwalten. Natürlich sind Excel-Dateien Binärdateien, daher bin ich nicht sehr glücklich, die Version so zu verwalten, wie sie ist. Ich denke, Sie sollten das Designdokument mit Markdown oder AsciiDoc anstelle von Excel erstellen. In diesem Fall handelt es sich um eine Textdatei, sodass die Version einfach verwaltet werden kann. Wenn Sie Excel wirklich mögen, können Sie Markdown und AsciiDoc in eine Excel-Datei konvertieren. (Ich habe es nicht richtig überprüft, aber ich denke, ich kann es wahrscheinlich tun)

Unbequemes Tool zur Messung der Ölabdeckung

Das im Projekt angewiesene Tool zur Messung der Abdeckung war eine ziemlich mutige Methode zum Kopieren des gesamten Originalcodes und zum Einbetten des Quellcodes für die Messung der Abdeckung. (Ich bin nicht mit Tools zur Messung der Abdeckung vertraut, aber ich denke, es ist üblich, sie auf Bytecode-Ebene zu sehen ...) Bei der Durchführung eines Tests (manueller Test anstelle von UT) bestand die Regel darin, den vom Tool generierten Quellcode zu erstellen und den Test auszuführen. Das Tool kopiert ihn jedoch und platziert ihn. Da nur Java-Dateien verwendet werden, mussten alle anderen XML-, JSP- usw. Dateien manuell kopiert werden, was sehr unpraktisch war, da es lange dauerte, bis die Tests durchgeführt werden konnten. Außerdem gibt es zwei Quellen, die Originalquelle und die vom Tool generierte Quelle. Sie müssen also darauf achten, dass die beiden Dateien synchron bleiben. Nachdem ich einige Änderungen an der Quelle vorgenommen hatte, vergaß ich, die Änderungen in der Messquelle wiederzugeben, und musste den Test mehrmals wiederholen. Außerdem musste die mysteriöse Swing-Anwendung ausgeführt werden, um die Abdeckung zu messen, was schwer und ärgerlich war. Selbst wenn die Swing-Anwendung nicht gestartet wurde, funktionierte sie normal (es funktioniert, aber die Abdeckung wird nicht gemessen), sodass ich es später bemerkte und den Test wiederholen musste. Auf diese Weise mussten wir Tools verwenden, die nicht einfach zu verwenden waren, und wir waren weniger produktiv.

Was soll ich machen

Um ehrlich zu sein, bin ich nicht mit Tools zur Messung der Abdeckung vertraut, aber ich denke, ich hätte JaCoCo oder ein bekanntes Tool anstelle des Oleore-Tools verwenden sollen, das nur intern verwendet wird. Das derzeit an meinem Arbeitsplatz verwendete Tool zur Messung der Abdeckung ist JaCoCo, aber ich glaube nicht, dass es einen Prozess gab, der einen Unfall auslösen würde, z. B. das Einbetten des Messcodes auf der Ebene des Quellcodes. Es ist vielmehr üblich, die Abdeckung während der UT-Ausführung zu messen, nicht während manueller Tests. Erstens kann es ein Problem sein, dass UT überhaupt nicht geschrieben ist. [^ no_ut] [^ no_ut]: Das Fehlen eines UT ist definitiv ein Problem, aber aus Sicht der Abdeckungsmessung ist es dasselbe.

Personen, die jeweils eine Datei mit SVN festschreiben

Dies ist auch ein Rätsel, aber Sie kamen, diese Art von Person. Es ist mühsam, sich den Fixverlauf anzusehen, denn obwohl es sich um einen einzelnen Fix handelt, sind die Commits auf mehrere verteilt (nicht zwei oder drei, sondern viele). Möglicherweise ist die Bedeutung des Versionsverwaltungssystems nicht genau bekannt, und es handelt sich lediglich um einen Mechanismus, mit dem jeder die Quelle gemeinsam nutzen kann. Das ist immer noch eine gute Sache, und einige wilde Leute verlassen ihre Plätze, obwohl sie nicht alles begangen haben. Wenn Sie in der Zwischenzeit auschecken, werden Sie natürlich halb gebacken und leiden unter anhaltenden Kompilierungsfehlern.

Was soll ich machen

Ich habe keine andere Wahl, als Ihnen zu sagen, was das Versionsverwaltungssystem ist und wie sich das oben beschriebene Verhalten darauf auswirkt. Es ist ein Ärger, weil ich von einer anderen Firma oder einem Senior in meiner Firma bin ... (* Nicht mein aktueller Arbeitsplatz)

Am Ende

Obwohl es sich um einen Code handelt, ist er zu einem Chaos geworden, da er andere Inhalte als den Code enthält. Ich würde mich jedoch freuen, wenn es einen hilfreichen Artikel gibt.

Recommended Posts

Ich hasse diese Art von Code! Eine Sammlung von Anti-Mustern, die tatsächlich auf dem Feld zu sehen sind
Beispielcode zum Zuweisen eines Werts in der Eigenschaftendatei zu einem Feld des erwarteten Typs
Ich habe das Problem der älteren Schwester tatsächlich im Code ausgedrückt und berechnet
Messen Sie die Größe eines Ordners mit Java
Ich habe viel über "Prinzipien des Systemdesigns, die auf diesem Gebiet nützlich sind" gelernt und sie daher zusammengefasst ~ Kapitel 1 ~
RSpec-Sammlung, die ich häufig verwendet habe
[Active Admin] Ich möchte den Umfang der Sammlung angeben, die in select_box angezeigt werden soll
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
Eine Überprüfung des von Rails-Anfängern verwendeten Codes
Ich habe den lesbaren Code gelesen, machen Sie sich also eine Notiz
Ich habe ein Sequenzdiagramm des j.u.c.Flow-Beispiels geschrieben
Ich steckte in einem Klon eines zweidimensionalen Arrays fest
Als ich zu IntelliJ wechselte, gab es einen großen Unterschied in der Codierung der Eigenschaftendatei.