Ein C# .NET 8.0 Projekt mit praktischen Übungen zu den SOLID-Prinzipien der objektorientierten Programmierung.
Dieses Repository enthält sechs verschiedene Übungen, die jeweils eines der SOLID-Prinzipien demonstrieren. Jede Übung zeigt sowohl die problematische Implementierung als auch die verbesserte Lösung nach den SOLID-Prinzipien.
- S - Single Responsibility Principle (SRP)
- O - Open/Closed Principle (OCP)
- L - Liskov Substitution Principle (LSP)
- I - Interface Segregation Principle (ISP)
- D - Dependency Inversion Principle (DIP)
- .NET 8.0 SDK oder höher
- Visual Studio 2022 oder Visual Studio Code
- C# Entwicklungsumgebung
Problem: Die Exersise1_Invoice Klasse hat mehrere Verantwortlichkeiten - Rechnung generieren, speichern und drucken.
Lösung: Aufteilen in separate Klassen:
InvoiceService- Rechnung generierenInvoiceRepository- Rechnung speichernInvoicePrintPdfService- Rechnung drucken
Dateien:
Exersise1/Exersise1.cs(Problem)Exersise1/InvoiceService.cs(Lösung)Exersise1/InvoiceRepository.cs(Lösung)Exersise1/InvoicePrintPDFService.cs(Lösung)
Problem: Die Exersise2_ShapeAreaCalculator Klasse muss für jede neue Form modifiziert werden.
Lösung: Verwendung von Interfaces und Polymorphismus:
IShapeInterface mitCalculateArea()Methode- Jede Form implementiert
IShape ShapeAreaCalculatorarbeitet mit dem Interface
Dateien:
Exersise2/Exersise2.cs(Problem)Exersise2/IShape.cs(Lösung)Exersise2/Circle.cs,Rectangle.cs,Square.cs(Implementierungen)Exersise2/ShapeAreaCalculator.cs(Verbesserte Lösung)
Problem: Die Exersise3_DiscountCalculator Klasse verwendet String-Vergleiche für verschiedene Kundentypen.
Lösung: Vererbungshierarchie mit korrekter Substitution:
ICustomerTypeInterfaceRegularCustomer,PremiumCustomer,NoDiscountCustomerImplementierungenCustomerTypeFactoryfür Objekterstellung
Dateien:
Exersise3/Exersise3.cs(Problem)Exersise3/ICustomerType.cs(Interface)Exersise3/RegularCustomer.cs,PremiumCustomer.cs(Implementierungen)Exersise3/DiscountCalculator.cs(Verbesserte Lösung)
Problem: Die Exersise4_ElectricEngine Klasse verletzt LSP durch Werfen einer Exception.
Lösung: Korrekte Vererbungshierarchie:
BirdBasisklasseIFlyableInterface für flugfähige VögelEagleimplementiertIFlyablePenguinimplementiert nurBird
Dateien:
Exersise4/Exersise4.cs(Problem)Exersise4/Bird.cs,IFlyable.cs(Lösung)Exersise4/Eagle.cs,Penguin.cs(Implementierungen)
Problem: Das Exersise5_IDevice Interface zwingt Klassen dazu, Methoden zu implementieren, die sie nicht benötigen.
Lösung: Aufteilen in spezifische Interfaces:
IPrintDevice- für DruckfunktionalitätIScanDevice- für ScanfunktionalitätIFaxDevice- für Faxfunktionalität
Dateien:
Exersise5/Exersise5.cs(Problem)Exersise5/IPrintDevice.cs,IScanDevice.cs,IFaxDevice.cs(Spezifische Interfaces)Exersise5/SimplePrinter.cs(Implementierung)
Problem: Die Exersise6_OrderService Klasse ist direkt von einer konkreten Datenbankimplementierung abhängig.
Lösung: Abhängigkeiten umkehren durch Interfaces:
IOrderRespositoryInterface definierenOrderRepositoryimplementiert das InterfaceOrderServiceverwendet Dependency Injection
Dateien:
Exersise6/Exersise6.cs(Problem)Exersise6/IOrderRespository.cs(Interface)Exersise6/OrderRepository.cs(Implementierung)Exersise6/OrderService.cs(Verbesserte Lösung)
SolidExcersises/
├── SolidExcersises.sln
├── SolidExcersises/
│ ├── SolidExcersises.csproj
│ ├── Program.cs
│ ├── Exersise1/ # Single Responsibility Principle
│ ├── Exersise2/ # Open/Closed Principle
│ ├── Exersise3/ # Liskov Substitution Principle
│ ├── Exersise4/ # Liskov Substitution Principle (Vererbung)
│ ├── Exersise5/ # Interface Segregation Principle
│ └── Exersise6/ # Dependency Inversion Principle