SOLID ist ein Akronym für die ersten fünf Prinzipien größten objektorientierten Designs (OOD) von Robert C. Martin. Diese Prinzipien legen Praktiken fest, die sich für die Entwicklung von Software eignen. Die Übernahme dieser Praktiken kann auch zur Vermeidung von Code Smells, Refactoring von Code und agiler oder adaptiver Softwareentwicklung beitragen. SOLID kann zu einen saubererer, wartbarerer und anpassungsfähigerer Codebasis führen. SOLID steht für:

  • S - Single Responsibility Prinzip (Prinzip der eindeutigen Verantwortlichkeit)
  • O - Open Closed Prinzip (Prinzip der Offen- und Verschlossenheit)
  • L - Liskovsches Substitutionsprinzip
  • I - Interface Segregation Prinzip (Prinzip der Schnittstellentrennung)
  • D - Dependency Inversion Prinzip (Abhängigkeit Umkehr Prinzip)

Die Objektorientierte Programmierung (OOP) wurde Ende der 1960er Jahre von der Programmierlegende Alan Kay geprägt. Wie der Name schon sagt, bezieht sich OOP auf Sprachen, die Objekte in der Programmierung verwenden (wie Java, Python, C#, C++, Visual Basic, JavaScript und PHP)OOP zielt darauf ab, reale Entitäten wie Vererbung und Polymorphismus in der Programmierung zu implementieren. Das Hauptziel von OOP besteht darin, die Daten und die damit arbeitenden Funktionen so zu verbinden, dass kein anderer Teil des Codes außer dieser Funktion auf diese Daten zugreifen kann. OO-Konzepte sind:

  • Klassen (Plan eines Objekts)
  • Objekte (Repräsentation einer Entität und des jeweiligen Grundbausteins)
  • Datenabstraktion (Verhalten einer Entität aus der echten Welt)
  • Verkapselung (Mechanismus, bei dem Daten zusammengefügt werden, um diese vor der Außenwelt zu verbergen)
  • Polymorphismus (Definiert den Mechanismus, der angewendet wird, um unterschiedliche Formen anzunehmen)
  • Vererbung (Der Mechanismus, bei dem neue Klassen aus einer vorhandenen erstellt werden)
  • Dynamische Bindung
  • Nachrichtenübermittlung

Die Klasse dient als Blaupause für die Abbildung realer Objekte in Softwareobjekte und beschreibt Attribute (Eigenschaften) und Methoden (Verhalten) des Objekts. Objekte sind Instanzen einer Klasse, die mit speziell definierten Daten erstellt wurden. Methoden sind innerhalb einer Klasse definierte Funktionen, die das Verhalten eines Objekts beschreiben. Jede in Klassendefinitionen enthaltene Methode beginnt mit einem Verweis auf ein Instanzobjekt. Attribute werden in der Klassenvorlage definiert und repräsentieren den Zustand eines Objekts. Das Ziel von OOP ist es, die Flexibilität und Wartbarkeit von Programmen zu erhöhen. OOP eignet sich besonders für große oder komplexe Softwareprojekte und hat gegenüber anderen Programmiermodellen folgende Vorteile: geringere Fehleranfälligkeit, gute Wiederverwendbarkeit und geringerer Wartungsaufwand.

Design Patterns sind wiederkehrende Muster in der Softwareentwicklung und stellen eine große Erleichterung in der Programmierarbeit dar. Begrifflich ist das Design Pattern zurückzuführen auf den Architekten Christopher Alexander. Zu unterscheiden sind grundsätzlich Strukturmuster, Verhaltensmuster und Erzeugungsmuster.

  • Strukturmuster oder Structural Pattern lassen sich verstehen als Entwurfsmuster für Klassenbeziehungen. Das Ziel ist eine Abstraktion, die imstande ist, mit anderen Lösungsansätzen zu kommunizieren. Dies ist insbesondere im Zusammenhang mit der Schnittstellen-Programmierung relevant.
  • Verhaltensmuster oder Behavioral Pattern modellieren das Verhalten der Software. Es handelt sich um Pattern zur Vereinfachung komplexer Steuerungs- und Kontrollprozesse. Zu diesem Zwecke ist es möglich, zwischen Algorithmen und Objekt-Verantwortlichkeiten zu wählen.
  •  Erzeugungsmuster oder Creational Pattern dienen der   Erzeugung von Objekten, die eine vereinfachte Darstellung der Prozesse für bestimmte Instanzen ermöglicht. Das geschieht von der Art der Objekterstellung in einer Software unabhängig.

Builder Pattern dienen der Trennung der Objekt-Entwicklung von ihren Repräsentationen. Factory Pattern erzeugen ein Objekt durch den Aufruf einer Methode. Das Singleton Pattern trägt es dazu bei, dass von einer Klasse nur exakt ein Objekt existiert. Das Composite Pattern ist ausgelegt auf dynamische Strukturen und kommt beispielsweise in der Dateiorganisation oder der Datenkompression zum Einsatz. Decorator Pattern integrieren zusätzliche Funktionalitäten beziehungsweise Zuständigkeiten in bestehende Klassen. Das Facade Pattern bietet eine Schnittstelle zu anderen Systemen und Untersystemen. Das Observer-Pattern leitet Änderungen an Objekten an Strukturen weiter. Strategy-Pattern dienen der Definition von Familien austauschbarer Algorithmen. Visitor-Pattern dienen dazu, ausführbare Operationen in einer Weise abzukapseln, dass neue Operationen möglich sind, ohne Veränderungen an den entsprechenden Klassen vorzunehmen.

Die Software-Qualitätssicherung (Quality Assurance - QA) oder auch Software-Qualitätsmanagement beinhaltet folgende Maßnahmen: Vorgabe von Code-Konventionen, regelmäßige Design- und Code-Reviews, Einsatz statischer Code-Analyse-Tools (diese Tools können den Quellcode scannen und nach Schwachstellen suchen und können den Source Code anhand der unternehmensspezifischen Projektspezifikationen validieren und sicherstellen, dass Projektanforderungen erfüllt werden. Ein bekannter Code-Analyse-Tool ist SonarQube. Zur QS gehört auch die Verwendung von Testautomatisierungstools (z.B. Selenium oder Postman), automatische Erstellung von Systemdokumentationen (z. B. mit Doxygen), Verwendung von Versionsverwaltungs-Tools und von Bugtracker (Fehler-Verfolgungs-Tools).