newcubator Logo
Entwickler transparente Retrospektive
Blog > Anwendung der SOLID-Prinzipien in Angular-Projekten: Ein Leitfaden für eine robuste Architektur

Anwendung der SOLID-Prinzipien in Angular-Projekten: Ein Leitfaden für eine robuste Architektur

Dennis, Kiya | 14.02.2024

Einleitung

Im dynamischen Bereich der Softwareentwicklung sind Prinzipien, die zu effizientem und wartbarem Code führen, von unschätzbarem Wert. Ein solches grundlegendes Konzept, das zur Verbesserung der Codequalität beiträgt, ist das SOLID-Prinzip. Speziell bei der Entwicklung mit Angular, einem der führenden Frameworks für Webanwendungen, ermöglicht die Anwendung dieser Prinzipien die Erstellung robuster, modularer und stark erweiterbarer Anwendungen.

In diesem Artikel werden die einzelnen SOLID-Prinzipien erläutert und konkrete Angular-Beispiele zum besseren Verständnis angeführt.

1. Prinzip der einzigen Verantwortung (SRP)

Durch die Einhaltung des SRP in Angular wird sichergestellt, dass jede Klasse oder Komponente nur eine einzige Verantwortung übernimmt. Zum Beispiel sollte ein AuthService ausschließlich für die Authentifizierung zuständig sein. Dies fördert eine klare Trennung von Belangen und erleichtert die Wartung und das Testen.

2. Offen/Geschlossen-Prinzip (OCP)

Das OCP fördert die Erweiterbarkeit von Klassen, ohne sie zu verändern. Ein Angular LoggerService könnte verschiedene Logger-Strategien implementieren, die durch Dependency Injection ausgetauscht werden können, ohne die Klasse selbst zu verändern. Dies erhöht die Flexibilität und Wiederverwendbarkeit des Codes.

3. Liskov-Substitutions-Prinzip (LSP)

Das LSP stellt sicher, dass Unterklassen die Funktionalität ihrer Elternklassen erweitern können, ohne bestehende Funktionalitäten zu beeinträchtigen. In Angular kann ein ExtendedService, der von einem BaseService erbt, zusätzliche Funktionen bereitstellen, während die Grundfunktionalität erhalten bleibt.

4. Schnittstellentrennung (ISP)

In Angular erfordert das ISP die Aufteilung von großen Schnittstellen in kleinere, spezifischere Schnittstellen. Dadurch wird verhindert, dass Klassen mit Methoden überladen werden, die sie nicht benötigen. Ein Beispiel wäre ein UserService, der in spezifische Schnittstellen wie UserAuthentication und UserDataManagement aufgeteilt ist.

5. Abhängigkeitsumkehr (DIP)

Das DIP schreibt vor, dass Abhängigkeiten auf Abstraktionen und nicht auf Konkretisierungen beruhen sollten. Eine BookComponent sollte eher von einem abstrakten BookService als von einer spezifischen Implementierung abhängen, was die Kopplung reduziert und die Testbarkeit verbessert.

Schlussfolgerung

Die Anwendung der SOLID-Prinzipien in Angular-Projekten ermöglicht es Entwicklern, Systeme zu erstellen, die funktional und anpassungsfähig, wartbar und erweiterbar sind. Die Einhaltung dieser Prinzipien kann die Codequalität erheblich verbessern, was zu erfolgreichen, nachhaltigen Softwareprojekten führt. Angesichts der ständigen Weiterentwicklung der Softwareentwicklung bietet die Einhaltung dieser Prinzipien eine solide Grundlage für die Bewältigung künftiger Herausforderungen.

Im weiteren Verlauf dieses Blogs wird jedes Prinzip anhand von Codebeispielen erläutert, um ein praktisches Verständnis zu ermöglichen.

Prinzip der einzelnen Verantwortung (SRP)

Ein AuthService ist nur für die Authentifizierung zuständig:

@Injectable() export class AuthService { constructor(private httpClient: HttpClient) {} login(username: string, password: string): Observable<User> { // Implementierung der Login-Logik } logout(): void { // Implementierung der Login-Logik } }

Offen/Geschlossen-Prinzip (OCP)

Ein LoggerService, der verschiedene Logger-Strategien unterstützt:

@Injectable() export class LoggerService { private loggerStrategy: LoggerStrategy; constructor() { this.loggerStrategy = new ConsoleLogger(); // Standardstrategie } setStrategy(strategy: LoggerStrategy) { this.loggerStrategy = strategy; } log(message: string) { this.loggerStrategy.log(message); } } interface LoggerStrategy { log(message: string): void; } class ConsoleLogger implements LoggerStrategy { log(message: string) { console.log(message); } }

Liskov-Substitutions-Prinzip (LSP)

Erweiterung eines Basisdienstes durch Vererbung:

class BaseService { getData(): any { // Grundlegende Implementierung } } @Injectable() export class ExtendedService extends BaseService { getData(): any { let data = super.getData(); // Erweiterte Logik return data; } }

Prinzip der Schnittstellentrennung (ISP)

Trennung der Benutzerfunktionen in spezifische Schnittstellen:

interface UserAuthentication { login(user: string, password: string): Observable<User>; } interface UserDataManagement { getUserData(userId: number): Observable<UserData>; } @Injectable() export class UserService implements UserAuthentication, UserDataManagement { login(user: string, password: string): Observable<User> { // Logik für die Anmeldung } getUserData(userId: number): Observable<UserData> { // Abrufen von Benutzerdaten } }

Prinzip der Umkehrung von Abhängigkeiten (DIP)

Eine BookComponent hängt von einem abstrakten BookService ab:

abstract class BookService { abstract getBooks(): Observable<Book[]>; } @Injectable() export class ConcreteBookService extends BookService { getBooks(): Observable<Book[]> { // Spezifische Umsetzung } } @Component({ selector: 'app-book', template: `...` }) export class BookComponent { books: Book[]; constructor(private bookService: BookService) { this.bookService.getBooks().subscribe(books => this.books = books); } }
Inhalt
  • Was ist das SOLID-Prinzip in der Softwareentwicklung?
  • Wie funktionieren die SOLID-Prinzipien in Angular-Projekten?
  • Was sind die Anwendungen und Vorteile der einzelnen SOLID-Prinzipien in Angular?
Dennis Hundertmark
Dennis (Softwareentwickler)

Als Frontend-Experte und Angular-Enthusiast gestalte ich Webanwendungen, die Technik und Design gekonnt zusammenführen. Meine Stärke liegt in der Entwicklung benutzerzentrierter Lösungen, die sowohl f... mehr anzeigen

Gitlab
Gesicht von Kiya,- unsere KI Mitarbeiterin
Kiya

... ist unsere engagierte und leidenschaftliche Künstliche Intelligenz und Expertin für Softwareentwicklung. Mit einem unermüdlichen Interesse für technologische Innovationen bringt sie Enthusiasmus u... mehr anzeigen

Standort Hannover

newcubator GmbH
Bödekerstraße 22
30161 Hannover

Standort Dortmund

newcubator GmbH
Westenhellweg 85-89
44137 Dortmund