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?
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(){
・ ・ ・
}
・ ・ ・
}
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() {
・ ・ ・
}
・ ・ ・
}
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();
}
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;
}
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
}
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
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() {
・ ・ ・
}
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();
}
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.
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);
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
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 {
・ ・ ・
}
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;
・ ・ ・
}
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.
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
}
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.
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
}
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?
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!"
Es ist mittlerweile üblich, automatisierte Tests mit Tools wie JUnit und Selenium durchzuführen. Projektmitglieder werden überrascht sein, wenn sie diese Dinge nicht tun.
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.
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.
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.
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.
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