Wie gehe ich mit dem Typ um, den ich 2 Jahre lang über das Schreiben eines Java-Programms nachgedacht habe?

Wie gehe ich mit dem Typ um, den ich in Java denke?

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.

Vorwort

Fazit

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.

Inhaltsverzeichnis

Was ist statische Typisierung?

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.

Umgang mit statischer Eingabe

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.

Geben Sie den Daten einen Sinn.

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.

Bei Verwendung des primitiven Typs wie er ist

String phoneNumber = "000-0000-0000";

Wenn Sie einen von Ihnen definierten Typ verwenden

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

Sichere programmbasierte Programmierung.

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;
  }
}

Geben Sie dem Verhalten Einschränkungen und Bedeutungen

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];
  }
}

Beiseite

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;
}

schließlich

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.

Recommended Posts

Wie gehe ich mit dem Typ um, den ich 2 Jahre lang über das Schreiben eines Java-Programms nachgedacht habe?
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
So reduzieren Sie die Programmlast ein wenig, wenn Sie Zeichen mit JAVA kombinieren
Ich habe versucht, ein Programm in Java zu erstellen, das das Problem des Handlungsreisenden mit einem genetischen Algorithmus löst
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
Über das Verfahren, damit Java funktioniert
[Einführung in Java] So schreiben Sie ein Java-Programm
So interagieren Sie mit einem Server, der die App nicht zum Absturz bringt
Deklarieren Sie eine Methode mit einem Java-Rückgabewert mit dem Rückgabewert-Datentyp
[Java] So drehen Sie ein zweidimensionales Array mit einer erweiterten for-Anweisung
Eine Geschichte, die ich mit der Stream-API von Java8 einem Prozess schreiben wollte, der einer while-Anweisung entspricht
[Java] So testen Sie, ob es in JUnit null ist
[Java] (für MacOS) Methode zur Einstellung des Klassenpfads
Ich habe versucht, den Block mit Java zu brechen (1)
Bis Sie ein Java-Programm mit dem für Windows lokalen AWS SDK ausführen
(Java) Implementieren von equals () für eine Klasse mit durch Vererbung hinzugefügten Wertelementen
Diätprogramm mit Präprozessor (Umgang mit der Größe von i-appli)
java: Wie schreibe ich eine generische Typliste? [Hinweis]
Umgang mit Keine Vorlage für interaktive Anfragen
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
Wie erstelle ich einen MOD für Slay the Spire?
[Azure] Ich habe versucht, eine kostenlose Java-App zu erstellen ~ Mit FTP verbinden ~ [Anfänger]
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
Umgang mit dem Fehler yaml.scanner.ScannerError: Beim Scannen nach dem nächsten Token, das beim Erstellen einer Rails-Umgebung mit Docker angezeigt wurde
Ich möchte eine generische Anmerkung für einen Typ erstellen
Java: Eine Geschichte, in der ich mich unwohl fühlte, als mir beigebracht wurde, Strings ohne Grund mit Gleichen zu vergleichen.
Ich möchte eine Schleife schreiben, die auf einen Index mit der Stream-API von Java 8 verweist
Wie man Arrays mit Java stapelweise initialisiert, wusste ich als Anfänger nicht
Ein Memo des Programms, mit dem Sie feststellen können, dass die Wahrscheinlichkeit eines Würfelwurfs etwa 1/6 beträgt
Implementierung einer starken API für "Ich möchte ~~ auf dem Bildschirm anzeigen" mit einfachem CQRS
[Java] Ich habe versucht, ein Janken-Spiel zu erstellen, das Anfänger auf der Konsole ausführen können
So machen Sie einen Screenshot mit dem Android Studio-Emulator
Java-Programm zum Ändern der Größe eines Fotos in ein Quadrat mit Rändern
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
So erstellen Sie ein leichtes Container-Image für Java-Apps
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Umgang mit dem Fehler FEHLER: Während der Ausführung von gem ... (Gem :: FilePermissionError)
Informationen zum Verhalten beim Erstellen einer Dateizuordnung mit Java
Untersucht, wie Dienste mit Watson SDK für Java aufgerufen werden
Eine Geschichte über Missverständnisse im Umgang mit Java-Scannern (Memo)
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.
Es ist keine große Sache, wenn Sie verstehen, dass ich süchtig danach war, E-Mails mit Java Mail von Exchange Online zu empfangen
Umgang mit dem Ereignis, dass Committee :: InvalidRequest während des Rspec-Datei-Upload-Tests im Committee auftritt
Mechanismus zum Konvertieren in eine Sprache, die der Browser erkennen kann
Ich dachte darüber nach, wie ich Swifts willSet richtig einsetzen sollte.
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
So implementieren Sie einen Job, der die Java-API in JobScheduler verwendet