Inhaltsverzeichnis
2. Offener/geschlossenes Prinzip (OCP)
3. Liskov Substitution Prinzip (LSP)
4. Prinzip der Schnittstellensegregation (ISP)
5. Abhängigkeitsinversionsprinzip (DIP)
Letzte Gedanken
Heim Java javaLernprogramm Die soliden Prinzipien für Java -Entwickler erklärt

Die soliden Prinzipien für Java -Entwickler erklärt

Jul 26, 2025 am 05:16 AM
java Solides Prinzip

Für das Prinzip (einzelne Verantwortung "(SRP) muss eine Klasse nur für eine Funktion verantwortlich sein, z. 2. Das Öffnungs- und Schlussprinzip (OCP) erfordert das Öffnen und Schließen für Erweiterungen und Schließen für Modifikationen, z. B. das Hinzufügen neuer Grafiken über die Formoberfläche ohne Änderung des Taschenrechners. 3. Das Richter Ersatzprinzip (LSP) erfordert, dass Unterklassen die übergeordnete Klasse ersetzen können, ohne das Programm zu zerstören, z. 4. Das Interface-Isolationsprinzip (ISP) erfordert, dass Clients nicht auf unerwünschten Schnittstellen stützen sollten, z. 5. Das Abhängigkeitsinversionsprinzip (DIP) erfordert, dass hochrangige Module nicht auf Modulen auf niedriger Ebene beruhen, und beide stützen sich auf Abstraktionen, wie z. Diese fünf Prinzipien verbessern gemeinsam die Wartbarkeit, Erweiterbarkeit und Testbarkeit des Java -Code.

Die soliden Prinzipien für Java -Entwickler erklärt

Die soliden Prinzipien sind eine Reihe von fünf Designprinzipien, mit denen Software-Designs verständlicher, flexibler und wartbarer werden sollen-insbesondere in der objektorientierten Programmierung. Bei Java -Entwicklern hilft das Aufbringen von Solid -Aufbau von Systemen, die leichter zu erweitern, zu testen und zu reflektieren sind. Lassen Sie uns jedes Prinzip mit praktischen Java -Beispielen und klaren Erklärungen aufschlüsseln.

Die soliden Prinzipien für Java -Entwickler erklärt

1. Prinzip der Einzelverantwortung (SRP)

Eine Klasse sollte nur einen Grund haben, sich zu ändern.

Mit anderen Worten, eine Klasse sollte für einen einzelnen Teil der Funktionalität der Anwendung verantwortlich sein. Wenn eine Klasse mehrere Aufgaben erledigt, kann das Ändern des anderen das andere brechen.

Die soliden Prinzipien für Java -Entwickler erklärt

Beispiel (Verstoß):

 öffentliche Klasse Orderprozessor {
    public void ProcessOrder (Order Order) {
        // Bestellung in der Datenbank speichern
        Savetodatabase (Order);

        // Bestätigungs -E -Mail senden
        sendemail (order.getCustomeremail ());
    }

    private void Savetodatabase (Bestellauftrag) { / * ... * /}
    private void sendemail (String -E -Mail) { / * ... * /}
}

Hier übernimmt OrderProcessor beide Datenpersistenz und Kommunikation - zwei Verantwortlichkeiten.

Die soliden Prinzipien für Java -Entwickler erklärt

Refactored (SRP -konform):

 öffentliche Klasse OrderRepository {
    public void save (Order Order) { / * ... * /}
}

öffentliche Klasse Emailservice {
    public void sendConfirmation (String -E -Mail) { / * ... * /}
}

öffentliche Klasse Orderprozessor {
    private orderRepository repository;
    privater E -Mail -Service -E -Mail -Service;

    public void ProcessOrder (Order Order) {
        repository.save (order);
        EmailService.SendConfirmation (order.getCustomeremail ());
    }
}

Jetzt hat jede Klasse einen einzigen Job. Änderungen an der E -Mail -Logik haben keinen Einfluss auf das Speichern von Daten.


2. Offener/geschlossenes Prinzip (OCP)

Softwareentitäten sollten für die Erweiterung geöffnet sein, jedoch zur Änderung geschlossen werden.

Sie sollten in der Lage sein, neue Funktionen hinzuzufügen, ohne den vorhandenen Code zu ändern.

Beispiel (Verstoß):

 public class AreaCalculator {
    public double calculatearea (list <Object> formes) {
        doppeltes Gesamt = 0;
        für (Objektform: Formen) {
            if (Forminstanz des Kreises) {
                Kreis C = (Kreis) Form;
                Total = math.pi * C.Radius * C.Radius;
            } else if (Forminstanz von Rechteck) {
                Rechteck r = (Rechteck) Form;
                insgesamt = R. Width * r.height;
            }
        }
        Return Total;
    }
}

Jedes Mal, wenn Sie eine neue Form hinzufügen, müssen Sie diese Methode ändern.

Refactored (OCP -konform):

 öffentliche Schnittstellenform {
    doppelte Fläche ();
}

Der öffentliche Klassenkreis implementiert Form {
    privates Doppelradius;
    public Double Area () {return math.pi * radius * radius; }
}

öffentliche Klasse Rechteck implementiert Form {
    private doppelte Breite, Höhe;
    public Double Area () {Return Width * Höhe; }
}

public class AreaCalculator {
    public double calculatearea (list <Sape> formes) {
        return forces.stream ()
                     .Maptodouble (Form :: Bereich)
                     .Summe();
    }
}

Jetzt können Sie neue Formen (z. B. Dreieck) hinzufügen, ohne AreaCalculator zu berühren.


3. Liskov Substitution Prinzip (LSP)

Subtypen müssen durch ihre Grundtypen ersetzt werden, ohne die Richtigkeit des Programms zu ändern.

Wenn eine Klasse von einem anderen erbt, sollte sie das erwartete Verhalten nicht brechen.

Beispiel (Verstoß):

 öffentliche Klasse Rechteck {
    geschützte intbreite, Höhe;

    public void setwidth (int width) {this.width = width; }
    public void Seteight (int Höhe) {this.height = Höhe; }

    public int getArea () {Return Width * Höhe; }
}

Der öffentliche Klasse Square erweitert Rechteck {
    @Override
    public void setwidth (int width) {
        Super.Setwidth (Breite);
        Super.SetHeight (Breite);
    }

    @Override
    public void Seteight (int Höhe) {
        Super.SetHeight (Höhe);
        Super.Setwidth (Höhe);
    }
}

Wenn eine Methode nun ein Rectangle erwartet und die Breite und Höhe unabhängig voneinander setzt, bricht ein Square diese Annahme.

Besserer Ansatz: Vermeiden Sie die Vererbung, wenn Verhaltensverträge gewalttätig sind. Verwenden Sie Komposition oder separate Hierarchien.

 öffentliche Schnittstellenform {
    int Area ();
}

öffentliche Klasse Rechteck implementiert Form {
    Private int Breite, Größe;
    // Setzer und Bereich ()
}

Public Class Square implementiert Form {
    private int Seite;
    // Area = Seite * Seite
}

Jetzt keine irreführende Erbschaft. LSP ist erhalten.


4. Prinzip der Schnittstellensegregation (ISP)

Kunden sollten nicht gezwungen sein, sich auf Schnittstellen zu verlassen, die sie nicht verwenden.

Big, monolithische Schnittstellen machen Klassen implementieren Methoden, die sie nicht benötigen.

Beispiel (Verstoß):

 öffentliche Schnittstellenmaschine {
    void print ();
    void scan ();
    void fax ();
}

öffentliche Klasse OldPrinter implementiert Maschine {
    public void print () {System.out.println ("Druck"); }
    public void scan () {neue nicht unterstützte OperationException () werfen; }
    public void fax () {neue nicht unterstützte OperationException () werfen; }
}

OldPrinter ist gezwungen, irrelevante Methoden zu implementieren.

Refactored (ISP -konform):

 Öffentlicher Schnittstellendrucker {
    void print ();
}

öffentlicher Schnittstellenscanner {
    void scan ();
}

öffentliche Schnittstelle Faxmachine {
    void fax ();
}

öffentliche Klasse OldPrinter implementiert Drucker {
    public void print () {System.out.println ("Druck"); }
}

öffentliche Klasse MultifunktionDevice implementiert Drucker, Scanner, Faxmachine {
    public void print () { / * ... * /}
    public void scan () { / * ... * /}
    public void fax () { / * ... * /}
}

Jetzt implementieren Klassen nur das, was sie unterstützen.


5. Abhängigkeitsinversionsprinzip (DIP)

Auf hohen Modulen sollten nicht von Modulen auf niedrigem Niveau abhängen. Beide sollten von Abstraktionen abhängen.

Außerdem: Abstraktionen sollten nicht von Details abhängen. Details sollten von Abstraktionen abhängen.

Dies ermöglicht eine lose Kopplung und einfachere Tests.

Beispiel (Verstoß):

 öffentliche Klasse orderService {
    private mySqldatabase database = new mySqldatabase ();

    public void Saveorder (Bestellung) {
        Datenbank.Save (Order);
    }
}

OrderService ist eng mit MySQLDatabase gekoppelt. Datenbanken schwer zu testen oder zu wechseln.

Refactored (dip konform):

 öffentliche Schnittstellendatenbank {
    void Save (Bestellung);
}

öffentliche Klasse Mysqldatabase implementiert die Datenbank {
    public void save (Order Order) { / * ... * /}
}

öffentliche Klasse orderService {
    private Datenbankdatenbank;

    public orderService (Datenbankdatenbank) {
        this.database = Datenbank;
    }

    public void Saveorder (Bestellung) {
        Datenbank.Save (Order);
    }
}

Jetzt hängt OrderService von der Database ab. Sie können jede Implementierung injizieren (MySQL, PostgreSQL, Mock usw.).

Mit Abhängigkeitsinjektionsrahmen (wie Frühling) wird dies noch leistungsfähiger.


Letzte Gedanken

Solide Prinzipien sind keine starre Regeln - sie sind Richtlinien, mit denen Sie sauberer und gepflegterer Java -Code schreiben können. Wenn Sie sie früh anwenden, können Sie später vor technischen Schulden ersparen.

  • SRP : Ein Job pro Klasse.
  • OCP : Erweitern, nicht ändern.
  • LSP : Unterklassen sollten die Benutzer nicht überraschen.
  • ISP : Kleine, fokussierte Schnittstellen.
  • Dip : Abhängig von Abstraktionen, nicht von Beton.

Sie könnten zunächst wie Overkill fühlen, insbesondere in kleinen Projekten. Wenn Ihre Codebasis jedoch wächst, werden diese Prinzipien zu wesentlichen Werkzeugen zur Verwaltung der Komplexität.

Wenn Ihre Java -Klassen schwer zu testen, zu ändern oder wieder zu verwenden, sind Chancen im Grunde genommen ein oder mehrere solide Prinzipien gewalttätig.

Das obige ist der detaillierte Inhalt vonDie soliden Prinzipien für Java -Entwickler erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Python -Überprüfung, ob der Schlüssel im Wörterbuch -Beispiel vorhanden ist Python -Überprüfung, ob der Schlüssel im Wörterbuch -Beispiel vorhanden ist Jul 27, 2025 am 03:08 AM

Es wird empfohlen, das Schlüsselwort in Schlüsselwort zu verwenden, um zu überprüfen, ob ein Schlüssel im Wörterbuch vorhanden ist, da es präzise, effizient und hoch lesbar ist. 2. Es wird nicht empfohlen, die GET () -Methode zu verwenden, um festzustellen, ob der Schlüssel vorhanden ist, da es falsch eingeschätzt wird, wenn der Schlüssel existiert, der Wert jedoch keine ist. 3.. Sie können die Keys () -Methode verwenden, aber sie ist überflüssig, da in Standardeinstellungen den Schlüssel überprüft wird. 4. Wenn Sie einen Wert erhalten und der erwartete Schlüssel in der Regel existiert, können Sie Try-Ocept verwenden, um die KeyError-Ausnahme zu fangen. Die am meisten empfohlene Methode ist die Verwendung des in Keywords sicher und effizienten und effizienten Keywords und nicht vom Wert von None, der für die meisten Szenarien geeignet ist.

Lesen von Stdin in Go durch Beispiel Lesen von Stdin in Go durch Beispiel Jul 27, 2025 am 04:15 AM

Verwenden Sie FMT.Scanf, um formatierte Eingaben zu lesen, die für einfache strukturierte Daten geeignet sind. Die Zeichenfolge wird jedoch bei der Begegnung von Räumen abgeschnitten. 2. Es wird empfohlen, bufio.scanner zum Lesen von Zeile für die Zeile zu verwenden, unterstützt Multi-Line-Ein-, EOF-Erkennung und Pipeline-Eingang und kann Scanfehler verarbeiten. 3. Verwenden Sie IO.Readall (OS.Stdin), um alle Eingaben gleichzeitig zu lesen, die für die Verarbeitung großer Blockdaten oder Dateiströme geeignet sind. 4. Echtzeit-Schlüsselantwort erfordert Bibliotheken von Drittanbietern wie golang.org/x/term, und Bufio reicht für herkömmliche Szenarien aus. Praktische Vorschläge: Verwenden Sie FMT.Scan für die interaktive einfache Eingabe, verwenden Sie bufio.scanner für die Linieneingabe oder -pipeline, verwenden

Die vollständige Anleitung zur Java `optionalen Klasse Die vollständige Anleitung zur Java `optionalen Klasse Jul 27, 2025 am 12:22 AM

Optional ist eine von Java 8 eingeführte Containerklasse, um potenziell Nullwerte sicherer zu behandeln, wobei der Kernzweck darin besteht, explizit "Wert fehlen" und das Risiko einer Nullpointerexception zu verringern. 1. Erstellen Sie eine leere Instanz mit optional.eMpty (), optional.of (value) wickeln nicht null-Werte und optional.ofnullable (value) sicher den Wert von Null. 2. Vermeiden Sie es, iSpresent () zu kombinieren und () direkt zu kombinieren. Sie sollten die Verwendung von Orelse () vorrangig machen, um Standardwerte bereitzustellen. Orelseget () implementiert die Verzögerungsberechnung. Diese Methode wird empfohlen, wenn der Standardwert über Kopf ist.

Optimierung der Datenbankinteraktionen in einer Java -Anwendung Optimierung der Datenbankinteraktionen in einer Java -Anwendung Jul 27, 2025 am 02:32 AM

UseconnectionpoolingwithhikaricptoreUsedatabaseConnections und Reduzedueverhead.2.BetchonlyRequiredDatabySelectingingSpecificcolumnsandAppingFiltersandpagination.4seBatchoperationStorStorstor

Java Cloud -Integrationsmuster mit Spring Cloud Java Cloud -Integrationsmuster mit Spring Cloud Jul 27, 2025 am 02:55 AM

Das Mastering SpringCloud -Integrationsmodell ist entscheidend für den Aufbau moderner verteilter Systeme. 1. Serviceregistrierung und Erkennung: Die automatische Registrierung und Entdeckung der Service wird durch Eureka oder Springcloudkubernetes realisiert, und das Ladungsausgleich wird mit einem Band oder LoadBalancer durchgeführt. 2. Konfigurationszentrum: Verwenden Sie SpringCloudConfig, um Konfigurationen mit mehreren Umwelt zentral zu verwalten, dynamische Belastungs- und Verschlüsselungsverarbeitung zu unterstützen. 3. API -Gateway: Verwenden Sie den SpringCloudgateway, um den Eingang, die Routing -Steuerung und die Berechtigungsverwaltung zu vereinen und die aktuelle Begrenzung und Protokollierung zu unterstützen. 4. Verteilte Link -Tracking: Kombinieren Sie Sleuth und Zipkin, um den vollständigen Prozess der Anfrage visueller Verfolgung zu erkennen.

SQL Serverless Computing -Optionen SQL Serverless Computing -Optionen Jul 27, 2025 am 03:07 AM

SQLServer selbst unterstützt keine serverlose Architektur, aber die Cloud -Plattform bietet eine ähnliche Lösung. Der serverlessSQL -Pool von Azure kann Datalake -Dateien direkt abfragen und basierend auf dem Ressourcenverbrauch berechnen. 2. Azurefunktionen in Kombination mit CosmosDB oder Blobstorage können eine leichte SQL -Verarbeitung realisieren. 3. Awsathena unterstützt Standard -SQL -Abfragen für S3 -Daten und die Gebühr basierend auf gescannten Daten. V. 5. Wenn Sie die SQLServer-Funktion verwenden müssen, können Sie den serverlosen Service-Free von Azuresqldatabase auswählen

Verständnis von Linux -Systemaufrufen Verständnis von Linux -Systemaufrufen Jul 27, 2025 am 12:16 AM

Systemaufrufe sind Mechanismen, bei denen Benutzerprogramme privilegierte Vorgänge über die Kernel -Schnittstelle anfordern. Der Workflow ist: 1. Benutzerprogramme Anrufverkapselungsfunktionen; 2. Setzen Sie Systemaufrufnummern und Parameter auf Register; 3.. Syscall -Anweisungen ausführen und in den Kernelstaat fallen; 4. Führen Sie die entsprechenden Verarbeitungsfunktionen in der Schecktabelle aus. 5. Kehren Sie nach Ausführung zum Benutzerstatus zurück. Sie können Strace Tool verwenden, um die Funktion syScall () direkt aufzurufen oder die Header -Datei in Unitd.h zu überprüfen, um die Anrufnummer anzuzeigen. Sie müssen beachten, dass der Unterschied zwischen Systemaufrufen und Bibliotheksfunktionen darin besteht, ob sie in den Kernelzustand eingeben und häufige Anrufe die Leistung beeinflussen. Sie sollten optimieren, indem Sie E/A zusammenführen, MMAP- und EPOLD -Methoden verwenden und Systemanrufe verstehen, hilft Ihnen dabei, den zugrunde liegenden Betriebsmechanismus von Linux zu beherrschen.

VSCODE -Setup für Java -Entwicklung VSCODE -Setup für Java -Entwicklung Jul 27, 2025 am 02:28 AM

InstallJDK,setJAVA_HOME,installJavaExtensionPackinVSCode,createoropenaMaven/Gradleproject,ensureproperprojectstructure,andusebuilt-inrun/debugfeatures;1.InstallJDKandverifywithjava-versionandjavac-version,2.InstallMavenorGradleoptionally,3.SetJAVA_HO

See all articles