Wir haben den Inhalt von LT zusammengefasst, der in der Vergangenheit unter Weekend Engineer angekündigt wurde.
Es ist zwei Jahre her, seit ich mit dem Programmieren angefangen habe, also habe ich zusammengefasst, worauf ich beim Programmieren normalerweise achte. Ich kann es von Zeit zu Zeit aktualisieren.
Wenn Sie in einer Form verwendet werden, verlieren Sie. Man kann sagen, dass die Macht statisch typisierter Sprachen nur genutzt werden kann, wenn man die Macht der Typen beherrscht.
Statische Typisierung bedeutet, dass in einem in einer Programmiersprache geschriebenen Programm die Arten von Variablen und Werten wie Unterprogrammargumente und Rückgabewerte im Voraus festgelegt werden, z. B. zur Kompilierungszeit, bevor das Programm ausgeführt wird. Es liegt in der Natur des Typsystems.
Wikipedia | Statische TypisierungAls
Dynamisch typisierte Sprachen wie JavaScript überprüfen den Typ beim Ausführen des Programms.
const str = 10;
const length = (str) => {
return str.length;
}
length(str);
// =>undefined wird zurückgegeben.
Im Vergleich dazu überprüfen statisch typisierte Sprachen die Typen, bevor sie ausgeführt werden. Auf Codeebene unterscheidet es sich von der dynamisch typisierten Sprache darin, dass es die Variablentypen, Funktionsformalargumente und Rückgabewerte deklariert.
Integer str = 10;
Integer length(String str) {
return str.length();
}
System.out.println(length(str));
// =>Zur Kompilierungszeit,Mit anderen Worten, vor der Ausführung tritt ein Fehler auf.
In letzter Zeit geben Redakteure manchmal Warnungen aus, selbst in dynamisch typisierten Sprachen wie JavaScript, aber ich denke, das liegt hauptsächlich an der statischen Syntaxanalysetechnologie.
Die statische Typisierung hat Nachteile. Es ist schwierig, den Typ der Variablen im Voraus anzugeben. Es ist auch schwierig, sie umzuwandeln (den Typ der Variablen zu konvertieren).
Ich weiß alles. Ich habe es auch getan. Aber ich habe kürzlich festgestellt, dass es darauf hinweist, dass ** ich selbst zum Tippen verwendet werde **. Statisch getippte Sprachen machen das Tippen aggressiver. Definieren Sie, ** Ich erkenne, dass die Vorteile nur kommen, wenn ich Typen verwende **.
Im Folgenden werde ich speziell schreiben, wie der Typ verwendet wird.
Sie können in Ihrem Programm mehr ausdrücken, indem Sie Ihre eigenen definierten Typen verwenden, als indem Sie primitive Typen wie "String" und "Int" verwenden.
String phoneNumber = "000-0000-0000";
PhoneNumber phoneNumber = new PhoneNumber("000-0000-0000");
Wenn Sie nur den Typ "String" verwenden, wissen Sie nur, dass die Variable ein String ist. Anhand der Variablen vom Typ PhoneNumber wie im zweiten Beispiel können Sie vorhersagen, welche Art von Zeichenfolge gespeichert ist, und Sie können sich auch vorstellen, welche Art von Methode aufgerufen werden kann. In diesem Fall glaube ich nicht, dass ich irgendetwas anrufen kann, aber lol
Die Details der Vertragsprogrammierung werden in den folgenden Artikeln ausführlicher beschrieben.
Was ich hier sagen möchte, ist, dass wir garantieren können, dass "weil es sich um eine Zeichenfolge in Form einer Telefonnummer handelt, nicht nur um eine Zeichenfolge, sich verhalten kann, ohne eine Ausnahme für einen bestimmten Befehl auszulösen". Es bedeutet, dass es Verdienste gibt.
In der folgenden Klasse wird beim Erstellen einer Instanz der PhoneNumber-Klasse geprüft, ob es sich um eine Zeichenfolge im Telefonnummernformat mit einem Bindestrich handelt, und eine Ausnahme ausgelöst. Paradoxerweise wird immer eine Variable vom Typ PhoneNumber verwendet. Der Typ kann garantieren, dass die Daten eine "Zeichenfolge im Telefonnummernformat mit Bindestrichen" haben.
/**
*Klasse, die eine Telefonnummer darstellt.
* String
*/
class PhoneNumber {
private static final Pattern pattern =
Pattern.compile("^0\\d{2,3}-\\d{1,4}-\\d{4}$");
private final String value;
/**
*Gibt eine Instanz eines neuen Telefonnummern-Typs zurück, der auf der im Argument angegebenen getrennten Telefonnummer basiert.
* @Parameter Wert Telefonnummer
* @Rückgabe vom Typ Telefonnummer
* @löst IllegalArgumentException aus Wenn das Argument etwas anderes als eine getrennte Telefonnummer ist
*/
PhoneNumber(String value){
Objects.requireNonNull(value);
if (!value.matches(pattern)) {
throw new IllegalArgumentException();
}
this.value = value;
}
String getValue() {
return this.value;
}
}
Für Typen, die von Sprachen wie dem String-Typ bereitgestellt werden, sind verschiedene Methoden und Funktionen definiert. Benötigen Sie wirklich alle?
Ist es angemessen, den Zeichencode abzurufen oder die Reihenfolge der Zeichenfolgen für die Telefonnummer umzukehren? Wagen Sie es, den Typ für die Telefonnummer zu definieren, indem Sie die Operationen an den Variablen einschränken und Fehler vermeiden. Es ist auch für.
Im Gegenteil, dies kann das Verhalten erhöhen. Es wird davon ausgegangen, dass Sie den lokalen Code der Telefonnummer erhalten. Wenn Sie eine Variable vom Typ String durch eine Telefonnummer ersetzen und verwenden, sieht das Programm wie folgt aus.
String phoneNumber = "000-0000-0000";
String cityCode = phoneNumber.split("-")[1];
Wenn Sie das Verhalten der Rückgabe des lokalen Codes an den Typ PhoneNumber definieren, lautet das Programm wie folgt.
PhoneNumber phoneNumber = new PhoneNumber("000-0000-0000");
String cityCode = phoneNumber.getCityCode();
class PhoneNumber {
private final String value;
//Abkürzung
String getCityCode() {
return value.split("-")[1];
}
}
Ich habe den Quellcode bisher ziemlich redundant geschrieben, aber in Wirklichkeit wird der Code mit den Anmerkungen von Lombok und Bean Validation codiert. Kann vereinfacht werden.
/**
*Klasse, die eine Telefonnummer darstellt.
* String
*/
@Value
class PhoneNumber {
@NotNull
@Pattern(regexp="^0\\d{2,3}-\\d{1,4}-\\d{4}$");
private final String value;
}
Bisher habe ich über eine ziemlich kleine Einheit (Telefonnummer) geschrieben, aber ich denke nicht, dass es notwendig ist, eine Form in dieser Einheit herzustellen. Die Herstellung einer Form in einer Einheit, die Konsistenz erfordert, ist ein großer Vorteil. In diesem Artikel werden alle Eingabewerte auf dem Bildschirm als Typ definiert und als Argument der Berechnungslogik verwendet. Einschränkungen und Garantien nach Typ und Konstruktor Ich hoffe, ich kann diese Methode weiterhin anwenden.