Erstaunliche Java-Programmierung (hören wir auf)

Einführung

Es gibt das Wort "Überraschungsminimumprinzip".

Zitieren eines Wikipedia-Artikels http://ja.wikipedia.org/wiki/%E9%A9%9A%E3%81%8D%E6%9C%80%E5%B0%8F%E3%81%AE%E5%8E%9F%E5%89%87

Wenn beim Design und der Ergonomie von Benutzeroberflächen und Programmiersprachen die beiden Elemente einer Benutzeroberfläche inkonsistent oder unklar sind, ist das Verhalten für einen menschlichen Benutzer oder Programmierer am natürlichsten (weniger überraschend) Die Idee ist, dass Sie wählen sollten.

Kurz gesagt, es ist besser, weniger Überraschungen bei der Verwendung zu haben [1]. [1]: Es gibt ziemlich viele Situationen, in denen ich mich frage, welche weniger überraschend ist ...

In diesem Artikel werde ich es wagen vorzustellen, wie man überraschend viele Programme schreibt. Erleben Sie, wie es sich anfühlt, ein überraschendes Programm zu lesen. Natürlich ist es besser, ein Programm zu schreiben, das weniger überraschend ist. Kopieren Sie es also nicht, oder?

Überraschen Sie mit der Codierung

Nicht-Kamel-Fall

In Java ist es üblich, den Kamelfall zu verwenden (ohne Konstanten). Wenn Sie es brechen, werden alle überrascht sein.

public class db_manager {
    private String connection_url;
    
    public void Init(){
・ ・ ・
    }
・ ・ ・
}

Seriennummer Name

Verwalten Sie Klassennamen, Methodennamen und sogar Feldnamen gründlich, um Seriennummern zu erstellen. Die Auswirkung, dass der Inhalt aus dem Namen nicht vorstellbar ist, ist ziemlich groß.

public class UC8010 extends CMN0101 {
    private String FLD0001;
    
    public int MTD0001() {
・ ・ ・
    }
・ ・ ・
}
publi class UC8020 extends CMN0101 {
    private String FLD0001;
    
    public int MTD0001() {
・ ・ ・
    }
・ ・ ・
}

Flagge

Jeder ist überrascht, wenn der Name des Flags einen anderen Wert als true, false oder 0,1 enthält.

String modeFlag = getFlag();
switch(modeFlag) {
    case "LOGIN":
・ ・ ・
    case "LOGOFF"
・ ・ ・
}

Es ist auch eine gute Idee, den Namen und das Verhalten der Flags umzukehren.

if (skipFlag == true) {
    execute();
}

Mach etwas, das nicht im Namen steht

Lassen Sie uns Dinge tun, die nicht im Namen geschrieben sind. Das folgende Beispiel ist eine Methode, die vorgibt, eine Methode zu sein, die den Wert überprüft. Wenn das Ergebnis in Ordnung ist, wird die nachfolgende Verarbeitung fortgesetzt. Bist du überrascht?

boolean checkValue(int value) {
   if (value == -1) {
      return false;
   }
   execute(value);
   return true;
}

Namen, die wahrscheinlich nicht relevant sind

Wenn Sie eine Schnittstelle namens IFHoge und eine Klasse namens Hoge haben, denke ich, dass jeder "Hoge implementiert IFHoge" ist. Es macht Spaß, sich nur das Gesicht der anderen Person vorzustellen, wenn sie dort betrogen wird.

public interface IFHoge {
    void someMethod()
}
public class Hoge {
   //Es hat nichts mit IFHoge zu tun
}

Schreiben Sie einen Kommentar, den Sie sehen können

Wenn Sie dem selbsterklärenden Prozess einen Kommentar hinzufügen, werden Sie überrascht sein, wie höflich er ist.

int time = endTime - startTime; //endTime to time-Ersetzen Sie startTime

Japanischer Übersetzungskommentar des Namens

Es ist zu üblich, in einem Kommentar zu schreiben, was es tut, was es sein soll, welche Vorsichtsmaßnahmen zu treffen sind und so weiter. Konzentrieren wir uns daher auf die japanische Übersetzung des Namens in den Kommentaren. Ich bin überrascht, dass "ich nichts geschrieben habe, was ich wissen möchte!"

/*
 *Wertprüfung
 */
booelan checkValue() {
・ ・ ・
}

Lüge Kommentar

Offensichtlich bin ich überrascht, dass das, was ich in den Kommentaren sage, sich von dem unterscheidet, was ich tatsächlich tue.

Es ist schwierig, offen mit neuem Code zu lügen. Die Möglichkeit besteht darin, dass das System überholt wird. Wenn Sie den Quellcode neu schreiben, lassen Sie die Kommentare der Originalquelle unverändert, ohne sie zu aktualisieren. In einem Augenblick werden Kommentare und Verarbeitung getrennt.

if (mode == STANDBY) {
   //Tun Sie im Standby-Modus nichts und kehren Sie sofort zurück
   standbyService.execute();
}

Breiter Anwendungsbereich

Um viele Menschen zu überraschen, wird die Geschichte erst beginnen, wenn viele Menschen sie sehen. Lassen Sie uns die Öffentlichkeit aktiv nutzen. Je breiter der Umfang, desto besser.

public void publicMethod() {
    innerMethod();
}

public void innerMethod() {
    //Etwas zu verarbeiten
}

Wenn Sie die Möglichkeit haben, eine Klasse zu erben, ist es hilfreich, die Sichtbarkeit der Methode für die Öffentlichkeit zu erhöhen.

Verwenden Sie, was Sie verwenden können

Im Gegenteil, wenn Sie etwas verwenden können, das Sie auf den ersten Blick nicht verwenden sollten, verwenden Sie es. Lassen Sie es uns auch mit privaten APIs und veralteten Klassen und Methoden aktiv verwenden. Es ist eine Verschwendung. Der Autor ist erstaunt, wie unerwartet es verwendet wird.

 sun.misc.BASE64Encoder e = new sun.misc.BASE64Encoder();
 String encoded = e.encode(buf);

Betrachtung

Gut gestalteter Code ist gut gekapselt und darf nicht von alleine berührt werden. Es ist also Reflexion. Es ist keine Übertreibung zu sagen, dass Reflexion existiert, um Menschen zu überraschen, außer in ernsten Situationen wie der Schaffung von Rahmenbedingungen.

Class c = obj.getClass();
Field f = c.getField("counter");
f.setInt(obj, 0);   //Setzen Sie den Zähler auf Null zurück

Vererbung, die nicht is-a ist

Je nachdem, wie Sie die Vererbung verwenden, werden Sie sehr überrascht sein.

Angenommen, die DB-Verarbeitung wird als DBStrategy abstrahiert, um die Verarbeitung abhängig vom DB-Typ zu wechseln. Die Verarbeitung jeder Datenbank erfolgt durch Implementierung dieser Schnittstelle.

interface DBStrategy {
・ ・ ・
}
class MySQLStrategy implements DBStrategy {
・ ・ ・
}
class SQLServerStrategy implements DBStrategy {
・ ・ ・
}

Nach der Implementierung habe ich festgestellt, dass MySQL Strategy und SQL Server Strategy viele ähnliche Prozesse haben.

In einem solchen Fall erstellen wir eine SQL Server-Strategie, die die MySQL-Strategie wie folgt erbt, und programmieren nur die Unterschiede. Jeder denkt "das !?" Dies liegt daran, dass es sich nicht um "SQL Server ist MySQL" handelt.

interface DBStrategy {
・ ・ ・
}
class MySQLStrategy implements DBStrategy {
・ ・ ・
}
class SQLServerStrategy extends MySQLStrategy  {
・ ・ ・
}

Sie werden nicht überrascht sein, wenn Sie es wie folgt schreiben.

interface DBStrategy {
・ ・ ・
}
abstract class AbstractDbStrategy implements DBStrategy {
・ ・ ・
}
class MySQLStrategy extends AbstractDbStrategy {
・ ・ ・
}
class SQLServerStrategy extends AbstractDbStrategy {
・ ・ ・
}

Niedergeschlagen

Wenn Sie eine konkrete Klasse wollen, lassen Sie uns aktiv niederschlagen. Natürlich ist es besser, nicht so oft wie möglich eine Typprüfung durchzuführen. Außerdem ist keine Neugestaltung erforderlich. Später werden einige Leute überrascht sein, dass sie die konkrete Klasse nicht wechseln können.

public void execute(DBStrategy strategy) {
    MySQLStrategy mySqlStrategy = (MySQLStrategy)strategy;
・ ・ ・
}

Dichte Abhängigkeit

Lassen Sie uns aktiv von anderen Klassen abhängen. Je komplizierter es ist, desto besser. Wenn Sie damit herumspielen, wird es kaputt gehen und Sie können es nicht abhängig davon reparieren. Kein Test. Wenn Sie nicht so sehr darauf bestehen, werden Sie nicht überrascht sein.

Crushing Ausnahmen

Hier sind die Grundlagen der Grundlagen. Es ist keine Übertreibung zu sagen, dass Sie von hier aus beginnen, wenn Sie Menschen überraschen möchten. Das resultierende System verhält sich seltsam und überrascht den Benutzer, und der Bediener ist auch überrascht, weil das Debuggen schwierig ist, weil der fehlerhafte Standort nicht identifiziert werden kann.

try {
    someService.execute();
} (SomeServiceException e) {
    //Ich bin mir nicht sicher, also drück es
}

Werfen Sie die zugrunde liegende Ausnahme weg

Es gibt eine etwas fortgeschrittenere Möglichkeit, die zugrunde liegende Ausnahme wegzuwerfen. Lassen Sie uns die Root-Ausnahme wegwerfen, wenn Sie eine Ausnahme abfangen, in eine andere Ausnahme konvertieren und höher werfen.

try {
    someService.execute();
} (SomeServiceException e) {
    throw new SystemException();
    // throw new SystemException(e); //← Das ist nicht überraschend
}

Wenn Sie dies tun, wird die zugrunde liegende Ausnahme nicht im Protokoll angezeigt, wenn ein Fehler auftritt, sodass Sie ihr nicht mehr folgen können. Diejenigen, die debuggen, sind sehr überrascht.

Fang Ausnahmen, die nicht behandelt werden sollten

Es gibt Ausnahmen, die aufgrund von Codierungsfehlern auftreten. Ein typisches Beispiel ist NullPointerException. Es ist eine Faustregel, diese Ausnahmen so zu codieren, dass sie gar nicht erst auftreten. Lassen Sie uns sie jedoch abfangen und behandeln. Es gibt viele Menschen, die überrascht sind, weil sich die Entdeckung seltsamer Situationen verzögert.

try {
    someService.execute();
} catch(NullPointerException e) {
    //Lass mich erholen
}

Mach es so gut wie möglich

Geben Sie dem Objekt so viel Zustand wie möglich. Ist es nicht interessant, eine Welt zu haben, in der jedes Mal, wenn Sie anrufen, das gleiche Ergebnis garantiert wird?

Ignorieren Sie die Hash-Code-Anforderungen

Wenn Sie in Java die Object # equals () -Methode überschreiben, müssen Sie auch die Object # hashCode () -Methode korrekt überschreiben. Dies ist eine Voraussetzung für die Verwendung von Hashtable und HashMap. Ich habe nicht vor, diese Klasse in HashMap einzufügen. Wenn Sie also denken, dass Sie es sollten, ignorieren Sie sie. Der Tag wird kommen, an dem Sie überrascht sein werden: "Huh? Haben Sie es in HashMap eingefügt? Es funktioniert nicht!"

Überraschung im Test

Keine automatisierten Tests

Es ist mittlerweile üblich, automatisierte Tests mit Tools wie JUnit und Selenium durchzuführen. Projektmitglieder werden überrascht sein, wenn sie diese Dinge nicht tun.

100% Deckung

Wenn Sie wirklich automatisierte Tests durchführen möchten, stellen Sie sicher, dass Sie eine 100% ige Testabdeckung anstreben. Die Mitglieder werden vom Ziel selbst überrascht sein, und Sie werden überrascht sein, dass sich die Qualität nicht verbessert, da Sie gezwungen sind, Tests nur zur Berichterstattung zu schreiben.

Überraschung mit dem Management

Verstecke den Code, den du schreibst, so wenig wie möglich

Anderen den Code zu zeigen bedeutet, mehr Informationen zu geben. Um die Überraschung der anderen Partei zu maximieren, sollte sie zu diesem Zeitpunkt ohne vorherige Information ausgestellt werden. Versuchen Sie aus diesem Grund, die Wahrscheinlichkeit zu minimieren, dass Ihr Code anderen angezeigt wird.

Verlaufsverwaltung manuell

Verwalten Sie Ihre alten Quellen im Datumsordner. Kommentieren Sie natürlich den geänderten Teil des Quellcodes aus, lassen Sie ihn in der Quelle und fügen Sie das Datum und den Firmennamen hinzu.

Wenn Sie dies sehen, können Sie eine überraschende Erfahrung machen, als ob Sie in der Edo-Zeit plötzlich in der Zeit verrutscht wären.

Manuell erstellen

Die Erstellung erfolgt manuell. Wenn Sie einen Fehler machen, automatisieren Sie ihn nicht. Es ist besser, keine Erstellungsprozedur durchzuführen, wenn dies zulässig ist. Als letzten Schliff ist es am besten, ein Glas unbekannter Herkunft in den lib-Ordner zu legen. Der Nachfolger wird überrascht sein.


Verweise


Endlich ein kleiner Schlangenfuß

Ursprünglich begann dieser Artikel mit dem folgenden Satz unter dem Namen "Amazing Java Programming".

Bloße Programmierung ist langweilig. Ich möchte etwas tun, das alle überrascht. Eine Sammlung verschiedener Tipps, die in solchen Fällen verwendet werden können.

Zum Glück wurde es von mehr Leuten gelesen, als ich mir vorgestellt hatte, und viele Leute sagten, es sei interessant.

Auf der anderen Seite sagten einige Leute: "Ich habe diesen Artikel in der Hoffnung geöffnet, ihn wirklich zu überraschen, aber ich war enttäuscht" und "Ich mache mir Sorgen, ob jemand ihn wirklich erhalten wird." Mit anderen Worten, es war ein bumerischer Staat, dass der Artikel selbst, der versuchte, das "Prinzip der minimalen Überraschung" anzusprechen, Überraschungen enthielt. Tohoho ...

Ich fand den Staat ironisch und interessant, wollte aber eindeutig auf dem "Prinzip der minimalen Überraschung" bestehen, also machte ich es zum aktuellen Format.

Recommended Posts

Erstaunliche Java-Programmierung (hören wir auf)
Lassen Sie uns Java studieren
Grundlagen der Java-Programmierung
Java Generische Programmierung
Einschränkungsprogrammierung in Java
Java-Programmiergrundlagen Übungsarray
Java-Programmierung (Klassenmethode)
Lass uns mit Java kratzen! !!
Java-Programmierung (Klassenstruktur)
Programmiernotiz für Java-Wettbewerbe
Java Programming Thread Runnable
Experimentieren wir mit der Java-Inline-Erweiterung
Java-Programmierung (Variablen und Daten)
Lassen Sie uns Excel mit Java betreiben! !!
Java Development Basics-Practice ③ Fortgeschrittene Programmierung-
Grundlagen der Java-Programmierung Practice-for-Anweisung
Grundlagen der Java-Programmierung Practice-Switch-Anweisung
[Java] Grundbegriffe der Programmierung
Beginnen wir mit der parallelen Programmierung
Wettbewerbsfähige Programmierung privater Spickzettel (Java)
Verwenden wir Twilio in Java! (Einführung)
Java Function Programming Exercise Book --zipWith-
Einführung in die funktionale Programmierung (Java, Javascript)
[Vollständige Programmierung] §3 Berechnen wir mit Ruby!
Zusammenfassung der objektorientierten Programmierung mit Java
Lassen Sie uns darüber nachdenken, was deklarative Programmierung in Java und Elm ist (Teil 1).